@@ -17,8 +17,6 @@ mod constants {
17
17
pub ( crate ) const LEN_STACK_PER_HART : usize = 16 * 1024 ;
18
18
/// qemu-virt 最多 8 核。
19
19
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 ;
22
20
}
23
21
24
22
#[ macro_use]
@@ -36,26 +34,6 @@ use rustsbi::RustSBI;
36
34
use spin:: { Mutex , Once } ;
37
35
use uart_16550:: MmioSerialPort ;
38
36
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
-
59
37
/// 入口。
60
38
///
61
39
/// 1. 关中断
@@ -70,7 +48,7 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
70
48
#[ link_section = ".text.entry" ]
71
49
unsafe extern "C" fn _start ( ) -> ! {
72
50
#[ 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 ] ;
74
52
75
53
core:: arch:: asm!(
76
54
// 关中断
@@ -90,7 +68,7 @@ unsafe extern "C" fn _start() -> ! {
90
68
1: wfi
91
69
j 1b" ,
92
70
per_hart_stack_size = const LEN_STACK_PER_HART ,
93
- stack = sym SBI_STACK ,
71
+ stack = sym ROOT_STACK ,
94
72
rust_main = sym rust_main,
95
73
finalize = sym finalize,
96
74
options( noreturn)
@@ -227,6 +205,35 @@ fn set_pmp(board_info: &BoardInfo) {
227
205
}
228
206
}
229
207
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
+
230
237
struct Console ;
231
238
static UART : Mutex < MaybeUninit < MmioSerialPort > > = Mutex :: new ( MaybeUninit :: uninit ( ) ) ;
232
239
0 commit comments