Initial commit of RISC-V architecture port
[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   .ent  save_tf
39 save_tf:  # write the trap frame onto the stack
40
41   # save gprs
42   STORE  $x3,3*REGBYTES($x2)
43   STORE  $x4,4*REGBYTES($x2)
44   STORE  $x5,5*REGBYTES($x2)
45   STORE  $x6,6*REGBYTES($x2)
46   STORE  $x7,7*REGBYTES($x2)
47   STORE  $x8,8*REGBYTES($x2)
48   STORE  $x9,9*REGBYTES($x2)
49   STORE  $x10,10*REGBYTES($x2)
50   STORE  $x11,11*REGBYTES($x2)
51   STORE  $x12,12*REGBYTES($x2)
52   STORE  $x13,13*REGBYTES($x2)
53   STORE  $x14,14*REGBYTES($x2)
54   STORE  $x15,15*REGBYTES($x2)
55   STORE  $x16,16*REGBYTES($x2)
56   STORE  $x17,17*REGBYTES($x2)
57   STORE  $x18,18*REGBYTES($x2)
58   STORE  $x19,19*REGBYTES($x2)
59   STORE  $x20,20*REGBYTES($x2)
60   STORE  $x21,21*REGBYTES($x2)
61   STORE  $x22,22*REGBYTES($x2)
62   STORE  $x23,23*REGBYTES($x2)
63   STORE  $x24,24*REGBYTES($x2)
64   STORE  $x25,25*REGBYTES($x2)
65   STORE  $x26,26*REGBYTES($x2)
66   STORE  $x27,27*REGBYTES($x2)
67   STORE  $x28,28*REGBYTES($x2)
68   STORE  $x29,29*REGBYTES($x2)
69   STORE  $x30,30*REGBYTES($x2)
70   STORE  $x31,31*REGBYTES($x2)
71
72   mfpcr  $x3,ASM_CR(PCR_K0)
73   STORE  $x3,1*REGBYTES($x2)          # $x1 is in $PCR_K0
74   mfpcr  $x3,ASM_CR(PCR_K1)
75   STORE  $x3,2*REGBYTES($x2)          # $x2 is in $PCR_K1
76
77   # get sr, epc, badvaddr, cause
78   mfpcr  $x3,ASM_CR(PCR_SR)          # sr
79   STORE  $x3,32*REGBYTES($x2)
80   mfpcr  $x4,ASM_CR(PCR_EPC)          # epc
81   STORE  $x4,33*REGBYTES($x2)
82   mfpcr  $x3,ASM_CR(PCR_BADVADDR)      # badvaddr
83   STORE  $x3,34*REGBYTES($x2)
84   mfpcr  $x3,ASM_CR(PCR_CAUSE)        # cause
85   STORE  $x3,35*REGBYTES($x2)
86
87   # get faulting insn, if it wasn't a fetch-related trap
88   li    $x5, CAUSE_MISALIGNED_FETCH
89   li    $x6, CAUSE_FAULT_FETCH
90   beq   $x3, $x5, 1f
91   beq   $x3, $x6, 1f
92   lh    $x3,0($x4)
93   lh    $x4,2($x4)
94   sh    $x3,  36*REGBYTES($x2)
95   sh    $x4,2+36*REGBYTES($x2)
96 1:
97   ret
98   .end  save_tf
99
100   .globl  pop_tf
101   .ent  pop_tf
102 pop_tf:  # write the trap frame onto the stack
103   # restore gprs
104   LOAD  $t0,32*REGBYTES($a0)  # restore sr (should disable interrupts)
105   mtpcr  $t0,ASM_CR(PCR_SR)
106
107   LOAD  $x1,1*REGBYTES($a0)
108   mtpcr  $x1,ASM_CR(PCR_K0)
109   LOAD  $x1,2*REGBYTES($a0)
110   mtpcr $x1,ASM_CR(PCR_K1)
111   move  $x1,$a0
112   LOAD  $x3,3*REGBYTES($x1)
113   LOAD  $x4,4*REGBYTES($x1)
114   LOAD  $x5,5*REGBYTES($x1)
115   LOAD  $x6,6*REGBYTES($x1)
116   LOAD  $x7,7*REGBYTES($x1)
117   LOAD  $x8,8*REGBYTES($x1)
118   LOAD  $x9,9*REGBYTES($x1)
119   LOAD  $x10,10*REGBYTES($x1)
120   LOAD  $x11,11*REGBYTES($x1)
121   LOAD  $x12,12*REGBYTES($x1)
122   LOAD  $x13,13*REGBYTES($x1)
123   LOAD  $x14,14*REGBYTES($x1)
124   LOAD  $x15,15*REGBYTES($x1)
125   LOAD  $x16,16*REGBYTES($x1)
126   LOAD  $x17,17*REGBYTES($x1)
127   LOAD  $x18,18*REGBYTES($x1)
128   LOAD  $x19,19*REGBYTES($x1)
129   LOAD  $x20,20*REGBYTES($x1)
130   LOAD  $x21,21*REGBYTES($x1)
131   LOAD  $x22,22*REGBYTES($x1)
132   LOAD  $x23,23*REGBYTES($x1)
133   LOAD  $x24,24*REGBYTES($x1)
134   LOAD  $x25,25*REGBYTES($x1)
135   LOAD  $x26,26*REGBYTES($x1)
136   LOAD  $x27,27*REGBYTES($x1)
137   LOAD  $x28,28*REGBYTES($x1)
138   LOAD  $x29,29*REGBYTES($x1)
139   LOAD  $x30,30*REGBYTES($x1)
140   LOAD  $x31,31*REGBYTES($x1)
141
142   # gtfo!
143   LOAD  $x2,33*REGBYTES($x1)
144   mtpcr $x2,ASM_CR(PCR_EPC)
145   mfpcr $x1,ASM_CR(PCR_K0)
146   mfpcr $x2,ASM_CR(PCR_K1)
147   eret
148   .end  pop_tf
149
150   .global  trap_entry
151   .ent  trap_entry
152 trap_entry:
153   mtpcr $ra,ASM_CR(PCR_K0)
154   mtpcr $x2,ASM_CR(PCR_K1)
155
156   # when coming from kernel, continue below its stack
157   mfpcr $ra,ASM_CR(PCR_SR)
158   and   $ra,$ra,SR_PS
159   add   $x2, $sp, -SIZEOF_TRAPFRAME_T
160   bnez  $ra, 1f
161   la    $x2,bootstacktop-SIZEOF_TRAPFRAME_T
162
163 1:jal   save_tf
164   move  $sp,$x2
165   move  $a0,$x2
166   jal    handle_trap
167   .end  trap_entry