|
@@ -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);
|