File indexing completed on 2025-05-11 08:24:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #ifdef HAVE_CONFIG_H
0041 #include "config.h"
0042 #endif
0043
0044 #include <rtems/asm.h>
0045
0046 .extern _AArch64_Exception_default
0047
0048 .globl bsp_start_vector_table_begin
0049 .globl bsp_start_vector_table_end
0050 .globl bsp_start_vector_table_size
0051 .globl bsp_vector_table_size
0052
0053 .section ".text"
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 .macro JUMP_HANDLER
0076
0077 mov x0, #0x7f
0078
0079 bic x0, lr, x0
0080
0081 ldr x0, [x0, #0x78]
0082
0083
0084
0085
0086 blr x0
0087
0088 ldp x0, lr, [sp], #0x10
0089
0090 eret
0091 nop
0092 nop
0093 nop
0094 nop
0095 nop
0096 nop
0097 nop
0098 nop
0099 nop
0100 nop
0101 nop
0102 nop
0103 nop
0104 nop
0105 nop
0106 nop
0107 nop
0108 nop
0109 nop
0110 nop
0111 nop
0112 nop
0113 .endm
0114
0115 .macro JUMP_TARGET_SP0
0116
0117 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0118 .word .print_exception_dump_sp0
0119 .word 0x0
0120 #else
0121 .dword .print_exception_dump_sp0
0122 #endif
0123 .endm
0124
0125 .macro JUMP_TARGET_SPx
0126
0127 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0128 .word .print_exception_dump_spx
0129 .word 0x0
0130 #else
0131 .dword .print_exception_dump_spx
0132 #endif
0133 .endm
0134
0135 bsp_start_vector_table_begin:
0136 .balign 0x800
0137 Vector_table_el3:
0138
0139
0140
0141
0142 curr_el_sp0_sync:
0143 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0144 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0145 bl .push_exception_context_start
0146
0147 add x0, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0148
0149 bl .push_exception_context_finish
0150
0151 bl curr_el_sp0_sync_get_pc
0152 curr_el_sp0_sync_get_pc:
0153 mov x0, #0x7f
0154 bic x0, lr, x0
0155 ldr x1, [x0, #0x78]
0156 and lr, lr, #0x780
0157 lsr lr, lr, #7
0158
0159 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_VECTOR_OFFSET]
0160 mov x0, sp
0161 blr x1
0162 b twiddle
0163 nop
0164 nop
0165 nop
0166 nop
0167 nop
0168 nop
0169 nop
0170 nop
0171 nop
0172 nop
0173 nop
0174 nop
0175 nop
0176 nop
0177 nop
0178
0179 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0180 .word _AArch64_Exception_default
0181 .word 0x0
0182 #else
0183 .dword _AArch64_Exception_default
0184 #endif
0185 .balign 0x80
0186
0187 curr_el_sp0_irq:
0188 stp x0, lr, [sp, #-0x10]!
0189 bl curr_el_sp0_irq_get_pc
0190 curr_el_sp0_irq_get_pc:
0191 JUMP_HANDLER
0192 JUMP_TARGET_SP0
0193 .balign 0x80
0194
0195 curr_el_sp0_fiq:
0196 stp x0, lr, [sp, #-0x10]!
0197 bl curr_el_sp0_fiq_get_pc
0198 curr_el_sp0_fiq_get_pc:
0199 JUMP_HANDLER
0200 JUMP_TARGET_SP0
0201 .balign 0x80
0202
0203
0204
0205
0206 curr_el_sp0_serror:
0207 stp x0, lr, [sp, #-0x10]!
0208 bl curr_el_sp0_serror_get_pc
0209 curr_el_sp0_serror_get_pc:
0210 JUMP_HANDLER
0211 JUMP_TARGET_SP0
0212 .balign 0x80
0213
0214
0215
0216
0217 curr_el_spx_sync:
0218 msr spsel, #0
0219 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0220 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0221 bl .push_exception_context_start
0222
0223 msr spsel, #1
0224 mov x0, sp
0225 msr spsel, #0
0226
0227 bl .push_exception_context_finish
0228
0229 bl curr_el_spx_sync_get_pc
0230 curr_el_spx_sync_get_pc:
0231 mov x0, #0x7f
0232 bic x0, lr, x0
0233 ldr x1, [x0, #0x78]
0234 and lr, lr, #0x780
0235 lsr lr, lr, #7
0236
0237 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_VECTOR_OFFSET]
0238 mov x0, sp
0239 blr x1
0240 b twiddle
0241 nop
0242 nop
0243 nop
0244 nop
0245 nop
0246 nop
0247 nop
0248 nop
0249 nop
0250 nop
0251 nop
0252 nop
0253
0254 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0255 .word _AArch64_Exception_default
0256 .word 0x0
0257 #else
0258 .dword _AArch64_Exception_default
0259 #endif
0260 .balign 0x80
0261
0262
0263
0264
0265 curr_el_spx_irq:
0266 stp x0, lr, [sp, #-0x10]!
0267 bl curr_el_spx_irq_get_pc
0268 curr_el_spx_irq_get_pc:
0269 JUMP_HANDLER
0270 JUMP_TARGET_SPx
0271 .balign 0x80
0272
0273
0274
0275
0276 curr_el_spx_fiq:
0277 stp x0, lr, [sp, #-0x10]!
0278 bl curr_el_spx_fiq_get_pc
0279 curr_el_spx_fiq_get_pc:
0280 JUMP_HANDLER
0281 JUMP_TARGET_SPx
0282 .balign 0x80
0283
0284
0285
0286
0287 curr_el_spx_serror:
0288 stp x0, lr, [sp, #-0x10]!
0289 bl curr_el_spx_serror_get_pc
0290 curr_el_spx_serror_get_pc:
0291 JUMP_HANDLER
0292 JUMP_TARGET_SPx
0293 .balign 0x80
0294
0295
0296
0297 lower_el_aarch64_sync:
0298 stp x0, lr, [sp, #-0x10]!
0299 bl lower_el_aarch64_sync_get_pc
0300 lower_el_aarch64_sync_get_pc:
0301 JUMP_HANDLER
0302 JUMP_TARGET_SPx
0303 .balign 0x80
0304
0305 lower_el_aarch64_irq:
0306 stp x0, lr, [sp, #-0x10]!
0307 bl lower_el_aarch64_irq_get_pc
0308 lower_el_aarch64_irq_get_pc:
0309 JUMP_HANDLER
0310 JUMP_TARGET_SPx
0311 .balign 0x80
0312
0313 lower_el_aarch64_fiq:
0314 stp x0, lr, [sp, #-0x10]!
0315 bl lower_el_aarch64_fiq_get_pc
0316 lower_el_aarch64_fiq_get_pc:
0317 JUMP_HANDLER
0318 JUMP_TARGET_SPx
0319 .balign 0x80
0320
0321
0322
0323 lower_el_aarch64_serror:
0324
0325 stp x0, lr, [sp, #-0x10]!
0326
0327 bl lower_el_aarch64_serror_get_pc
0328 lower_el_aarch64_serror_get_pc:
0329 JUMP_HANDLER
0330 JUMP_TARGET_SPx
0331 .balign 0x80
0332
0333
0334
0335 lower_el_aarch32_sync:
0336 stp x0, lr, [sp, #-0x10]!
0337 bl lower_el_aarch32_sync_get_pc
0338 lower_el_aarch32_sync_get_pc:
0339 JUMP_HANDLER
0340 JUMP_TARGET_SPx
0341 .balign 0x80
0342
0343 lower_el_aarch32_irq:
0344 stp x0, lr, [sp, #-0x10]!
0345 bl lower_el_aarch32_irq_get_pc
0346 lower_el_aarch32_irq_get_pc:
0347 JUMP_HANDLER
0348 JUMP_TARGET_SPx
0349 .balign 0x80
0350
0351 lower_el_aarch32_fiq:
0352 stp x0, lr, [sp, #-0x10]!
0353 bl lower_el_aarch32_fiq_get_pc
0354 lower_el_aarch32_fiq_get_pc:
0355 JUMP_HANDLER
0356 JUMP_TARGET_SPx
0357 .balign 0x80
0358
0359
0360
0361
0362 lower_el_aarch32_serror:
0363
0364 stp x0, lr, [sp, #-0x10]!
0365
0366 bl lower_el_aarch32_serror_get_pc
0367 lower_el_aarch32_serror_get_pc :
0368 JUMP_HANDLER
0369 JUMP_TARGET_SPx
0370
0371 bsp_start_vector_table_end:
0372
0373 .set bsp_start_vector_table_size, bsp_start_vector_table_end - bsp_start_vector_table_begin
0374 .set bsp_vector_table_size, bsp_start_vector_table_size
0375
0376
0377
0378
0379
0380
0381 .print_exception_dump_spx:
0382
0383 msr spsel, #0
0384
0385 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0386
0387
0388
0389
0390 and lr, lr, #0x780
0391 lsr lr, lr, #7
0392 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_VECTOR_OFFSET]
0393
0394
0395
0396
0397
0398 msr spsel, #1
0399 ldp x0, lr, [sp], #0x10
0400 msr spsel, #0
0401
0402 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0403
0404 bl .push_exception_context_start
0405
0406 msr spsel, #1
0407 mov x0, sp
0408 msr spsel, #0
0409
0410 bl .push_exception_context_finish
0411
0412 mov x0, sp
0413
0414 bl _AArch64_Exception_default
0415
0416
0417 b twiddle
0418
0419 .print_exception_dump_sp0:
0420
0421 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0422
0423
0424
0425 and lr, lr, #0x780
0426 lsr lr, lr, #7
0427 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_VECTOR_OFFSET]
0428
0429 add sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0430 ldp x0, lr, [sp]
0431 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0432
0433 str lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0434
0435 bl .push_exception_context_start
0436
0437 add x0, sp, #(AARCH64_EXCEPTION_FRAME_SIZE + 0x10)
0438
0439 bl .push_exception_context_finish
0440
0441 mov x0, sp
0442
0443 bl _AArch64_Exception_default
0444
0445
0446 twiddle:
0447 b twiddle
0448
0449
0450 .push_exception_context_start:
0451
0452 stp x0, x1, [sp, #0x00]
0453 stp x2, x3, [sp, #0x10]
0454 stp x4, x5, [sp, #0x20]
0455 stp x6, x7, [sp, #0x30]
0456 stp x8, x9, [sp, #0x40]
0457 stp x10, x11, [sp, #0x50]
0458 stp x12, x13, [sp, #0x60]
0459 stp x14, x15, [sp, #0x70]
0460 stp x16, x17, [sp, #0x80]
0461 stp x18, x19, [sp, #0x90]
0462 stp x20, x21, [sp, #0xa0]
0463 stp x22, x23, [sp, #0xb0]
0464 stp x24, x25, [sp, #0xc0]
0465 stp x26, x27, [sp, #0xd0]
0466 stp x28, x29, [sp, #0xe0]
0467 ret
0468
0469
0470 .push_exception_context_finish:
0471
0472 mrs x1, ELR_EL1
0473
0474 stp x0, x1, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_SP_OFFSET]
0475
0476 mrs x0, DAIF
0477 mrs x1, SPSR_EL1
0478
0479 stp x0, x1, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_DAIF_OFFSET]
0480
0481 mrs x0, ESR_EL1
0482 mrs x1, FAR_EL1
0483
0484 stp x0, x1, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_SYNDROME_OFFSET]
0485
0486 mrs x0, FPSR
0487 mrs x1, FPCR
0488
0489 stp x0, x1, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_FPSR_OFFSET]
0490
0491 stp q0, q1, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x000)]
0492 stp q2, q3, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x020)]
0493 stp q4, q5, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x040)]
0494 stp q6, q7, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x060)]
0495 stp q8, q9, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x080)]
0496 stp q10, q11, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0a0)]
0497 stp q12, q13, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0c0)]
0498 stp q14, q15, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0e0)]
0499 stp q16, q17, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x100)]
0500 stp q18, q19, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x120)]
0501 stp q20, q21, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x140)]
0502 stp q22, q23, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x160)]
0503 stp q24, q25, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x180)]
0504 stp q26, q27, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1a0)]
0505 stp q28, q29, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1c0)]
0506 stp q30, q31, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1e0)]
0507
0508 ret