Browse Source

Fix potential deadlock for new devintr

Yifan Wu 4 years ago
parent
commit
08a78ff27a
2 changed files with 19 additions and 2 deletions
  1. 15 2
      platform/k210/src/main.rs
  2. 4 0
      rustsbi/src/ecall/legacy.rs

+ 15 - 2
platform/k210/src/main.rs

@@ -381,6 +381,7 @@ extern "C" fn start_trap_rust(trap_frame: &mut TrapFrame) {
         Trap::Interrupt(Interrupt::MachineTimer) => {
             unsafe {
                 mip::set_stimer();
+                mie::clear_mext();
                 mie::clear_mtimer();
             }
         }
@@ -422,6 +423,7 @@ extern "C" fn start_trap_rust(trap_frame: &mut TrapFrame) {
                 // compiler helps us save/restore caller-saved registers
                 devintr();
                 // restore mstatus
+                mstatus = mstatus &!(3 << 11);
                 mstatus |= mpp << 11;
                 mstatus -= 1 << 17;
                 llvm_asm!("csrw mstatus, $0" :: "r"(mstatus) :: "volatile");
@@ -469,10 +471,21 @@ extern "C" fn start_trap_rust(trap_frame: &mut TrapFrame) {
             }
         }
         cause => panic!(
-            "Unhandled trap! mcause: {:?}, mepc: {:016x?}, mtval: {:016x?}",
+            "Unhandled trap! mcause: {:?}, mepc: {:016x?}, mtval: {:016x?}, sp: {:#x}, _stack_start = {:#x}",
             cause,
             mepc::read(),
-            mtval::read()
+            mtval::read(),
+            unsafe {
+                let mut sp: usize;
+                llvm_asm!("mv $0, sp" : "=r"(sp) ::: "volatile");
+                sp
+            },
+            {
+                extern "C" {
+                    fn _stack_start();
+                }
+                _stack_start as usize
+            }
         ),
     }
 }

+ 4 - 0
rustsbi/src/ecall/legacy.rs

@@ -34,11 +34,13 @@ pub fn set_timer_64(time_value: usize) -> SbiRet {
     if mtip {
         unsafe {
             mie::clear_mtimer();
+            mie::clear_mext();
             mip::set_stimer();
         }
     } else {
         unsafe {
             mie::set_mtimer();
+            mie::set_mext();
             mip::clear_stimer();
         }
     }
@@ -55,11 +57,13 @@ pub fn set_timer_32(arg0: usize, arg1: usize) -> SbiRet {
     if mtip {
         unsafe {
             mie::clear_mtimer();
+            mie::clear_mext();
             mip::set_stimer();
         }
     } else {
         unsafe {
             mie::set_mtimer();
+            mie::set_mext();
             mip::clear_stimer();
         }
     }