在Microblaze上启动时访问MMU / TLB

时间:2014-11-13 22:08:59

标签: assembly memory-management tlb microblaze

我正在寻求在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

以下一行按照您的预期更新r10x00040000

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

1 个答案:

答案 0 :(得分:1)

问题是你设置了错误的位。许多描述BigEndian架构的参考指南假设位#31是2 ^ 0而位#0是2 ^ 31。 MicroBlaze手册是使用这种令人困惑的符号的人之一。

在您的情况下,如果要设置VM位(BigEndian位18),则需要将msr设置为0x000020001 << (31-18)

所以基本上改变了行:

ori r1, r1, 0x00002000
mts rmsr, r1
nop

应该让一切顺利。