Доступ к MMU/TLB при загрузке на Microblaze

Я пытаюсь настроить TLB на Microblaze (фактически имитируемый на 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?

1 ответ

Решение

Проблема в том, что вы устанавливаете неправильный бит. Многие справочные руководства, описывающие архитектуру BigEndian, предполагают, что бит № 31 равен 2^0, а бит № 0 равен 2^31. Руководство MicroBlaze является одним из тех, кто использует эту запутанную запись.

В вашем случае, если вы хотите установить бит VM (BigEndian bit 18), вам нужно установить msr в 0x00002000 или же 1 << (31-18),

Итак, в основном меняется строка:

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

должно заставить все работать.

Другие вопросы по тегам