RISC-V architecture bugfix potpourri
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Tue, 8 Nov 2011 09:38:28 +0000 (01:38 -0800)
committerAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Tue, 8 Nov 2011 09:38:28 +0000 (01:38 -0800)
kern/arch/riscv/boot.S
kern/arch/riscv/entry.S
kern/arch/riscv/kdebug.c
kern/arch/riscv/trap.c

index 41f76b8..0aa0a24 100644 (file)
@@ -37,7 +37,8 @@ _start:
   mfpcr  t0, ASM_CR(PCR_COREID)
   bnez   t0, notcore0
 
-  // set up stack
+  // terminate frame pointer for backtracing and set up stack
+  li     s9, 0
   la     sp, bootstacktop
   li     t1, KERN_LOAD_ADDR
   sub    sp, sp, t1
index 87c1f25..24f7949 100644 (file)
@@ -1,5 +1,6 @@
 #include <arch/pcr.h>
 #include <arch/trap.h>
+#include <ros/memlayout.h>
 
 #ifdef __riscv64
 # define STORE    sd
@@ -62,62 +63,6 @@ pop_kernel_tf:
   .ent  save_tf
 save_tf:  # write the trap frame onto the stack
 
-  # save gprs
-  STORE  x3,3*REGBYTES(x2)
-  STORE  x4,4*REGBYTES(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  x10,10*REGBYTES(x2)
-  STORE  x11,11*REGBYTES(x2)
-  STORE  x12,12*REGBYTES(x2)
-  STORE  x13,13*REGBYTES(x2)
-  STORE  x14,14*REGBYTES(x2)
-  STORE  x15,15*REGBYTES(x2)
-  STORE  x16,16*REGBYTES(x2)
-  STORE  x17,17*REGBYTES(x2)
-  STORE  x18,18*REGBYTES(x2)
-  STORE  x19,19*REGBYTES(x2)
-  STORE  x20,20*REGBYTES(x2)
-  STORE  x21,21*REGBYTES(x2)
-  STORE  x22,22*REGBYTES(x2)
-  STORE  x23,23*REGBYTES(x2)
-  STORE  x24,24*REGBYTES(x2)
-  STORE  x25,25*REGBYTES(x2)
-  STORE  x26,26*REGBYTES(x2)
-  STORE  x27,27*REGBYTES(x2)
-  STORE  x28,28*REGBYTES(x2)
-  STORE  x29,29*REGBYTES(x2)
-  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
-  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)
-
-  # get faulting insn, if it wasn't a fetch-related trap
-  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:
   ret
   .end  save_tf
 
@@ -174,19 +119,83 @@ env_pop_tf:  # write the trap frame onto the stack
   .global  trap_entry
   .ent  trap_entry
 trap_entry:
-  mtpcr ra,ASM_CR(PCR_K0)
-  mtpcr x2,ASM_CR(PCR_K1)
+  # 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
-  mfpcr ra,ASM_CR(PCR_SR)
-  and   ra,ra,SR_PS
+  mfpcr x1, ASM_CR(PCR_SR)
+  and   x1, x1, SR_PS
   add   x2, sp, -SIZEOF_TRAPFRAME_T
-  bnez  ra, 1f
-  la    x2,bootstacktop-SIZEOF_TRAPFRAME_T
+  bnez  x1, 1f
+
+  # otherwise, start at the top of the per-core stack
+  la    x2, percore_stacks - SIZEOF_TRAPFRAME_T
+  mfpcr x1, ASM_CR(PCR_COREID)
+  add   x1, x1, 1
+  sll   x1, x1, KSTKSHIFT
+  add   x2, x2, x1
 
-1:jal   save_tf
-  move  sp,x2
-  move  a0,x2
+1:# save gprs
+  STORE  x3,3*REGBYTES(x2)
+  STORE  x4,4*REGBYTES(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  x10,10*REGBYTES(x2)
+  STORE  x11,11*REGBYTES(x2)
+  STORE  x12,12*REGBYTES(x2)
+  STORE  x13,13*REGBYTES(x2)
+  STORE  x14,14*REGBYTES(x2)
+  STORE  x15,15*REGBYTES(x2)
+  STORE  x16,16*REGBYTES(x2)
+  STORE  x17,17*REGBYTES(x2)
+  STORE  x18,18*REGBYTES(x2)
+  STORE  x19,19*REGBYTES(x2)
+  STORE  x20,20*REGBYTES(x2)
+  STORE  x21,21*REGBYTES(x2)
+  STORE  x22,22*REGBYTES(x2)
+  STORE  x23,23*REGBYTES(x2)
+  STORE  x24,24*REGBYTES(x2)
+  STORE  x25,25*REGBYTES(x2)
+  STORE  x26,26*REGBYTES(x2)
+  STORE  x27,27*REGBYTES(x2)
+  STORE  x28,28*REGBYTES(x2)
+  STORE  x29,29*REGBYTES(x2)
+  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
+  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)
+
+  # 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
   j     handle_trap
   .end  trap_entry
 
index e5dbe01..99fd293 100644 (file)
@@ -26,4 +26,9 @@ int debuginfo_eip(uintptr_t eip, struct eipdebuginfo *info)
 void
 backtrace(void)
 {
+       static bool once = TRUE;
+       if (once) {
+               warn("Not implemented for RISC-V");
+               once = FALSE;
+       }
 }
index c148fc7..446d9b9 100644 (file)
@@ -334,7 +334,7 @@ handle_fault_fetch(trapframe_t* state)
                panic("Instruction Page Fault in the Kernel at %p!", state->badvaddr);
        }
        
-       if(handle_page_fault(current, state->badvaddr, PROT_READ))
+       if(handle_page_fault(current, state->badvaddr, PROT_EXEC))
                unhandled_trap(state, "Instruction Page Fault");
 }