multi_core.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #![no_std]
  2. #![no_main]
  3. extern crate panic_halt;
  4. extern crate riscv;
  5. extern crate riscv_rt;
  6. use riscv::register::{mie, mip, mhartid};
  7. use riscv::asm::wfi;
  8. use riscv_rt::entry;
  9. #[export_name = "_mp_hook"]
  10. pub extern "Rust" fn user_mp_hook() -> bool {
  11. let hartid = mhartid::read();
  12. if hartid == 0 {
  13. true
  14. } else {
  15. let addr = 0x02000000 + hartid * 4;
  16. unsafe {
  17. // Clear IPI
  18. (addr as *mut u32).write_volatile(0);
  19. // Start listening for software interrupts
  20. mie::set_msoft();
  21. loop {
  22. wfi();
  23. if mip::read().msoft() {
  24. break;
  25. }
  26. }
  27. // Start listening for software interrupts
  28. mie::clear_msoft();
  29. // Clear IPI
  30. (addr as *mut u32).write_volatile(0);
  31. }
  32. false
  33. }
  34. }
  35. #[entry]
  36. fn main() -> ! {
  37. let hartid = mhartid::read();
  38. if hartid == 0 {
  39. // Waking hart 1...
  40. let addr = 0x02000004;
  41. unsafe {
  42. (addr as *mut u32).write_volatile(1);
  43. }
  44. }
  45. loop { }
  46. }