Changeset 8a9a41e in mainline for boot/arch/arm64/src/asm.S
- Timestamp:
- 2021-10-24T08:28:43Z (4 years ago)
- Children:
- 9ea3a41
- Parents:
- 2ce943a (diff), cd981f2a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Erik Kučák <35500848+Riko196@…> (2021-10-24 08:28:43)
- git-committer:
- GitHub <noreply@…> (2021-10-24 08:28:43)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm64/src/asm.S
r2ce943a r8a9a41e 33 33 .section BOOTSTRAP 34 34 35 #define DIRECTORY_ENTRIES 16 36 35 37 /* MS-DOS stub */ 36 38 msdos_stub: … … 51 53 .long 0 /* Number of symbols */ 52 54 .short sec_table - opt_header /* Size of optional header */ 53 /* Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE | 54 * IMAGE_FILE_LARGE_ADDRESS_AWARE */ 55 /* 56 * Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE | 57 * IMAGE_FILE_LARGE_ADDRESS_AWARE 58 */ 55 59 .short 0x22 56 60 … … 87 91 .quad 0 /* Size of heap commit */ 88 92 .long 0 /* Loader flags */ 89 .long 0 /* Number of RVA and sizes */ 93 .long DIRECTORY_ENTRIES /* Number of RVA and sizes */ 94 .space DIRECTORY_ENTRIES * 8 /* Directory entries */ 90 95 91 96 sec_table: 92 97 .ascii ".text\x0\x0\x0" /* Name */ 93 98 .long payload_end - start /* Virtual size */ 94 99 .long start - msdos_stub /* Virtual address */ … … 99 104 .short 0 /* Number of relocations */ 100 105 .short 0 /* Number of line numbers */ 101 /* Characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | 102 * IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE */ 106 /* 107 * Characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | 108 * IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE 109 */ 103 110 .long 0xe0000020 104 111 112 /** Boot loader entry point 113 * 114 * @param x0 UEFI image handle. 115 * @param x1 Pointer to the UEFI system table. 116 * 117 */ 105 118 SYMBOL(start) 106 119 .hidden start 107 120 108 121 /* 109 * Parameters: 110 * x0 is the image handle. 111 * x1 is a pointer to the UEFI system table. 112 */ 113 114 /* 115 * Stay on the UEFI stack. Its size is at least 128 kB, plenty for this 122 * Stay on the UEFI stack. Its size is at least 128 KiB, plenty for this 116 123 * boot loader. 117 124 */ … … 128 135 add x1, x1, #:lo12:_DYNAMIC 129 136 bl self_relocate 130 cbnz x0, 0f 137 cbnz x0, __uefi_exit 138 139 /* 140 * Flush the instruction cache of the relocated boot loader image. 141 */ 142 adr x0, msdos_stub 143 adrp x1, payload_end 144 sub x1, x1, x0 145 bl smc_coherence 131 146 132 147 /* … … 138 153 bl bootstrap 139 154 140 0:141 ldp x29, x30, [sp], #32142 ret155 __uefi_exit: 156 ldp x29, x30, [sp], #32 157 ret 143 158 144 159 FUNCTION_BEGIN(halt) … … 148 163 FUNCTION_END(halt) 149 164 165 /** Flush instruction caches 166 * 167 * @param x0 Starting address of the flushing. 168 * @param x1 Number of bytes to flush. 169 * 170 */ 171 FUNCTION_BEGIN(smc_coherence) 172 .hidden smc_coherence 173 174 /* Initialize loop */ 175 mov x9, x0 176 mov x10, xzr 177 178 __dc_loop: 179 /* Data or Unified Cache Line Clean */ 180 dc cvau, x9 181 add x9, x9, #4 182 add x10, x10, #4 183 cmp x10, x1 184 blo __dc_loop 185 186 dsb ish 187 188 /* Initialize loop */ 189 mov x9, x0 190 mov x10, xzr 191 192 __ic_loop: 193 /* Instruction Cache Line Invalidate */ 194 ic ivau, x9 195 add x9, x9, #4 196 add x10, x10, #4 197 cmp x10, x1 198 blo __ic_loop 199 200 dsb ish 201 isb 202 ret 203 FUNCTION_END(smc_coherence) 204 205 /** Flush data caches 206 * 207 * @param x0 Starting address of the flushing. 208 * @param x1 Number of bytes to flush. 209 * 210 */ 211 FUNCTION_BEGIN(dcache_flush) 212 .hidden dcache_flush 213 214 mov x9, x0 215 mov x10, xzr 216 217 __dc_flush_loop: 218 /* Data or Unified Cache Line Clean */ 219 dc cvau, x9 220 add x9, x9, #4 221 add x10, x10, #4 222 cmp x10, x1 223 blo __dc_flush_loop 224 225 dsb ish 226 isb 227 ret 228 FUNCTION_END(dcache_flush) 229 230 /** Kernel entry 231 * 232 * @param x0 Kernel entry point. 233 * @param x1 Pointer to the bootinfo structure. 234 * 235 */ 150 236 FUNCTION_BEGIN(jump_to_kernel) 151 237 .hidden jump_to_kernel 152 238 153 /* 154 * Parameters: 155 * x0 is kernel entry point. 156 * x1 is pointer to the bootinfo structure. 157 */ 158 159 /* Disable MMU (removes the identity mapping provided by UEFI). */ 160 mrs x2, sctlr_el1 161 bic x2, x2, #SCTLR_M_FLAG 162 msr sctlr_el1, x2 163 isb 164 165 br x0 239 mrs x9, CurrentEL 240 lsr x9, x9, 2 241 242 cmp x9, #3 243 b.eq __el3 244 245 cmp x9, #2 246 b.eq __el2 247 248 cmp x9, #1 249 b.eq __el1 250 251 b halt 252 253 __el3: 254 msr sctlr_el2, xzr 255 msr hcr_el2, xzr 256 isb 257 258 /* EL2 is AArch64, EL1 is Non-secure World */ 259 mov x9, #(1 << 10) 260 orr x9, x9, #(1 << 0) 261 msr scr_el3, x9 262 isb 263 264 /* EL2h */ 265 mov x9, #0x9 266 msr spsr_el3, x9 267 isb 268 269 adr x9, __el2 270 msr elr_el3, x9 271 isb 272 273 /* Switch to EL2 */ 274 eret 275 276 __el2: 277 msr sctlr_el1, xzr 278 isb 279 280 /* EL1 is AArch64 */ 281 mov x9, #(1 << 31) 282 msr hcr_el2, x9 283 isb 284 285 /* EL1h */ 286 mov x9, #0x5 287 msr spsr_el2, x9 288 isb 289 290 adr x9, __el1 291 msr elr_el2, x9 292 isb 293 294 /* Switch to EL1 */ 295 eret 296 297 __el1: 298 /* Do not trap on FPU instructions */ 299 mrs x9, cpacr_el1 300 orr x9, x9, #(3 << 20) 301 msr cpacr_el1, x9 302 dmb ish 303 304 /* Disable MMU (removes the identity mapping provided by UEFI) */ 305 mrs x9, sctlr_el1 306 bic x9, x9, #SCTLR_M_FLAG 307 msr sctlr_el1, x9 308 isb 309 310 br x0 166 311 FUNCTION_END(jump_to_kernel)
Note:
See TracChangeset
for help on using the changeset viewer.