vmap: Use {map,unmap}_segment() helpers
[akaros.git] / kern / arch / riscv / entry.S
index 08d0369..87dee12 100644 (file)
@@ -1,6 +1,6 @@
 #include <arch/pcr.h>
 #include <arch/trap.h>
-#include <ros/memlayout.h>
+#include <kstack.h>
 
 #ifdef __riscv64
 # define STORE    sd
   .text
   .global save_kernel_tf_asm
 save_kernel_tf_asm:
-  STORE  s0,20*REGBYTES(a0)
-  STORE  s1,21*REGBYTES(a0)
-  STORE  s2,22*REGBYTES(a0)
-  STORE  s3,23*REGBYTES(a0)
-  STORE  s4,24*REGBYTES(a0)
-  STORE  s5,25*REGBYTES(a0)
-  STORE  s6,26*REGBYTES(a0)
-  STORE  s7,27*REGBYTES(a0)
-  STORE  s8,28*REGBYTES(a0)
-  STORE  s9,29*REGBYTES(a0)
-  STORE  sp,30*REGBYTES(a0)
-
-  mfpcr  t0,ASM_CR(PCR_SR)
-  STORE  t0,32*REGBYTES(a0)
+  mfpcr  a1,ASM_CR(PCR_SR)
+
+  STORE s0,  2*REGBYTES(a0)
+  STORE s1,  3*REGBYTES(a0)
+  STORE s2,  4*REGBYTES(a0)
+  STORE s3,  5*REGBYTES(a0)
+  STORE s4,  6*REGBYTES(a0)
+  STORE s5,  7*REGBYTES(a0)
+  STORE s6,  8*REGBYTES(a0)
+  STORE s7,  9*REGBYTES(a0)
+  STORE s8, 10*REGBYTES(a0)
+  STORE s9, 11*REGBYTES(a0)
+  STORE s10,12*REGBYTES(a0)
+  STORE s11,13*REGBYTES(a0)
+  STORE sp, 14*REGBYTES(a0)
+
+  STORE  a1,32*REGBYTES(a0)
 
   # set EPC to this function's return address
   STORE  ra,33*REGBYTES(a0)
   ret
 
+# Remove these (or this comment) when implementing setjmp on riscv.
   .text
-  .global pop_kernel_tf
-pop_kernel_tf:
-  LOAD  t0,32*REGBYTES(a0)
+  .global pop_kernel_ctx
+pop_kernel_ctx:
+  LOAD  a1,32*REGBYTES(a0)
   LOAD  ra,33*REGBYTES(a0)
 
-  LOAD  s0,20*REGBYTES(a0)
-  LOAD  s1,21*REGBYTES(a0)
-  LOAD  s2,22*REGBYTES(a0)
-  LOAD  s3,23*REGBYTES(a0)
-  LOAD  s4,24*REGBYTES(a0)
-  LOAD  s5,25*REGBYTES(a0)
-  LOAD  s6,26*REGBYTES(a0)
-  LOAD  s7,27*REGBYTES(a0)
-  LOAD  s8,28*REGBYTES(a0)
-  LOAD  s9,29*REGBYTES(a0)
-  LOAD  sp,30*REGBYTES(a0)
-
-  mtpcr  t0,ASM_CR(PCR_SR)
+  LOAD  s0,  2*REGBYTES(a0)
+  LOAD  s1,  3*REGBYTES(a0)
+  LOAD  s2,  4*REGBYTES(a0)
+  LOAD  s3,  5*REGBYTES(a0)
+  LOAD  s4,  6*REGBYTES(a0)
+  LOAD  s5,  7*REGBYTES(a0)
+  LOAD  s6,  8*REGBYTES(a0)
+  LOAD  s7,  9*REGBYTES(a0)
+  LOAD  s8, 10*REGBYTES(a0)
+  LOAD  s9, 11*REGBYTES(a0)
+  LOAD  s10,12*REGBYTES(a0)
+  LOAD  s11,13*REGBYTES(a0)
+  LOAD  sp, 14*REGBYTES(a0)
+
+  mtpcr  a1,ASM_CR(PCR_SR)
   ret
 
 
@@ -61,16 +67,17 @@ save_tf:  # write the trap frame onto the stack
 
   ret
 
-  .globl  env_pop_tf
-env_pop_tf:  # write the trap frame onto the stack
-  # restore gprs
-  LOAD  t0,32*REGBYTES(a0)  # restore sr (should disable interrupts)
-  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)
+  .globl  pop_hw_tf
+pop_hw_tf:  # write the trap frame onto the stack
+  # restore SR.{PS, EF, U64} and disable interrupts
+  LOAD  v0,32*REGBYTES(a0)
+  mfpcr v1, ASM_CR(PCR_SR)
+  andi  v0, v0,  (SR_PS | SR_EF | SR_U64)
+  andi  v1, v1, ~(SR_PS | SR_EF | SR_U64 | SR_ET)
+  or    v0, v0, v1
+  mtpcr v0, ASM_CR(PCR_SR)
 
+  # restore gprs
   LOAD  x1,1*REGBYTES(a0)
   mtpcr  x1,ASM_CR(PCR_K0)
   LOAD  x1,2*REGBYTES(a0)
@@ -115,32 +122,34 @@ env_pop_tf:  # write the trap frame onto the stack
 
   .global  trap_entry
 trap_entry:
-  # save x1 and x2 so we can use them as temporaries
-  mtpcr x1, ASM_CR(PCR_K0)
-  mtpcr x2, ASM_CR(PCR_K1)
-
-  # when coming from kernel, continue below its stack
+  mtpcr x1, ASM_CR(PCR_K0)  # stash x1 in k0
   mfpcr x1, ASM_CR(PCR_SR)
+  mtpcr x2, ASM_CR(PCR_K1)  # stash x2 in k1
+  # when coming from kernel, continue below its stack
+  add   x2, sp, -SIZEOF_HW_TRAPFRAME
   and   x1, x1, SR_PS
-  add   x2, sp, -SIZEOF_TRAPFRAME_T
   bnez  x1, 1f
 
   # otherwise, start at the top of the per-core stack
-  la    x2, core_stacktops
   mfpcr x1, ASM_CR(PCR_COREID)
+  lui  x2, %hi(core_stacktops)
   sll   x1, x1, LOG_REGBYTES
   add   x2, x2, x1
-  LOAD  x2, 0(x2)
-  add   x2, x2, -SIZEOF_TRAPFRAME_T
+  LOAD  x2, %lo(core_stacktops)(x2)
+  add   x2, x2, -SIZEOF_HW_TRAPFRAME
 
 1:# save gprs
   STORE  x3,3*REGBYTES(x2)
   STORE  x4,4*REGBYTES(x2)
+  mfpcr  x3,ASM_CR(PCR_K0)    # retrieve x1
+  mfpcr  x4,ASM_CR(PCR_K1)    # retrieve x2
   STORE  x5,5*REGBYTES(x2)
   STORE  x6,6*REGBYTES(x2)
   STORE  x7,7*REGBYTES(x2)
   STORE  x8,8*REGBYTES(x2)
   STORE  x9,9*REGBYTES(x2)
+  STORE  x3,1*REGBYTES(x2)    # save x1
+  STORE  x4,2*REGBYTES(x2)    # save x2
   STORE  x10,10*REGBYTES(x2)
   STORE  x11,11*REGBYTES(x2)
   STORE  x12,12*REGBYTES(x2)
@@ -164,22 +173,16 @@ trap_entry:
   STORE  x30,30*REGBYTES(x2)
   STORE  x31,31*REGBYTES(x2)
 
-  mfpcr  x3,ASM_CR(PCR_K0)
-  STORE  x3,1*REGBYTES(x2)          # x1 is in PCR_K0
-  mfpcr  x3,ASM_CR(PCR_K1)
-  STORE  x3,2*REGBYTES(x2)          # x2 is in PCR_K1
-
   # get sr, epc, badvaddr, cause
-  mfpcr  x3,ASM_CR(PCR_SR)          # sr
+  mfpcr  x3,ASM_CR(PCR_SR)
+  mfpcr  x4,ASM_CR(PCR_EPC)
+  mfpcr  x5,ASM_CR(PCR_BADVADDR)
+  mfpcr  x6,ASM_CR(PCR_CAUSE)
   STORE  x3,32*REGBYTES(x2)
-  mfpcr  x4,ASM_CR(PCR_EPC)          # epc
   STORE  x4,33*REGBYTES(x2)
-  mfpcr  x3,ASM_CR(PCR_BADVADDR)      # badvaddr
-  STORE  x3,34*REGBYTES(x2)
-  mfpcr  x3,ASM_CR(PCR_CAUSE)        # cause
-  STORE  x3,35*REGBYTES(x2)
+  STORE  x5,34*REGBYTES(x2)
+  STORE  x6,35*REGBYTES(x2)
 
-  li    s9, 0
   move  sp, x2
   move  a0, x2
   j     handle_trap