1 /* 2 * Copyright (c) 2006-2020, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2024-03-28 Shell Move vector handling codes from context_gcc.S 9 */ 10 #ifndef __ARM64_INC_CONTEXT_H__ 11 #define __ARM64_INC_CONTEXT_H__ 12 13 #include "armv8.h" 14 15 .macro SAVE_CONTEXT_SWITCH, tmpx, tmp2x 16 /* Save the entire context. */ 17 SAVE_FPU sp 18 19 stp x19, x20, [sp, #-0x10]! 20 stp x21, x22, [sp, #-0x10]! 21 stp x23, x24, [sp, #-0x10]! 22 stp x25, x26, [sp, #-0x10]! 23 stp x27, x28, [sp, #-0x10]! 24 25 mrs \tmpx, sp_el0 26 stp x29, \tmpx, [sp, #-0x10]! 27 28 mrs \tmpx, fpcr 29 mrs \tmp2x, fpsr 30 stp \tmpx, \tmp2x, [sp, #-0x10]! 31 32 mov \tmpx, #((3 << 6) | 0x5) /* el1h, disable interrupt */ 33 stp x30, \tmpx, [sp, #-0x10]! 34 35 .endm 36 37 .macro SAVE_CONTEXT_SWITCH_FAST 38 /* Save the entire context. */ 39 add sp, sp, #-1 * CONTEXT_FPU_SIZE 40 41 add sp, sp, #-7 * 16 42 43 mov x19, #((3 << 6) | 0x4 | 0x1) /* el1h, disable interrupt */ 44 stp lr, x19, [sp, #-0x10]! 45 46 .endm 47 48 .macro _RESTORE_CONTEXT_SWITCH 49 ldp x30, x19, [sp], #0x10 /* SPSR and ELR. */ 50 msr elr_el1, x30 51 msr spsr_el1, x19 52 53 54 /* restore NEON */ 55 ldp x19, x20, [sp], #0x10 56 msr fpcr, x19 57 msr fpsr, x20 58 59 ldp x29, x19, [sp], #0x10 60 msr sp_el0, x19 61 ldp x27, x28, [sp], #0x10 62 ldp x25, x26, [sp], #0x10 63 ldp x23, x24, [sp], #0x10 64 ldp x21, x22, [sp], #0x10 65 ldp x19, x20, [sp], #0x10 66 67 RESTORE_FPU sp 68 eret 69 .endm 70 71 #endif /* __ARM64_INC_CONTEXT_H__ */ 72