File indexing completed on 2025-05-11 08:24:26
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 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032
0033 #include <rtems/asm.h>
0034 #include <rtems/score/cpu.h>
0035
0036 #ifndef CPU_STACK_ALIGNMENT
0037 #error "Missing header? CPU_STACK_ALIGNMENT not defined"
0038 #endif
0039
0040 BEGIN_CODE
0041
0042
0043
0044
0045
0046
0047
0048 .p2align 1
0049 PUBLIC(_CPU_Context_switch)
0050 PUBLIC(_CPU_Context_switch_no_return)
0051
0052
0053 .set RUNCONTEXT_ARG, REG_ARG0
0054
0055 .set HEIRCONTEXT_ARG, REG_ARG1
0056
0057 SYM(_CPU_Context_switch):
0058 SYM(_CPU_Context_switch_no_return):
0059 movq RUNCONTEXT_ARG, r10
0060 GET_SELF_CPU_CONTROL_R11
0061
0062
0063 pushf
0064 popq CPU_CONTEXT_CONTROL_EFLAGS(r10)
0065 movq rbx, CPU_CONTEXT_CONTROL_RBX(r10)
0066 movq rsp, CPU_CONTEXT_CONTROL_RSP(r10)
0067 movq rbp, CPU_CONTEXT_CONTROL_RBP(r10)
0068 movq r12, CPU_CONTEXT_CONTROL_R12(r10)
0069 movq r13, CPU_CONTEXT_CONTROL_R13(r10)
0070 movq r14, CPU_CONTEXT_CONTROL_R14(r10)
0071 movq r15, CPU_CONTEXT_CONTROL_R15(r10)
0072
0073 movl PER_CPU_ISR_DISPATCH_DISABLE(r11), %edx
0074 movl %edx, CPU_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE(r10)
0075
0076 movq r10, r8
0077 movq HEIRCONTEXT_ARG, r10
0078
0079 #ifdef RTEMS_SMP
0080
0081
0082
0083
0084
0085 leaq PER_CPU_INTERRUPT_FRAME_AREA + CPU_INTERRUPT_FRAME_SIZE(r11), rsp
0086 movw $0, CPU_CONTEXT_CONTROL_IS_EXECUTING(r8)
0087
0088 .check_is_executing:
0089 lock btsw $0, CPU_CONTEXT_CONTROL_IS_EXECUTING(r10)
0090 jnc .restore
0091
0092 .get_potential_new_heir:
0093
0094
0095
0096 movq PER_CPU_OFFSET_EXECUTING(r11), r8
0097 movq PER_CPU_OFFSET_HEIR(r11), r9
0098
0099
0100
0101
0102
0103 cmpq r8, r9
0104 je .check_is_executing
0105
0106
0107 addq r9, r10
0108 subq r8, r10
0109
0110
0111 movq r9, PER_CPU_OFFSET_EXECUTING(r11)
0112
0113 jmp .check_is_executing
0114 #endif
0115
0116 .restore:
0117 movl CPU_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE(r10), %edx
0118 movl %edx, PER_CPU_ISR_DISPATCH_DISABLE(r11)
0119
0120 movq CPU_CONTEXT_CONTROL_RBX(r10), rbx
0121 movq CPU_CONTEXT_CONTROL_RSP(r10), rsp
0122
0123
0124
0125
0126
0127 pushq CPU_CONTEXT_CONTROL_EFLAGS(r10)
0128 popf
0129
0130 movq CPU_CONTEXT_CONTROL_RBP(r10), rbp
0131 movq CPU_CONTEXT_CONTROL_R12(r10), r12
0132 movq CPU_CONTEXT_CONTROL_R13(r10), r13
0133 movq CPU_CONTEXT_CONTROL_R14(r10), r14
0134 movq CPU_CONTEXT_CONTROL_R15(r10), r15
0135
0136 movq CPU_CONTEXT_CONTROL_FS(r10), rax
0137
0138 movq rax, rdx
0139 shrq $32, rdx
0140 movl $FSBASE_MSR, %ecx
0141 wrmsr
0142
0143 ret
0144
0145
0146
0147
0148
0149
0150
0151 PUBLIC(_CPU_Context_restore)
0152
0153 .set NEWCONTEXT_ARG, REG_ARG0
0154
0155 SYM(_CPU_Context_restore):
0156 movq NEWCONTEXT_ARG, r10
0157 GET_SELF_CPU_CONTROL_R11
0158 jmp .restore
0159
0160 END_CODE
0161 END