for risc-v, don't store irq mask in trapframe
[akaros.git] / kern / arch / riscv / entry.S
index 24f7949..4707db5 100644 (file)
@@ -5,12 +5,13 @@
 #ifdef __riscv64
 # define STORE    sd
 # define LOAD     ld
-# define REGBYTES 8
+# define LOG_REGBYTES 3
 #else
 # define STORE    sw
 # define LOAD     lw
-# define REGBYTES 4
+# define LOG_REGBYTES 2
 #endif
+#define REGBYTES (1 << LOG_REGBYTES)
 
   .text
   .ent    save_kernel_tf_asm
@@ -32,8 +33,8 @@ save_kernel_tf_asm:
   STORE  t0,32*REGBYTES(a0)
 
   # set EPC to this function's return address
-  STORE  ra,33*REGBYTES(x2)
-
+  STORE  ra,33*REGBYTES(a0)
+  ret
   .end  save_kernel_tf_asm
 
   .text
@@ -41,7 +42,7 @@ save_kernel_tf_asm:
   .global pop_kernel_tf
 pop_kernel_tf:
   LOAD  t0,32*REGBYTES(a0)
-  LOAD  ra,33*REGBYTES(x2)
+  LOAD  ra,33*REGBYTES(a0)
 
   LOAD  s0,20*REGBYTES(a0)
   LOAD  s1,21*REGBYTES(a0)
@@ -71,7 +72,11 @@ save_tf:  # write the trap frame onto the stack
 env_pop_tf:  # write the trap frame onto the stack
   # restore gprs
   LOAD  t0,32*REGBYTES(a0)  # restore sr (should disable interrupts)
-  mtpcr  t0,ASM_CR(PCR_SR)
+  mfpcr t1, ASM_CR(PCR_SR)
+  andi  t1, t1, ~(SR_PS | SR_EF | SR_U64)
+  andi  t0, t0, SR_PS | SR_EF | SR_U64
+  or    t0, t0, t1
+  mtpcr t0, ASM_CR(PCR_SR)
 
   LOAD  x1,1*REGBYTES(a0)
   mtpcr  x1,ASM_CR(PCR_K0)
@@ -130,11 +135,12 @@ trap_entry:
   bnez  x1, 1f
 
   # otherwise, start at the top of the per-core stack
-  la    x2, percore_stacks - SIZEOF_TRAPFRAME_T
+  la    x2, core_stacktops
   mfpcr x1, ASM_CR(PCR_COREID)
-  add   x1, x1, 1
-  sll   x1, x1, KSTKSHIFT
+  sll   x1, x1, LOG_REGBYTES
   add   x2, x2, x1
+  LOAD  x2, 0(x2)
+  add   x2, x2, -SIZEOF_TRAPFRAME_T
 
 1:# save gprs
   STORE  x3,3*REGBYTES(x2)
@@ -182,17 +188,6 @@ trap_entry:
   mfpcr  x3,ASM_CR(PCR_CAUSE)        # cause
   STORE  x3,35*REGBYTES(x2)
 
-  # get faulting insn, if it wasn't a fetch-related trap
-  and   x3, x3, CAUSE_EXCCODE
-  li    x5, CAUSE_MISALIGNED_FETCH
-  li    x6, CAUSE_FAULT_FETCH
-  beq   x3, x5, 1f
-  beq   x3, x6, 1f
-  lh    x3,0(x4)
-  lh    x4,2(x4)
-  sh    x3,  36*REGBYTES(x2)
-  sh    x4,2+36*REGBYTES(x2)
-1:
   li    s9, 0
   move  sp, x2
   move  a0, x2
@@ -200,8 +195,11 @@ trap_entry:
   .end  trap_entry
 
   .global  cpu_halt
+  .global  after_cpu_halt
   .ent  cpu_halt
 cpu_halt:
+  setpcr ASM_CR(PCR_SR), SR_ET
 1:b     1b   # handle_ipi can advance the PC to break out of this loop.
   ret
+after_cpu_halt:
   .end  cpu_halt