cbb7cf4a823cd4873893542eb88faad5eba0f61e
[lunaix-os.git] / lunaix-os / arch / aarch64 / exception / context.S
1 #define __ASM__
2 #include <asm/aa64_msrs.h>
3 #include "hart_field.inc"
4
5 .section .text
6     
7     .globl _aa64_evec_prehandle
8     .globl _aa64_switch_task
9
10     _aa64_evec_prehandle:
11         stp  xzr, elr, [sp, #-16]!  # push {xzr , elr}
12         stp spsr, xzr, [sp, #-16]!  # push {spsr, xzr}
13
14         stp   lr,  fp, [sp, #-16]!  # push {x31-x1}
15         stp  x28, x27, [sp, #-16]!
16         stp  x26, x25, [sp, #-16]!
17         stp  x24, x23, [sp, #-16]!
18         stp  x22, x21, [sp, #-16]!
19         stp  x20, x19, [sp, #-16]!
20         stp  x18, x17, [sp, #-16]!
21         stp  x16, x15, [sp, #-16]!
22         stp  x14, x13, [sp, #-16]!
23         stp  x12, x11, [sp, #-16]!
24         stp  x10,  x9, [sp, #-16]!
25         stp   x8,  x7, [sp, #-16]!
26         stp   x6,  x5, [sp, #-16]!
27         stp   x4,  x3, [sp, #-16]!
28         stp   x2,  x1, [sp, #-16]!
29         stp   x0, xzr, [sp, #-16]!  # push {x0, xzr}
30
31         add   x1, sp,  #hart_execp
32
33         mrs   x0, SP_EL0
34         str   x0, [x1, #execp_spel0_saved]
35         
36         sub   x0, sp,  #hart_end
37         str   x0, [x1, #execp_spel1_saved]
38         
39         mov   x0, sp
40         bl    handle_exception
41         
42     do_eret:
43         mov   sp,   x0
44
45         add   x1,   x0, #hart_execp
46
47         ldr   x0,  [x1, #execp_spsr]
48         msr   SPSR_EL1, x0
49
50         ldr   x0,  [x1, #execp_link]
51         msr   ELR_E1,   x0
52
53         ldr   x0,  [x1, #execp_spel0_saved]
54         msr   SP_EL0,   x0
55
56         add   sp,  sp, #hart_regs
57
58         ldr   x0,      [sp, #8 ]!
59         ldp   x1,  x2, [sp, #16]!
60         ldp   x3,  x4, [sp, #16]!
61         ldp   x5,  x6, [sp, #16]!
62         ldp   x7,  x8, [sp, #16]!
63         ldp   x9, x10, [sp, #16]!
64         ldp  x11, x12, [sp, #16]!
65         ldp  x13, x14, [sp, #16]!
66         ldp  x15, x16, [sp, #16]!
67         ldp  x17, x18, [sp, #16]!
68         ldp  x19, x20, [sp, #16]!
69         ldp  x21, x22, [sp, #16]!
70         ldp  x23, x24, [sp, #16]!
71         ldp  x25, x26, [sp, #16]!
72         ldp  x27, x28, [sp, #16]!
73         ldp   fp,  lr, [sp, #16]!
74         
75         # sp now point to the start of exec_param
76
77         ldr   sp,  [sp, #execp_spel1_saved]
78
79         eret
80
81     _aa64_switch_task:
82         # TODO
83         b     do_eret