@@ -25,15 +25,21 @@ extern crate rcore_console;
25
25
use constants:: * ;
26
26
use core:: {
27
27
convert:: Infallible ,
28
- mem:: MaybeUninit ,
28
+ mem:: { forget, MaybeUninit } ,
29
+ ptr:: NonNull ,
29
30
sync:: atomic:: { AtomicBool , Ordering :: AcqRel } ,
30
31
} ;
31
32
use device_tree:: BoardInfo ;
32
33
use execute:: Operation ;
34
+ use fast_trap:: { reuse_stack_for_trap, FastContext , FastResult , FreeTrapStack , TrapStackBlock } ;
33
35
use rustsbi:: RustSBI ;
34
36
use spin:: { Mutex , Once } ;
35
37
use uart_16550:: MmioSerialPort ;
36
38
39
+ /// 栈空间。
40
+ #[ link_section = ".bss.uninit" ]
41
+ static mut ROOT_STACK : [ Stack ; NUM_HART_MAX ] = [ Stack :: ZERO ; NUM_HART_MAX ] ;
42
+
37
43
/// 入口。
38
44
///
39
45
/// 1. 关中断
@@ -47,9 +53,6 @@ use uart_16550::MmioSerialPort;
47
53
#[ no_mangle]
48
54
#[ link_section = ".text.entry" ]
49
55
unsafe extern "C" fn _start ( ) -> ! {
50
- #[ link_section = ".bss.uninit" ]
51
- static mut ROOT_STACK : [ Stack ; NUM_HART_MAX ] = [ Stack :: ZERO ; NUM_HART_MAX ] ;
52
-
53
56
core:: arch:: asm!(
54
57
// 关中断
55
58
" csrw mie, zero" ,
@@ -60,15 +63,19 @@ unsafe extern "C" fn _start() -> ! {
60
63
addi t1, t1, 1
61
64
1: add sp, sp, t0
62
65
addi t1, t1, -1
63
- bnez t1, 1b" ,
66
+ bnez t1, 1b
67
+ call {move_stack}
68
+ " ,
64
69
" call {rust_main}" ,
65
70
// 清理,然后重启或等待
66
71
" call {finalize}
67
72
bnez a0, _start
68
73
1: wfi
69
- j 1b" ,
74
+ j 1b
75
+ " ,
70
76
per_hart_stack_size = const LEN_STACK_PER_HART ,
71
77
stack = sym ROOT_STACK ,
78
+ move_stack = sym reuse_stack_for_trap,
72
79
rust_main = sym rust_main,
73
80
finalize = sym finalize,
74
81
options( noreturn)
@@ -134,6 +141,8 @@ extern "C" fn rust_main(_hartid: usize, opaque: usize) -> Operation {
134
141
) ;
135
142
}
136
143
144
+ unsafe { ROOT_STACK [ hart_id ( ) ] . load_as_stack ( ) } ;
145
+
137
146
let hsm = HSM . wait ( ) ;
138
147
if let Some ( supervisor) = hsm. take_supervisor ( ) {
139
148
// 设置并打印 pmp
@@ -205,6 +214,19 @@ fn set_pmp(board_info: &BoardInfo) {
205
214
}
206
215
}
207
216
217
+ extern "C" fn fast_handler (
218
+ mut _ctx : FastContext ,
219
+ _a1 : usize ,
220
+ _a2 : usize ,
221
+ _a3 : usize ,
222
+ _a4 : usize ,
223
+ _a5 : usize ,
224
+ _a6 : usize ,
225
+ _a7 : usize ,
226
+ ) -> FastResult {
227
+ todo ! ( )
228
+ }
229
+
208
230
#[ panic_handler]
209
231
fn panic ( info : & core:: panic:: PanicInfo ) -> ! {
210
232
use rustsbi:: {
@@ -225,6 +247,44 @@ struct Stack([u8; LEN_STACK_PER_HART]);
225
247
impl Stack {
226
248
/// 零初始化以避免加载。
227
249
const ZERO : Self = Self ( [ 0 ; LEN_STACK_PER_HART ] ) ;
250
+
251
+ fn load_as_stack ( & ' static mut self ) {
252
+ let bottom = self . 0 . as_mut_ptr ( ) . cast ( ) ;
253
+ forget (
254
+ FreeTrapStack :: new (
255
+ StackRef ( self ) ,
256
+ unsafe { NonNull :: new_unchecked ( bottom) } ,
257
+ fast_handler,
258
+ )
259
+ . unwrap ( )
260
+ . load ( ) ,
261
+ ) ;
262
+ }
263
+ }
264
+
265
+ #[ repr( transparent) ]
266
+ struct StackRef ( & ' static mut Stack ) ;
267
+
268
+ impl AsRef < [ u8 ] > for StackRef {
269
+ #[ inline]
270
+ fn as_ref ( & self ) -> & [ u8 ] {
271
+ & self . 0 . 0
272
+ }
273
+ }
274
+
275
+ impl AsMut < [ u8 ] > for StackRef {
276
+ #[ inline]
277
+ fn as_mut ( & mut self ) -> & mut [ u8 ] {
278
+ & mut self . 0 . 0
279
+ }
280
+ }
281
+
282
+ impl TrapStackBlock for StackRef { }
283
+
284
+ impl Drop for StackRef {
285
+ fn drop ( & mut self ) {
286
+ panic ! ( "Root stack cannot be dropped" )
287
+ }
228
288
}
229
289
230
290
/// 特权软件信息。
0 commit comments