Always keep floating point enabled on RISC-V
authorAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 11:24:24 +0000 (04:24 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Tue, 23 Apr 2013 11:24:24 +0000 (04:24 -0700)
kern/arch/riscv/entry.S
kern/arch/riscv/process.c
kern/arch/riscv/trap.c

index bc3da6f..484beda 100644 (file)
@@ -66,16 +66,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  v0,32*REGBYTES(a0)  # restore sr (should disable interrupts)
+  .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  v1, v1, ~(SR_PS | SR_EF | SR_U64)
-  andi  v0, v0, SR_PS | SR_EF | SR_U64
+  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)
index 3594a0c..48a2be5 100644 (file)
@@ -28,7 +28,7 @@ void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[GPR_SP] = stack_top-64;
-       tf->sr = SR_U64;
+       tf->sr = SR_U64 | SR_EF;
 
        tf->epc = entryp;
 
@@ -42,7 +42,7 @@ void proc_secure_ctx(struct user_context *ctx)
 {
        struct hw_trapframe *tf = &ctx->tf.hw_tf;
        ctx->type = ROS_HW_CTX;
-       tf->sr = SR_U64;
+       tf->sr = SR_U64 | SR_EF;
 }
 
 /* Called when we are currently running an address space on our core and want to
index 9d0bf6f..3584958 100644 (file)
@@ -270,17 +270,6 @@ handle_illegal_instruction(struct hw_trapframe *state)
 }
 
 static void
-handle_fp_disabled(struct hw_trapframe *hw_tf)
-{
-       if (in_kernel(hw_tf))
-               panic("kernel executed an FP instruction!");
-
-       hw_tf->sr |= SR_EF;
-       extern void env_pop_tf(struct hw_trapframe *tf);        /* in asm */
-       env_pop_tf(hw_tf); /* We didn't save our TF, so don't proc_restartcore */
-}
-
-static void
 handle_syscall(struct hw_trapframe *state)
 {
        uintptr_t a0 = state->gpr[GPR_A0];
@@ -307,7 +296,6 @@ handle_trap(struct hw_trapframe *hw_tf)
          [CAUSE_FAULT_FETCH] = handle_fault_fetch,
          [CAUSE_ILLEGAL_INSTRUCTION] = handle_illegal_instruction,
          [CAUSE_PRIVILEGED_INSTRUCTION] = handle_illegal_instruction,
-         [CAUSE_FP_DISABLED] = handle_fp_disabled,
          [CAUSE_SYSCALL] = handle_syscall,
          [CAUSE_BREAKPOINT] = handle_breakpoint,
          [CAUSE_MISALIGNED_LOAD] = handle_misaligned_load,