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]] == |