^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) =============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) MMUv3 initialization sequence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) =============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) The code in the initialize_mmu macro sets up MMUv3 memory mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) identically to MMUv2 fixed memory mapping. Depending on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX symbol this code is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) located in addresses it was linked for (symbol undefined), or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) (symbol defined), so it needs to be position-independent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) The code has the following assumptions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) - This code fragment is run only on an MMU v3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) - TLBs are in their reset state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) - ITLBCFG and DTLBCFG are zero (reset state).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) - RASID is 0x04030201 (reset state).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) - PS.RING is zero (reset state).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) - LITBASE is zero (reset state, PC-relative literals); required to be PIC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) TLB setup proceeds along the following steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) Legend:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) - VA = virtual address (two upper nibbles of it);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) - PA = physical address (two upper nibbles of it);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) - pc = physical range that contains this code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) After step 2, we jump to virtual address in the range 0x40000000..0x5fffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) or 0x00000000..0x1fffffff, depending on whether the kernel was loaded below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 0x40000000 or above. That address corresponds to next instruction to execute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) in this code. After step 4, we jump to intended (linked) address of this code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) The scheme below assumes that the kernel is loaded below 0x40000000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ====== ===== ===== ===== ===== ====== ===== =====
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) - Step0 Step1 Step2 Step3 Step4 Step5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) VA PA PA PA PA VA PA PA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ====== ===== ===== ===== ===== ====== ===== =====
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) E0..FF -> E0 -> E0 -> E0 F0..FF -> F0 -> F0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) C0..DF -> C0 -> C0 -> C0 E0..EF -> F0 -> F0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) A0..BF -> A0 -> A0 -> A0 D8..DF -> 00 -> 00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 80..9F -> 80 -> 80 -> 80 D0..D7 -> 00 -> 00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 60..7F -> 60 -> 60 -> 60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 40..5F -> 40 -> pc -> pc 40..5F -> pc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 20..3F -> 20 -> 20 -> 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 00..1F -> 00 -> 00 -> 00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ====== ===== ===== ===== ===== ====== ===== =====
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) The default location of IO peripherals is above 0xf0000000. This may be changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) using a "ranges" property in a device tree simple-bus node. See the Devicetree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) Specification, section 4.5 for details on the syntax and semantics of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) simple-bus nodes. The following limitations apply:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 1. Only top level simple-bus nodes are considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 2. Only one (first) simple-bus node is considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 3. Empty "ranges" properties are not supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 4. Only the first triplet in the "ranges" property is considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 5. The parent-bus-address value is rounded down to the nearest 256MB boundary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 6. The IO area covers the entire 256MB segment of parent-bus-address; the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) "ranges" triplet length field is ignored
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) MMUv3 address space layouts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ============================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) Default MMUv2-compatible layout::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) Symbol VADDR Size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) | Userspace | 0x00000000 TASK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) +------------------+ 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) +------------------+ 0x8e400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) | VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) +------------------+ VMALLOC_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) | Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) | remap area 1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) | remap area 2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) | KMAP area | PKMAP_BASE PTRS_PER_PTE *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) | | (4MB * DCACHE_N_COLORS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) | | NR_CPUS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) +------------------+ FIXADDR_TOP 0xcffff000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xd0000000 128MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xd8000000 128MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 256MB cached + 256MB uncached layout::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) Symbol VADDR Size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) | Userspace | 0x00000000 TASK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) +------------------+ 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) +------------------+ 0x8e400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) | VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) +------------------+ VMALLOC_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) | Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) | remap area 1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) | remap area 2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) | KMAP area | PKMAP_BASE PTRS_PER_PTE *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) | | (4MB * DCACHE_N_COLORS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) | | NR_CPUS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) +------------------+ FIXADDR_TOP 0xaffff000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xb0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 512MB cached + 512MB uncached layout::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) Symbol VADDR Size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) | Userspace | 0x00000000 TASK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) +------------------+ 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) | Page table | XCHAL_PAGE_TABLE_VADDR 0x80000000 XCHAL_PAGE_TABLE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) | KASAN shadow map | KASAN_SHADOW_START 0x80400000 KASAN_SHADOW_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) +------------------+ 0x8e400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) | VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) +------------------+ VMALLOC_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) | Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) | remap area 1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) | remap area 2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) | KMAP area | PKMAP_BASE PTRS_PER_PTE *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) | | (4MB * DCACHE_N_COLORS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) | Atomic KMAP area | FIXADDR_START KM_TYPE_NR *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) | | NR_CPUS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) | | DCACHE_N_COLORS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) | | PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) +------------------+ FIXADDR_TOP 0x9ffff000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) | Cached KSEG | XCHAL_KSEG_CACHED_VADDR 0xa0000000 512MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) | Uncached KSEG | XCHAL_KSEG_BYPASS_VADDR 0xc0000000 512MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) | Cached KIO | XCHAL_KIO_CACHED_VADDR 0xe0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) +------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) | Uncached KIO | XCHAL_KIO_BYPASS_VADDR 0xf0000000 256MB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) +------------------+