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
0041
0042
0043 #ifdef HAVE_CONFIG_H
0044 #include "config.h"
0045 #endif
0046
0047 #include <rtems/asm.h>
0048
0049 .globl _AArch64_Exception_interrupt_no_nest
0050 .globl _AArch64_Exception_interrupt_nest
0051 .globl _AArch64_Exception_thread_dispatch
0052
0053 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0054 #ifdef RTEMS_SMP
0055 #define SELF_CPU_CONTROL_GET_REG x19
0056 #else
0057 #define SELF_CPU_CONTROL_GET_REG w19
0058 #endif
0059 #else
0060 #define SELF_CPU_CONTROL_GET_REG x19
0061 #endif
0062 #define SELF_CPU_CONTROL x19
0063 #define NON_VOLATILE_SCRATCH x20
0064
0065
0066
0067
0068
0069
0070
0071 .AArch64_Interrupt_Handler:
0072
0073 GET_SELF_CPU_CONTROL SELF_CPU_CONTROL_GET_REG
0074
0075
0076 ldr w2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0077 ldr w3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0078 add w2, w2, #1
0079 add w3, w3, #1
0080 str w2, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0081 str w3, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0082
0083
0084 mov x21, LR
0085
0086
0087 bl bsp_interrupt_dispatch
0088
0089
0090 mov LR, x21
0091
0092
0093 ldr w0, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0094 ldrb w1, [SELF_CPU_CONTROL, #PER_CPU_DISPATCH_NEEDED]
0095 ldr w2, [SELF_CPU_CONTROL, #PER_CPU_ISR_DISPATCH_DISABLE]
0096 ldr w3, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0097
0098
0099 eor w1, w1, w0
0100 sub w0, w0, #1
0101 orr w1, w1, w0
0102 orr w1, w1, w2
0103 sub w3, w3, #1
0104
0105
0106 str w0, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0107 str w3, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0108
0109
0110 mov x0, x1
0111
0112 ret
0113
0114
0115
0116
0117 _AArch64_Exception_thread_dispatch:
0118
0119 GET_SELF_CPU_CONTROL SELF_CPU_CONTROL_GET_REG
0120
0121
0122 mrs NON_VOLATILE_SCRATCH, DAIF
0123
0124 .Ldo_thread_dispatch:
0125
0126
0127 mov w0, #1
0128 str w0, [SELF_CPU_CONTROL, #PER_CPU_ISR_DISPATCH_DISABLE]
0129 str w0, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0130
0131
0132 mov x21, LR
0133
0134
0135 mov x0, SELF_CPU_CONTROL
0136 mov x1, NON_VOLATILE_SCRATCH
0137 mov x2, #0x80
0138 bic x1, x1, x2
0139 bl _Thread_Do_dispatch
0140
0141
0142 mov LR, x21
0143
0144
0145 msr DAIF, NON_VOLATILE_SCRATCH
0146
0147 #ifdef RTEMS_SMP
0148 GET_SELF_CPU_CONTROL SELF_CPU_CONTROL_GET_REG
0149 #endif
0150
0151
0152 ldrb w0, [SELF_CPU_CONTROL, #PER_CPU_DISPATCH_NEEDED]
0153 cmp w0, #0
0154 bne .Ldo_thread_dispatch
0155
0156
0157 mov w0, #0
0158 str w0, [SELF_CPU_CONTROL, #PER_CPU_ISR_DISPATCH_DISABLE]
0159
0160
0161 ret
0162
0163
0164
0165
0166
0167 .macro push_interrupt_context
0168
0169
0170
0171
0172 stp lr, x1, [sp, #-0x10]!
0173 stp x2, x3, [sp, #-0x10]!
0174 stp x4, x5, [sp, #-0x10]!
0175 stp x6, x7, [sp, #-0x10]!
0176 stp x8, x9, [sp, #-0x10]!
0177 stp x10, x11, [sp, #-0x10]!
0178 stp x12, x13, [sp, #-0x10]!
0179 stp x14, x15, [sp, #-0x10]!
0180 stp x16, x17, [sp, #-0x10]!
0181 stp x18, x19, [sp, #-0x10]!
0182 stp x20, x21, [sp, #-0x10]!
0183
0184
0185
0186
0187 stp q0, q1, [sp, #-0x20]!
0188 stp q2, q3, [sp, #-0x20]!
0189 stp q4, q5, [sp, #-0x20]!
0190 stp q6, q7, [sp, #-0x20]!
0191 stp q8, q9, [sp, #-0x20]!
0192 stp q10, q11, [sp, #-0x20]!
0193 stp q12, q13, [sp, #-0x20]!
0194 stp q14, q15, [sp, #-0x20]!
0195 stp q16, q17, [sp, #-0x20]!
0196 stp q18, q19, [sp, #-0x20]!
0197 stp q20, q21, [sp, #-0x20]!
0198 stp q22, q23, [sp, #-0x20]!
0199 stp q24, q25, [sp, #-0x20]!
0200 stp q26, q27, [sp, #-0x20]!
0201 stp q28, q29, [sp, #-0x20]!
0202 stp q30, q31, [sp, #-0x20]!
0203
0204 mrs x0, ELR_EL1
0205 mrs x1, SPSR_EL1
0206
0207 stp x0, x1, [sp, #-0x10]!
0208
0209 mrs x0, FPSR
0210 mrs x1, FPCR
0211
0212 stp x0, x1, [sp, #-0x10]!
0213 .endm
0214
0215
0216 .macro pop_interrupt_context
0217
0218 ldp x0, x1, [sp], #0x10
0219
0220 msr FPCR, x1
0221 msr FPSR, x0
0222
0223 ldp x0, x1, [sp], #0x10
0224
0225 msr SPSR_EL1, x1
0226 msr ELR_EL1, x0
0227
0228 ldp q30, q31, [sp], #0x20
0229 ldp q28, q29, [sp], #0x20
0230 ldp q26, q27, [sp], #0x20
0231 ldp q24, q25, [sp], #0x20
0232 ldp q22, q23, [sp], #0x20
0233 ldp q20, q21, [sp], #0x20
0234 ldp q18, q19, [sp], #0x20
0235 ldp q16, q17, [sp], #0x20
0236 ldp q14, q15, [sp], #0x20
0237 ldp q12, q13, [sp], #0x20
0238 ldp q10, q11, [sp], #0x20
0239 ldp q8, q9, [sp], #0x20
0240 ldp q6, q7, [sp], #0x20
0241 ldp q4, q5, [sp], #0x20
0242 ldp q2, q3, [sp], #0x20
0243 ldp q0, q1, [sp], #0x20
0244
0245 ldp x20, x21, [sp], #0x10
0246 ldp x18, x19, [sp], #0x10
0247 ldp x16, x17, [sp], #0x10
0248 ldp x14, x15, [sp], #0x10
0249 ldp x12, x13, [sp], #0x10
0250 ldp x10, x11, [sp], #0x10
0251 ldp x8, x9, [sp], #0x10
0252 ldp x6, x7, [sp], #0x10
0253 ldp x4, x5, [sp], #0x10
0254 ldp x2, x3, [sp], #0x10
0255 ldp lr, x1, [sp], #0x10
0256
0257 clrex
0258 .endm
0259
0260 _AArch64_Exception_interrupt_nest:
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270 push_interrupt_context
0271
0272
0273 bl .AArch64_Interrupt_Handler
0274
0275
0276
0277
0278
0279
0280 pop_interrupt_context
0281
0282 ret
0283
0284 _AArch64_Exception_interrupt_no_nest:
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297 push_interrupt_context
0298
0299
0300
0301
0302
0303 msr spsel, #0
0304
0305
0306 bl .AArch64_Interrupt_Handler
0307
0308
0309
0310
0311
0312 msr spsel, #1
0313
0314
0315
0316
0317
0318 cmp x0, #0
0319 bne .Lno_need_thread_dispatch
0320 bl _AArch64_Exception_thread_dispatch
0321
0322 .Lno_need_thread_dispatch:
0323
0324
0325
0326
0327
0328 pop_interrupt_context
0329
0330 ret