0

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

4

1 回答 1

1

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

在您的情况下,如果您想设置位 VM(BigEndian 位 18),您需要设置msr0x00002000or 1 << (31-18)

所以基本上换行:

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

应该使一切正常。

于 2014-11-14T00:25:35.273 回答