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.
Hi ARM folks, hoping someone can show me where I'm going wrong programming the MMU. The ESR_EL1 reports that it is a Permission fault, level 2. Here's what I'm trying to accomplish:
4GiB space, 4kiB granule flat identity mapped, divided like this:
0->1GiB: normal RAM (only 1G of RAM on this machine)
1->4GiB: device memory
And the normal RAM segment is to be divided into 512 x 2MB pages in a L2 table. My configuration is below. Any tips on what I'm doing wrong or how to debug is greatly appreciated!
PE State
-------------
EL1H
Registers
ESR_EL1 = 0x8600000E -> MMU fault, Permission fault, level 2
SCTLR_EL1 = 0xC00801 -> just RESVD1 bits and MMU enable bit set
TTBR0_EL1 = 0x8E000 -> base address 0 for translation tables
TTBR1_EL1 = 0x8E000 -> base address 1 for translation tables
TCR_EL1 = 0x35203520 -> 4GiB space, 4kiB granule inner shareable normal inner/outer cacheable for both TTBR0 and TTBR1
MAIR_EL1 = 0xffffffffff440400 -> ATTR0=device ATTR1=device ATTR2=normal non-cacheable ATTR3-ATTR7=normal cacheable
1st Level Table @ 0x8E000 (dumped with GDB)
--------------
0x8e000: 0x8f003 -> table pointer to next level table, table is 512 x 2MiB entries
0x8e008: 0x40000741 -> 1GiB device mem @ 0x40000000
0x8e010: 0x80000741 -> 1GiB device mem @ 0x80000000
0x8e018: 0xc0000741 -> 1GiB device mem @ 0xC0000000
1st Level Table @ 0x8F000 (dumped with GDB, truncated)
0x8f000: 0x74d
0x8f008: 0x20074d
0x8f010: 0x40074d
0x8f018: 0x60074d
0x8f020: 0x80074d
0x8f028: 0xa0074d
0x8f030: 0xc0074d
0x8f038: 0xe0074d
0x8f040: 0x100074d
... truncated ...
Adapted from: http://infocenter.arm.com/help/topic/com.arm.doc.dai0527a/DAI0527A_baremetal_boot_code_for_ARMv8_A_processors.pdf
Using openocd's virt2phys function I can see that my mappings are working as expected for normal and device mem, and thay unmapped areas fail at stage 1 as expected:
> virt2phys 0x82c30
Outer shareable, Not Secure
Normal Memory
Physical address 0x00082c30
> virt2phys 0x41000000
Device Memory
Physical address 0x41000000
> virt2phys 0x81000000
Physical address 0x81000000
> virt2phys 0xC0000000
Physical address 0xc0000000
> virt2phys 0xC0000001
Physical address 0xc0000001
> virt2phys 0x1F0000000
Address translation failed at stage 1, FST=4, PTW=0
This topic might be of some help.