浏览代码

debugging multicore boot, add some comments && bgtu -> bgt when disabling unused harts

Yifan Wu 4 年之前
父节点
当前提交
9fd778a18a
共有 1 个文件被更改,包括 28 次插入2 次删除
  1. 28 2
      platform/k210/src/main.rs

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

@@ -45,6 +45,7 @@ fn mp_hook() -> bool {
     if hartid == 0 {
         true
     } else {
+        //println!("[rustsbi] I know i am hart {} not hart 0, wfi", hartid);
         unsafe {
             // Clear IPI
             msip::clear_ipi(hartid);
@@ -54,14 +55,19 @@ fn mp_hook() -> bool {
             loop {
                 wfi();
                 if mip::read().msoft() {
+                    println!("[rustsbi] wakeup hart {}", mhartid::read());
+                    println!("[rustsbi] hart {} can go forward!", mhartid::read());
                     break;
                 }
             }
 
+            println!("[rustsbi] hart {} exited the loop!", mhartid::read());
             // Stop listening for software interrupts
             mie::clear_msoft();
+            println!("[rustsbi] mie::clear_msoft()");
             // Clear IPI
             msip::clear_ipi(hartid);
+            println!("[rustsbi] msip::clear_ipi()");
         }
         false
     }
@@ -76,7 +82,7 @@ fn main() -> ! {
         csrr    a2, mhartid
         lui     t0, %hi(_max_hart_id)
         add     t0, t0, %lo(_max_hart_id)
-        bgtu    a2, t0, _start_abort
+        bgt     a2, t0, _start_abort
         la      sp, _stack_start
         lui     t0, %hi(_hart_stack_size)
         add     t0, t0, %lo(_hart_stack_size)
@@ -104,7 +110,8 @@ fn main() -> ! {
     "
         )
     };
-    if mp_hook() {
+    let hart_boot = mp_hook();
+    if hart_boot {
         extern "C" {
             static mut _ebss: u32;
             static mut _sbss: u32;
@@ -117,6 +124,7 @@ fn main() -> ! {
             r0::init_data(&mut _sdata, &mut _edata, &_sidata);
         } 
     }
+    println!("after mp_hook hartid = {}", mhartid::read());
 
     extern "C" {
         fn _start_trap();
@@ -154,11 +162,25 @@ fn main() -> ! {
                 1
             }
             fn send_ipi_many(&mut self, hart_mask: rustsbi::HartMask) {
+                println!("[rustsbi] into send_ipi_many!");
                 use k210_hal::clint::msip;
                 for i in 0..=1 {
+                    println!("[rustsbi] i = {}", i);
                     if hart_mask.has_bit(i) {
+                        println!("has bit, send ipi!");
                         msip::set_ipi(i);
+                        /*
+                        use k210_hal::clint::mtime;
+                        let cur_time = mtime::read();
+                        loop {
+                            if mtime::read() > cur_time + 100 {
+                                break;
+                            }
+                        }
+                         */
                         msip::clear_ipi(i);
+                    } else {
+                        println!("not bit, do not send ipi!");
                     }
                 }
             }
@@ -202,9 +224,12 @@ fn main() -> ! {
             pac::PLIC::unmask(mhartid::read(), Interrupt::GPIOHS0);
         }
         boot.clear_interrupt_pending_bits();
+    } else {
+        println!("[rustsbi] hart {} do not need initialize!", mhartid::read());
     }
     
     unsafe {
+        println!("[rustsbi] hart {} now setting intr delegation!", mhartid::read());
         mideleg::set_sext();
         mideleg::set_stimer();
         mideleg::set_ssoft();
@@ -246,6 +271,7 @@ fn main() -> ! {
         fn _s_mode_start();
     }
     unsafe {
+        println!("[rustsbi] hart {} is ready into S Mode!", mhartid::read());
         mepc::write(_s_mode_start as usize);
         mstatus::set_mpp(MPP::Supervisor);
         enter_privileged(mhartid::read(), 0x2333333366666666);