net: Use NULL to signal lack of promisc/multicast
[akaros.git] / kern / arch / riscv / entry.S
1 #include <arch/pcr.h>
2 #include <arch/trap.h>
3 #include <kstack.h>
4
5 #ifdef __riscv64
6 # define STORE    sd
7 # define LOAD     ld
8 # define LOG_REGBYTES 3
9 #else
10 # define STORE    sw
11 # define LOAD     lw
12 # define LOG_REGBYTES 2
13 #endif
14 #define REGBYTES (1 << LOG_REGBYTES)
15
16   .text
17   .global save_kernel_tf_asm
18 save_kernel_tf_asm:
19   mfpcr  a1,ASM_CR(PCR_SR)
20
21   STORE s0,  2*REGBYTES(a0)
22   STORE s1,  3*REGBYTES(a0)
23   STORE s2,  4*REGBYTES(a0)
24   STORE s3,  5*REGBYTES(a0)
25   STORE s4,  6*REGBYTES(a0)
26   STORE s5,  7*REGBYTES(a0)
27   STORE s6,  8*REGBYTES(a0)
28   STORE s7,  9*REGBYTES(a0)
29   STORE s8, 10*REGBYTES(a0)
30   STORE s9, 11*REGBYTES(a0)
31   STORE s10,12*REGBYTES(a0)
32   STORE s11,13*REGBYTES(a0)
33   STORE sp, 14*REGBYTES(a0)
34
35   STORE  a1,32*REGBYTES(a0)
36
37   # set EPC to this function's return address
38   STORE  ra,33*REGBYTES(a0)
39   ret
40
41 # Remove these (or this comment) when implementing setjmp on riscv.
42   .text
43   .global pop_kernel_ctx
44 pop_kernel_ctx:
45   LOAD  a1,32*REGBYTES(a0)
46   LOAD  ra,33*REGBYTES(a0)
47
48   LOAD  s0,  2*REGBYTES(a0)
49   LOAD  s1,  3*REGBYTES(a0)
50   LOAD  s2,  4*REGBYTES(a0)
51   LOAD  s3,  5*REGBYTES(a0)
52   LOAD  s4,  6*REGBYTES(a0)
53   LOAD  s5,  7*REGBYTES(a0)
54   LOAD  s6,  8*REGBYTES(a0)
55   LOAD  s7,  9*REGBYTES(a0)
56   LOAD  s8, 10*REGBYTES(a0)
57   LOAD  s9, 11*REGBYTES(a0)
58   LOAD  s10,12*REGBYTES(a0)
59   LOAD  s11,13*REGBYTES(a0)
60   LOAD  sp, 14*REGBYTES(a0)
61
62   mtpcr  a1,ASM_CR(PCR_SR)
63   ret
64
65
66 save_tf:  # write the trap frame onto the stack
67
68   ret
69
70   .globl  pop_hw_tf
71 pop_hw_tf:  # write the trap frame onto the stack
72   # restore SR.{PS, EF, U64} and disable interrupts
73   LOAD  v0,32*REGBYTES(a0)
74   mfpcr v1, ASM_CR(PCR_SR)
75   andi  v0, v0,  (SR_PS | SR_EF | SR_U64)
76   andi  v1, v1, ~(SR_PS | SR_EF | SR_U64 | SR_ET)
77   or    v0, v0, v1
78   mtpcr v0, ASM_CR(PCR_SR)
79
80   # restore gprs
81   LOAD  x1,1*REGBYTES(a0)
82   mtpcr  x1,ASM_CR(PCR_K0)
83   LOAD  x1,2*REGBYTES(a0)
84   mtpcr x1,ASM_CR(PCR_K1)
85   move  x1,a0
86   LOAD  x3,3*REGBYTES(x1)
87   LOAD  x4,4*REGBYTES(x1)
88   LOAD  x5,5*REGBYTES(x1)
89   LOAD  x6,6*REGBYTES(x1)
90   LOAD  x7,7*REGBYTES(x1)
91   LOAD  x8,8*REGBYTES(x1)
92   LOAD  x9,9*REGBYTES(x1)
93   LOAD  x10,10*REGBYTES(x1)
94   LOAD  x11,11*REGBYTES(x1)
95   LOAD  x12,12*REGBYTES(x1)
96   LOAD  x13,13*REGBYTES(x1)
97   LOAD  x14,14*REGBYTES(x1)
98   LOAD  x15,15*REGBYTES(x1)
99   LOAD  x16,16*REGBYTES(x1)
100   LOAD  x17,17*REGBYTES(x1)
101   LOAD  x18,18*REGBYTES(x1)
102   LOAD  x19,19*REGBYTES(x1)
103   LOAD  x20,20*REGBYTES(x1)
104   LOAD  x21,21*REGBYTES(x1)
105   LOAD  x22,22*REGBYTES(x1)
106   LOAD  x23,23*REGBYTES(x1)
107   LOAD  x24,24*REGBYTES(x1)
108   LOAD  x25,25*REGBYTES(x1)
109   LOAD  x26,26*REGBYTES(x1)
110   LOAD  x27,27*REGBYTES(x1)
111   LOAD  x28,28*REGBYTES(x1)
112   LOAD  x29,29*REGBYTES(x1)
113   LOAD  x30,30*REGBYTES(x1)
114   LOAD  x31,31*REGBYTES(x1)
115
116   # gtfo!
117   LOAD  x2,33*REGBYTES(x1)
118   mtpcr x2,ASM_CR(PCR_EPC)
119   mfpcr x1,ASM_CR(PCR_K0)
120   mfpcr x2,ASM_CR(PCR_K1)
121   eret
122
123   .global  trap_entry
124 trap_entry:
125   mtpcr x1, ASM_CR(PCR_K0)  # stash x1 in k0
126   mfpcr x1, ASM_CR(PCR_SR)
127   mtpcr x2, ASM_CR(PCR_K1)  # stash x2 in k1
128   # when coming from kernel, continue below its stack
129   add   x2, sp, -SIZEOF_HW_TRAPFRAME
130   and   x1, x1, SR_PS
131   bnez  x1, 1f
132
133   # otherwise, start at the top of the per-core stack
134   mfpcr x1, ASM_CR(PCR_COREID)
135   lui   x2, %hi(core_stacktops)
136   sll   x1, x1, LOG_REGBYTES
137   add   x2, x2, x1
138   LOAD  x2, %lo(core_stacktops)(x2)
139   add   x2, x2, -SIZEOF_HW_TRAPFRAME
140
141 1:# save gprs
142   STORE  x3,3*REGBYTES(x2)
143   STORE  x4,4*REGBYTES(x2)
144   mfpcr  x3,ASM_CR(PCR_K0)    # retrieve x1
145   mfpcr  x4,ASM_CR(PCR_K1)    # retrieve x2
146   STORE  x5,5*REGBYTES(x2)
147   STORE  x6,6*REGBYTES(x2)
148   STORE  x7,7*REGBYTES(x2)
149   STORE  x8,8*REGBYTES(x2)
150   STORE  x9,9*REGBYTES(x2)
151   STORE  x3,1*REGBYTES(x2)    # save x1
152   STORE  x4,2*REGBYTES(x2)    # save x2
153   STORE  x10,10*REGBYTES(x2)
154   STORE  x11,11*REGBYTES(x2)
155   STORE  x12,12*REGBYTES(x2)
156   STORE  x13,13*REGBYTES(x2)
157   STORE  x14,14*REGBYTES(x2)
158   STORE  x15,15*REGBYTES(x2)
159   STORE  x16,16*REGBYTES(x2)
160   STORE  x17,17*REGBYTES(x2)
161   STORE  x18,18*REGBYTES(x2)
162   STORE  x19,19*REGBYTES(x2)
163   STORE  x20,20*REGBYTES(x2)
164   STORE  x21,21*REGBYTES(x2)
165   STORE  x22,22*REGBYTES(x2)
166   STORE  x23,23*REGBYTES(x2)
167   STORE  x24,24*REGBYTES(x2)
168   STORE  x25,25*REGBYTES(x2)
169   STORE  x26,26*REGBYTES(x2)
170   STORE  x27,27*REGBYTES(x2)
171   STORE  x28,28*REGBYTES(x2)
172   STORE  x29,29*REGBYTES(x2)
173   STORE  x30,30*REGBYTES(x2)
174   STORE  x31,31*REGBYTES(x2)
175
176   # get sr, epc, badvaddr, cause
177   mfpcr  x3,ASM_CR(PCR_SR)
178   mfpcr  x4,ASM_CR(PCR_EPC)
179   mfpcr  x5,ASM_CR(PCR_BADVADDR)
180   mfpcr  x6,ASM_CR(PCR_CAUSE)
181   STORE  x3,32*REGBYTES(x2)
182   STORE  x4,33*REGBYTES(x2)
183   STORE  x5,34*REGBYTES(x2)
184   STORE  x6,35*REGBYTES(x2)
185
186   move  sp, x2
187   move  a0, x2
188   j     handle_trap
189
190   .global  cpu_halt
191   .global  after_cpu_halt
192 cpu_halt:
193   setpcr ASM_CR(PCR_SR), SR_ET
194 1:b     1b   # handle_ipi can advance the PC to break out of this loop.
195   ret
196 after_cpu_halt: