Atomics rewrite (XCC)
[akaros.git] / kern / arch / riscv / entry.S
1 #include <arch/pcr.h>
2 #include <arch/trap.h>
3
4 #ifdef __riscv64
5 # define STORE    sd
6 # define LOAD     ld
7 # define REGBYTES 8
8 #else
9 # define STORE    sw
10 # define LOAD     lw
11 # define REGBYTES 4
12 #endif
13
14   .text
15   .ent    save_kernel_tf_asm
16   .global save_kernel_tf_asm
17 save_kernel_tf_asm:
18   STORE  $s0,20*REGBYTES($a0)
19   STORE  $s1,21*REGBYTES($a0)
20   STORE  $s2,22*REGBYTES($a0)
21   STORE  $s3,23*REGBYTES($a0)
22   STORE  $s4,24*REGBYTES($a0)
23   STORE  $s5,25*REGBYTES($a0)
24   STORE  $s6,26*REGBYTES($a0)
25   STORE  $s7,27*REGBYTES($a0)
26   STORE  $s8,28*REGBYTES($a0)
27   STORE  $s9,29*REGBYTES($a0)
28   STORE  $sp,30*REGBYTES($a0)
29
30   mfpcr  $t0,ASM_CR(PCR_SR)
31   STORE  $t0,32*REGBYTES($a0)
32
33   # set EPC to this function's return address
34   STORE  $ra,33*REGBYTES($x2)
35
36   .end  save_kernel_tf_asm
37
38   .text
39   .ent    pop_kernel_tf
40   .global pop_kernel_tf
41 pop_kernel_tf:
42   LOAD  $t0,32*REGBYTES($a0)
43   LOAD  $ra,33*REGBYTES($x2)
44
45   LOAD  $s0,20*REGBYTES($a0)
46   LOAD  $s1,21*REGBYTES($a0)
47   LOAD  $s2,22*REGBYTES($a0)
48   LOAD  $s3,23*REGBYTES($a0)
49   LOAD  $s4,24*REGBYTES($a0)
50   LOAD  $s5,25*REGBYTES($a0)
51   LOAD  $s6,26*REGBYTES($a0)
52   LOAD  $s7,27*REGBYTES($a0)
53   LOAD  $s8,28*REGBYTES($a0)
54   LOAD  $s9,29*REGBYTES($a0)
55   LOAD  $sp,30*REGBYTES($a0)
56
57   mtpcr  $t0,ASM_CR(PCR_SR)
58         ret
59
60   .end  pop_kernel_tf
61
62   .ent  save_tf
63 save_tf:  # write the trap frame onto the stack
64
65   # save gprs
66   STORE  $x3,3*REGBYTES($x2)
67   STORE  $x4,4*REGBYTES($x2)
68   STORE  $x5,5*REGBYTES($x2)
69   STORE  $x6,6*REGBYTES($x2)
70   STORE  $x7,7*REGBYTES($x2)
71   STORE  $x8,8*REGBYTES($x2)
72   STORE  $x9,9*REGBYTES($x2)
73   STORE  $x10,10*REGBYTES($x2)
74   STORE  $x11,11*REGBYTES($x2)
75   STORE  $x12,12*REGBYTES($x2)
76   STORE  $x13,13*REGBYTES($x2)
77   STORE  $x14,14*REGBYTES($x2)
78   STORE  $x15,15*REGBYTES($x2)
79   STORE  $x16,16*REGBYTES($x2)
80   STORE  $x17,17*REGBYTES($x2)
81   STORE  $x18,18*REGBYTES($x2)
82   STORE  $x19,19*REGBYTES($x2)
83   STORE  $x20,20*REGBYTES($x2)
84   STORE  $x21,21*REGBYTES($x2)
85   STORE  $x22,22*REGBYTES($x2)
86   STORE  $x23,23*REGBYTES($x2)
87   STORE  $x24,24*REGBYTES($x2)
88   STORE  $x25,25*REGBYTES($x2)
89   STORE  $x26,26*REGBYTES($x2)
90   STORE  $x27,27*REGBYTES($x2)
91   STORE  $x28,28*REGBYTES($x2)
92   STORE  $x29,29*REGBYTES($x2)
93   STORE  $x30,30*REGBYTES($x2)
94   STORE  $x31,31*REGBYTES($x2)
95
96   mfpcr  $x3,ASM_CR(PCR_K0)
97   STORE  $x3,1*REGBYTES($x2)          # $x1 is in $PCR_K0
98   mfpcr  $x3,ASM_CR(PCR_K1)
99   STORE  $x3,2*REGBYTES($x2)          # $x2 is in $PCR_K1
100
101   # get sr, epc, badvaddr, cause
102   mfpcr  $x3,ASM_CR(PCR_SR)          # sr
103   STORE  $x3,32*REGBYTES($x2)
104   mfpcr  $x4,ASM_CR(PCR_EPC)          # epc
105   STORE  $x4,33*REGBYTES($x2)
106   mfpcr  $x3,ASM_CR(PCR_BADVADDR)      # badvaddr
107   STORE  $x3,34*REGBYTES($x2)
108   mfpcr  $x3,ASM_CR(PCR_CAUSE)        # cause
109   STORE  $x3,35*REGBYTES($x2)
110
111   # get faulting insn, if it wasn't a fetch-related trap
112   li    $x5, CAUSE_MISALIGNED_FETCH
113   li    $x6, CAUSE_FAULT_FETCH
114   beq   $x3, $x5, 1f
115   beq   $x3, $x6, 1f
116   lh    $x3,0($x4)
117   lh    $x4,2($x4)
118   sh    $x3,  36*REGBYTES($x2)
119   sh    $x4,2+36*REGBYTES($x2)
120 1:
121   ret
122   .end  save_tf
123
124   .globl  env_pop_tf
125   .ent  env_pop_tf
126 env_pop_tf:  # write the trap frame onto the stack
127   # restore gprs
128   LOAD  $t0,32*REGBYTES($a0)  # restore sr (should disable interrupts)
129   mtpcr  $t0,ASM_CR(PCR_SR)
130
131   LOAD  $x1,1*REGBYTES($a0)
132   mtpcr  $x1,ASM_CR(PCR_K0)
133   LOAD  $x1,2*REGBYTES($a0)
134   mtpcr $x1,ASM_CR(PCR_K1)
135   move  $x1,$a0
136   LOAD  $x3,3*REGBYTES($x1)
137   LOAD  $x4,4*REGBYTES($x1)
138   LOAD  $x5,5*REGBYTES($x1)
139   LOAD  $x6,6*REGBYTES($x1)
140   LOAD  $x7,7*REGBYTES($x1)
141   LOAD  $x8,8*REGBYTES($x1)
142   LOAD  $x9,9*REGBYTES($x1)
143   LOAD  $x10,10*REGBYTES($x1)
144   LOAD  $x11,11*REGBYTES($x1)
145   LOAD  $x12,12*REGBYTES($x1)
146   LOAD  $x13,13*REGBYTES($x1)
147   LOAD  $x14,14*REGBYTES($x1)
148   LOAD  $x15,15*REGBYTES($x1)
149   LOAD  $x16,16*REGBYTES($x1)
150   LOAD  $x17,17*REGBYTES($x1)
151   LOAD  $x18,18*REGBYTES($x1)
152   LOAD  $x19,19*REGBYTES($x1)
153   LOAD  $x20,20*REGBYTES($x1)
154   LOAD  $x21,21*REGBYTES($x1)
155   LOAD  $x22,22*REGBYTES($x1)
156   LOAD  $x23,23*REGBYTES($x1)
157   LOAD  $x24,24*REGBYTES($x1)
158   LOAD  $x25,25*REGBYTES($x1)
159   LOAD  $x26,26*REGBYTES($x1)
160   LOAD  $x27,27*REGBYTES($x1)
161   LOAD  $x28,28*REGBYTES($x1)
162   LOAD  $x29,29*REGBYTES($x1)
163   LOAD  $x30,30*REGBYTES($x1)
164   LOAD  $x31,31*REGBYTES($x1)
165
166   # gtfo!
167   LOAD  $x2,33*REGBYTES($x1)
168   mtpcr $x2,ASM_CR(PCR_EPC)
169   mfpcr $x1,ASM_CR(PCR_K0)
170   mfpcr $x2,ASM_CR(PCR_K1)
171   eret
172   .end  env_pop_tf
173
174   .global  trap_entry
175   .ent  trap_entry
176 trap_entry:
177   mtpcr $ra,ASM_CR(PCR_K0)
178   mtpcr $x2,ASM_CR(PCR_K1)
179
180   # when coming from kernel, continue below its stack
181   mfpcr $ra,ASM_CR(PCR_SR)
182   and   $ra,$ra,SR_PS
183   add   $x2, $sp, -SIZEOF_TRAPFRAME_T
184   bnez  $ra, 1f
185   la    $x2,bootstacktop-SIZEOF_TRAPFRAME_T
186
187 1:jal   save_tf
188   move  $sp,$x2
189   move  $a0,$x2
190   jal    handle_trap
191   .end  trap_entry