Код
mov r0, #4 /* writethrough cache policy */
mcr p15, 7, r0, c15, c0, 0
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
mcr p15, 0, r0, c8, c7, 0 /* flush I,D TLBs */
ldr r1, =BOOT_PGD_PHYS
mcr p15, 0, r1, c2, c0, 0 /* load page table pointer */
mov r0, #-1
mcr p15, 0, r0, c3, c0 /* load domain access register */
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x1000 /* I-cache enable */
orr r0, r0, #0x003d /* Write buffer, mmu */
mcr p15, 0, r0, c1, c0, 0
mcr p15, 7, r0, c15, c0, 0
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
mcr p15, 0, r0, c8, c7, 0 /* flush I,D TLBs */
ldr r1, =BOOT_PGD_PHYS
mcr p15, 0, r1, c2, c0, 0 /* load page table pointer */
mov r0, #-1
mcr p15, 0, r0, c3, c0 /* load domain access register */
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x1000 /* I-cache enable */
orr r0, r0, #0x003d /* Write buffer, mmu */
mcr p15, 0, r0, c1, c0, 0
Таблцы второго уровня fine page table - 1024 pte, страницы памяти tiny pages - 1024 байт. После включения MMU полет нормальный, ремап памяти проходит, но дело доходит до создания нового потока - копируются часть таблицы с системными данными, ремапится таблица векторов исключений в новую таблицу и в регистр ttb заносится адрес новой таблицы
Код
ENTRY(switch_ttb)
mov ip, #0
mcr p15, 0, ip, c7, c5, 0 /* flush I cache */
mcr p15, 0, ip, c7, c6, 0 /* flush D cache */
mcr p15, 0, ip, c7, c10, 4 /* drain the write buffer */
mcr p15, 0, r0, c2, c0, 0 /* set the new TTB */
mcr p15, 0, ip, c8, c7, 0 /* and flush the I+D tlbs */
nop
nop
nop
mov pc, lr
mov ip, #0
mcr p15, 0, ip, c7, c5, 0 /* flush I cache */
mcr p15, 0, ip, c7, c6, 0 /* flush D cache */
mcr p15, 0, ip, c7, c10, 4 /* drain the write buffer */
mcr p15, 0, r0, c2, c0, 0 /* set the new TTB */
mcr p15, 0, ip, c8, c7, 0 /* and flush the I+D tlbs */
nop
nop
nop
mov pc, lr
Проблема в том что после переключения регистра ttb, таблицы страниц оказываются нарушенными, причем частично - код работает - то есть системные страницы на месте но например вектора исключений по 0 адресу недоступны так же и часть памяти которая до переключения была смапена и таблицы были в порядке. Что интересно - в эмуляторе qemu все работает замечательно... Если кто встречался с такой ситуацией - есть ли какие мысли, что я мог упустить или на что обратить внимание ?