Skip to content

Commit fef526e

Browse files
committed
refactor(rustsbi-qemu): 重构之前的温和修改
Signed-off-by: YdrMaster <[email protected]>
1 parent 4aeadce commit fef526e

File tree

1 file changed

+31
-24
lines changed

1 file changed

+31
-24
lines changed

rustsbi-qemu/src/main.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ mod constants {
1717
pub(crate) const LEN_STACK_PER_HART: usize = 16 * 1024;
1818
/// qemu-virt 最多 8 核。
1919
pub(crate) const NUM_HART_MAX: usize = 8;
20-
/// SBI 软件全部栈空间容量。
21-
pub(crate) const LEN_STACK_SBI: usize = LEN_STACK_PER_HART * NUM_HART_MAX;
2220
}
2321

2422
#[macro_use]
@@ -36,26 +34,6 @@ use rustsbi::RustSBI;
3634
use spin::{Mutex, Once};
3735
use uart_16550::MmioSerialPort;
3836

39-
/// 特权软件信息。
40-
#[derive(Debug)]
41-
struct Supervisor {
42-
start_addr: usize,
43-
opaque: usize,
44-
}
45-
46-
#[cfg_attr(not(test), panic_handler)]
47-
fn panic(info: &core::panic::PanicInfo) -> ! {
48-
use rustsbi::{
49-
spec::srst::{RESET_REASON_SYSTEM_FAILURE, RESET_TYPE_SHUTDOWN},
50-
Reset,
51-
};
52-
// 输出的信息大概是“[rustsbi-panic] hart 0 panicked at ...”
53-
println!("[rustsbi-panic] hart {} {info}", hart_id());
54-
println!("[rustsbi-panic] system shutdown scheduled due to RustSBI panic");
55-
qemu_test::get().system_reset(RESET_TYPE_SHUTDOWN, RESET_REASON_SYSTEM_FAILURE);
56-
unreachable!()
57-
}
58-
5937
/// 入口。
6038
///
6139
/// 1. 关中断
@@ -70,7 +48,7 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
7048
#[link_section = ".text.entry"]
7149
unsafe extern "C" fn _start() -> ! {
7250
#[link_section = ".bss.uninit"]
73-
static mut SBI_STACK: [u8; LEN_STACK_SBI] = [0; LEN_STACK_SBI];
51+
static mut ROOT_STACK: [Stack; NUM_HART_MAX] = [Stack::ZERO; NUM_HART_MAX];
7452

7553
core::arch::asm!(
7654
// 关中断
@@ -90,7 +68,7 @@ unsafe extern "C" fn _start() -> ! {
9068
1: wfi
9169
j 1b",
9270
per_hart_stack_size = const LEN_STACK_PER_HART,
93-
stack = sym SBI_STACK,
71+
stack = sym ROOT_STACK,
9472
rust_main = sym rust_main,
9573
finalize = sym finalize,
9674
options(noreturn)
@@ -227,6 +205,35 @@ fn set_pmp(board_info: &BoardInfo) {
227205
}
228206
}
229207

208+
#[panic_handler]
209+
fn panic(info: &core::panic::PanicInfo) -> ! {
210+
use rustsbi::{
211+
spec::srst::{RESET_REASON_SYSTEM_FAILURE, RESET_TYPE_SHUTDOWN},
212+
Reset,
213+
};
214+
// 输出的信息大概是“[rustsbi-panic] hart 0 panicked at ...”
215+
println!("[rustsbi-panic] hart {} {info}", hart_id());
216+
println!("[rustsbi-panic] system shutdown scheduled due to RustSBI panic");
217+
qemu_test::get().system_reset(RESET_TYPE_SHUTDOWN, RESET_REASON_SYSTEM_FAILURE);
218+
unreachable!()
219+
}
220+
221+
/// 类型化栈。
222+
#[repr(C, align(128))]
223+
struct Stack([u8; LEN_STACK_PER_HART]);
224+
225+
impl Stack {
226+
/// 零初始化以避免加载。
227+
const ZERO: Self = Self([0; LEN_STACK_PER_HART]);
228+
}
229+
230+
/// 特权软件信息。
231+
#[derive(Debug)]
232+
struct Supervisor {
233+
start_addr: usize,
234+
opaque: usize,
235+
}
236+
230237
struct Console;
231238
static UART: Mutex<MaybeUninit<MmioSerialPort>> = Mutex::new(MaybeUninit::uninit());
232239

0 commit comments

Comments
 (0)