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 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/asm.h>
0043
0044 .globl _CPU_Exception_dispatch_and_resume
0045 .globl _CPU_Exception_resume
0046
0047 #ifdef AARCH64_MULTILIB_ARCH_V8_ILP32
0048 #ifdef RTEMS_SMP
0049 #define SELF_CPU_CONTROL_GET_REG x19
0050 #else
0051 #define SELF_CPU_CONTROL_GET_REG w19
0052 #endif
0053 #else
0054 #define SELF_CPU_CONTROL_GET_REG x19
0055 #endif
0056 #define SELF_CPU_CONTROL x19
0057
0058
0059
0060
0061
0062
0063
0064 _CPU_Exception_resume:
0065
0066 mov sp, x0
0067
0068
0069 bl .pop_exception_context
0070
0071
0072 ldr lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0073
0074
0075 add sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0076
0077
0078 msr spsel, #1
0079 eret
0080
0081
0082
0083
0084
0085
0086
0087 _CPU_Exception_dispatch_and_resume:
0088
0089 GET_SELF_CPU_CONTROL SELF_CPU_CONTROL_GET_REG
0090
0091
0092 mov sp, x0
0093
0094
0095
0096 ldr w0, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0097 ldrb w1, [SELF_CPU_CONTROL, #PER_CPU_DISPATCH_NEEDED]
0098 ldr w2, [SELF_CPU_CONTROL, #PER_CPU_ISR_DISPATCH_DISABLE]
0099 ldr w3, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0100
0101
0102 eor w1, w1, w0
0103 sub w0, w0, #1
0104 orr w1, w1, w0
0105 orr w1, w1, w2
0106 sub w3, w3, #1
0107
0108
0109 str w0, [SELF_CPU_CONTROL, #PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL]
0110 str w3, [SELF_CPU_CONTROL, #PER_CPU_ISR_NEST_LEVEL]
0111
0112
0113 mov x22, x1
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123 bl .move_exception_frame_and_switch_to_thread_stack
0124
0125
0126
0127
0128
0129 cmp x22, #0
0130 bne .Lno_need_thread_dispatch_resume
0131 bl _AArch64_Exception_thread_dispatch
0132 .Lno_need_thread_dispatch_resume:
0133
0134 bl .pop_exception_context
0135
0136
0137 ldr lr, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_LR_OFFSET]
0138
0139
0140 add sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0141 eret
0142
0143
0144 .move_exception_frame_and_switch_to_thread_stack:
0145 mov x1, sp
0146 msr spsel, #1
0147 ldr x0, [x1, #AARCH64_EXCEPTION_FRAME_REGISTER_SP_OFFSET]
0148 mov sp, x0
0149 sub sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0150 mov x0, sp
0151 mov x20, lr
0152 bl _AArch64_Exception_frame_copy
0153 mov lr, x20
0154 msr spsel, #0
0155 add sp, sp, #AARCH64_EXCEPTION_FRAME_SIZE
0156 msr spsel, #1
0157 ret
0158
0159
0160
0161
0162 .pop_exception_context:
0163
0164 ldp x2, x3, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_DAIF_OFFSET]
0165
0166 msr DAIF, x2
0167 msr SPSR_EL1, x3
0168
0169 ldp x2, x3, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_SYNDROME_OFFSET]
0170
0171 msr ESR_EL1, x2
0172 msr FAR_EL1, x3
0173
0174 ldp x2, x3, [sp, #AARCH64_EXCEPTION_FRAME_REGISTER_FPSR_OFFSET]
0175
0176 msr FPSR, x2
0177 msr FPCR, x3
0178
0179 ldp q0, q1, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x000)]
0180 ldp q2, q3, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x020)]
0181 ldp q4, q5, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x040)]
0182 ldp q6, q7, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x060)]
0183 ldp q8, q9, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x080)]
0184 ldp q10, q11, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0a0)]
0185 ldp q12, q13, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0c0)]
0186 ldp q14, q15, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x0e0)]
0187 ldp q16, q17, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x100)]
0188 ldp q18, q19, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x120)]
0189 ldp q20, q21, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x140)]
0190 ldp q22, q23, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x160)]
0191 ldp q24, q25, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x180)]
0192 ldp q26, q27, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1a0)]
0193 ldp q28, q29, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1c0)]
0194 ldp q30, q31, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_Q0_OFFSET + 0x1e0)]
0195
0196 ldp x2, x3, [sp, #0x10]
0197 ldp x4, x5, [sp, #0x20]
0198 ldp x6, x7, [sp, #0x30]
0199 ldp x8, x9, [sp, #0x40]
0200 ldp x10, x11, [sp, #0x50]
0201 ldp x12, x13, [sp, #0x60]
0202 ldp x14, x15, [sp, #0x70]
0203 ldp x16, x17, [sp, #0x80]
0204 ldp x18, x19, [sp, #0x90]
0205 ldp x20, x21, [sp, #0xa0]
0206 ldp x22, x23, [sp, #0xb0]
0207 ldp x24, x25, [sp, #0xc0]
0208 ldp x26, x27, [sp, #0xd0]
0209 ldp x28, x29, [sp, #0xe0]
0210
0211 ldr x1, [sp, #(AARCH64_EXCEPTION_FRAME_REGISTER_SP_OFFSET + 0x8)]
0212
0213 msr ELR_EL1, x1
0214 ldp x0, x1, [sp, #0x00]
0215
0216
0217 clrex
0218
0219 ret