Доступ к 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
должно заставить все работать.