Explorar el Código

Merge pull request #5 from wyfcyx/master

Disabling M external when software delegating M timer into S mode
Luo Jia hace 4 años
padre
commit
82f20242ae
Se han modificado 1 ficheros con 11 adiciones y 1 borrados
  1. 11 1
      platform/k210/src/main.rs

+ 11 - 1
platform/k210/src/main.rs

@@ -365,6 +365,14 @@ extern "C" fn start_trap_rust(trap_frame: &mut TrapFrame) {
             if trap_frame.a7 == 0x09 {
                 unsafe { DEVINTRENTRY = trap_frame.a0; }
             } else {
+                if trap_frame.a7 == 0x0 {
+                    unsafe {
+                        let mtip = mip::read().mtimer();
+                        if mtip {
+                            mie::set_mext();
+                        }
+                    }
+                }
                 let params = [trap_frame.a0, trap_frame.a1, trap_frame.a2, trap_frame.a3];
                 let ans = rustsbi::ecall(trap_frame.a7, trap_frame.a6, params);
                 trap_frame.a0 = ans.error;
@@ -381,6 +389,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 +431,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");
@@ -472,7 +482,7 @@ extern "C" fn start_trap_rust(trap_frame: &mut TrapFrame) {
             "Unhandled trap! mcause: {:?}, mepc: {:016x?}, mtval: {:016x?}",
             cause,
             mepc::read(),
-            mtval::read()
+            mtval::read(),
         ),
     }
 }