Memory layout: Difference between revisions
No edit summary |
No edit summary |
||
Line 61: | Line 61: | ||
| ? | | ? | ||
|} | |} | ||
= Kernel = | |||
Granule size for TTBR0*_EL1 is 4KB. | |||
TTBR0_EL1 vmem starts at vaddr 0x0. | |||
vmem end-addr for TTBR1_EL1 is 0xffffffffffffffff. vmem start-addr for TTBR1_EL1 is 0xFFFFFFF000000000. | |||
T0SZ = 31. Hence, bit-size of the TTBR0*_EL1 vmem region is 33. (0x0000000200000000) | |||
T1SZ = 28. Hence, bit-size of the TTBR1*_EL1 vmem region is 36. (0x0000001000000000) | |||
Note: ARM config for TTBR0 is presumably configured for userland later. | |||
See arm-doc for "Table D4-25 Translation table entry addresses when using the 4KB translation granule". | |||
See arm-doc for "Overview of VMSAv8-64 address translation using the 4KB translation granule". | |||
See arm-doc for "Table D4-11 TCR.TnSZ values and IA ranges, 4K granule with no concatenation of tables". | |||
Both TTBR*_EL1 use "Initial lookup level" 1. Therefore, the TTBR*_EL1 tables are level1. | |||
Due to T*SZ, Stage1/Stage2 translation for the initial table(level1) are the same, except Stage2 uses hard-coded T0SZ. | |||
Basically, the table is accessed as: ((u64*)tablebase)[<IA[y:30]>], where y = (37-T*SZ)+26. That is, starting at bit "y" ending(inclusive) at bit30. For TTBR0*_EL1, y = 32, while for TTBR1_EL1 y = 35. | |||
Hence, for TTBR0, index=((vaddr>>30) & 0x7), and for TTBR1, index=((vaddr>>30) & 0x3f). | |||
== [[2.0.0]] == |