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