main.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #![no_std]
  2. #![no_main]
  3. // TODO: RustSBI EFI module
  4. #[no_mangle]
  5. extern "C" fn rust_main(_hart_id: usize, _opaque: usize) {
  6. // TODO
  7. }
  8. #[no_mangle]
  9. extern "C" fn rust_sbi_exit() -> ! {
  10. sbi_rt::system_reset(sbi_rt::Shutdown, sbi_rt::NoReason);
  11. loop {
  12. core::hint::spin_loop();
  13. }
  14. }
  15. #[panic_handler]
  16. fn panic(_info: &core::panic::PanicInfo) -> ! {
  17. // TODO panic handler
  18. loop {
  19. core::hint::spin_loop();
  20. }
  21. }
  22. const LEN_STACK_PER_HART: usize = 16 * 1024;
  23. pub const NUM_HART_MAX: usize = 8;
  24. #[link_section = ".bss.uninit"]
  25. static mut STACK: [u8; NUM_HART_MAX * LEN_STACK_PER_HART] = [0; NUM_HART_MAX * LEN_STACK_PER_HART];
  26. // If booted with RISC-V SBI, a0 must include hart ID, while a1 must be an opaque register
  27. #[naked_function::naked]
  28. #[link_section = ".text.entry"]
  29. #[export_name = "_start"]
  30. unsafe extern "C" fn start() -> ! {
  31. asm!(
  32. // 1. Turn off interrupt
  33. " csrw sie, zero",
  34. // 2. Initialize programming language runtime
  35. // only initialize if it is boot hart (hart ID 0)
  36. " bnez a0, 3f",
  37. // clear bss segment
  38. " la t0, sbss
  39. la t1, ebss
  40. 2: bgeu t0, t1, 2f
  41. sd zero, 0(t0)
  42. addi t0, t0, 8
  43. j 2b",
  44. // prepare data segment
  45. " la t3, sidata
  46. la t4, sdata
  47. la t5, edata
  48. 2: bgeu t4, t5, 2f
  49. ld t6, 0(t3)
  50. sd t6, 0(t4)
  51. addi t3, t3, 8
  52. addi t4, t4, 8
  53. j 2b",
  54. "3:",
  55. // 3. Prepare stack for each hart
  56. " la sp, {stack}
  57. li t1, {per_hart_stack_size}
  58. addi t2, a0, 1
  59. 2: add sp, sp, t1
  60. addi t2, t2, -1
  61. bnez t2, 2b",
  62. // 4. Start main function
  63. " call {main}",
  64. " call {exit}",
  65. stack = sym STACK,
  66. per_hart_stack_size = const LEN_STACK_PER_HART,
  67. main = sym rust_main,
  68. exit = sym rust_sbi_exit
  69. )
  70. }