for risc-v, don't store irq mask in trapframe
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Sat, 15 Dec 2012 00:08:19 +0000 (16:08 -0800)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Sat, 15 Dec 2012 03:36:37 +0000 (19:36 -0800)
kern/arch/riscv/entry.S
kern/arch/riscv/process.c

index 5a824bd..4707db5 100644 (file)
@@ -72,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)
index a80667e..1bd28e8 100644 (file)
@@ -14,7 +14,7 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[30] = stack_top-64;
-       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_S64 | SR_U64 | SR_VM;
+       tf->sr = SR_U64;
 
        tf->epc = entryp;
 
@@ -25,7 +25,7 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
 
 void proc_secure_trapframe(struct trapframe *tf)
 {
-       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_S64 | SR_U64 | SR_VM;
+       tf->sr = SR_U64;
 }
 
 /* Called when we are currently running an address space on our core and want to