We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I am doing an MMU experiment with Raspberry Pi 3B (Quad core Cortex A53) board. The board starts in EL2. From EL2, the stage-2 MMU is configured. It is configured to have a one-to-one mapping (that is Intermediate Physical Address and Physical Address are same). The code in EL2 is continuing to execute after the MMU is enabled (HCR_EL2.VM=1). But when the code switches to EL1 (After ERET instruction), the memory contains random data. If I inspect the memory before ERET, using a debugger, it contains valid code. May I know the reason for this?
The page table configuration uses 64KB granule. The Level-2 table entries points to 512MB blocks. For reference, the important steps of my configuration is given below. Any hint is greatly appreciated.
ldr x1, =tt_s2_l1_base msr vttbr_el2, x1 movz x0, 0x755c movk x0, 0x0001, lsl 16 //64KB granule, 512MB block msr vtcr_el2, x0 ldr x1, =tt_s2_l1_base // Address of L1 table movz x0,0x0000 orr x0, x0, 0x01 orr x0, x0, 0xc0 orr x0, x0, 0x400 orr x0, x0, 0x300 str x0, [x1] //first page table entry configuration dsb SY msr sctlr_el1, xzr isb tlbi VMALLE1 dsb SY isb mrs x0, hcr_el2 orr x0, x0, #0x1 //enable stage-2 address translation orr x0, x0, #(1<<31) // RW=1 EL1 Execution state is AArch64. msr hcr_el2, x0 movz x2, 0x03c5 //DAIF masked movk x2, 0x0000, lsl #16 msr spsr_el2, x2 //Saved program status register movz x0, 0x0000 movk x0, 0x100, lsl #16 msr elr_el2, x0 isb dsb SY eret