我在移植一个简单内核到龙芯架构上时遇到了问题,希望帮忙看一下。
参考linux移植一个简单系统到龙芯上,平台选用的是qemu-system-loongarch64。在设置完PGD之后刷新TLB,发现执行了刷新TLB的指令后会卡住。执行的指令如下:
void local_flush_tlb_all(void)
{
invtlb_all(INVTLB_CURRENT_ALL, 0, 0);
}
其中invtlb_all
的实现为:
/**
* invtlb_all - invtlb op 0 0
*/
static inline void invtlb_all(uint32_t op, uint32_t info, uint64_t addr)
{
__asm__ __volatile__(
".word ((0x6498000) | (0 << 10) | (0 << 5) | %0)\n\t"
:
: "i"(op)
:
);
}
我打印了一个函数地址和一个运行时PC地址,是在0x9000窗口内:


下面是我tlb_init
的流程:

我认为运行地址是在0x9000窗口内,应该不会触发TLB充填例外,也许是我设置错误或者理解错误,遇到这样的情况需要考虑哪些方面呢?
感谢看完上面的内容,期待大佬们的回复。