我正在寻求在Microblaze上设置TLB(实际上在OVP上模拟),并将C_USE_MMU
设置为3
。
这是我的启动代码:
.global _start
.section .vectors.reset, "ax"
.align 2
.ent _start
.type _start, @function
_start:
brai _actualstart
.end _start
....
.section .text
.global _actualstart
.align 4
.ent _actualstart
.type _actualstart, @function
_actualstart:
mfs r1, rmsr
nop
ori r1, r1, 0x00040000
mts rmsr, r1
nop
addik r3, r0, 0x3F /* Microblaze TLB has 64 entries */
_zeroouttlb:
mts rtlbx, r3
mts rtlbhi, r0
mts rtlblo, r0
bgtid r3, _zeroouttlb /* Uses delay slot */
addik r3, r3, -1
以下一行按照您的预期更新r1
至0x00040000
:
ori r1, r1, 0x00040000
但是在下一行:
mts rmsr, r1
msr
的值保持不变,因此代码继续失败:
mts rtlbhi, r0
使用:
Fatal (MB_TLB) Attempting Write to TLBHI when no MMU available
(由于msr
尚未更新,因此仍会显示0x00000000
,因此处理器在评估没有可用的MMU支持时是正确的。
为什么我的代码不会更新msr
?
答案 0 :(得分:1)
问题是你设置了错误的位。许多描述BigEndian架构的参考指南假设位#31是2 ^ 0而位#0是2 ^ 31。 MicroBlaze手册是使用这种令人困惑的符号的人之一。
在您的情况下,如果要设置VM位(BigEndian位18),则需要将msr
设置为0x00002000
或1 << (31-18)
。
所以基本上改变了行:
ori r1, r1, 0x00002000
mts rmsr, r1
nop
应该让一切顺利。