@@ -7,6 +7,7 @@ mod clint;
7
7
mod device_tree;
8
8
mod hart_csr_utils;
9
9
mod qemu_test;
10
+ mod riscv_spec;
10
11
mod trap_vec;
11
12
12
13
mod constants {
@@ -32,10 +33,11 @@ use core::{
32
33
use device_tree:: BoardInfo ;
33
34
use fast_trap:: { FastContext , FastResult , FlowContext , FreeTrapStack , TrapStackBlock } ;
34
35
use hsm_cell:: HsmCell ;
35
- use riscv :: register :: * ;
36
+ use riscv_spec :: * ;
36
37
use rustsbi:: RustSBI ;
37
38
use sbi_spec:: binary:: SbiRet ;
38
39
use spin:: { Mutex , Once } ;
40
+ use trap_vec:: { load_trap_vec, trap_vec} ;
39
41
use uart_16550:: MmioSerialPort ;
40
42
41
43
/// 栈空间。
@@ -44,10 +46,6 @@ static mut ROOT_STACK: [Stack; NUM_HART_MAX] = [Stack::ZERO; NUM_HART_MAX];
44
46
45
47
/// 入口。
46
48
///
47
- /// 1. 关中断
48
- /// 2. 设置启动栈
49
- /// 3. 跳转到 rust 入口函数
50
- ///
51
49
/// # Safety
52
50
///
53
51
/// 裸函数。
@@ -56,9 +54,6 @@ static mut ROOT_STACK: [Stack; NUM_HART_MAX] = [Stack::ZERO; NUM_HART_MAX];
56
54
#[ link_section = ".text.entry" ]
57
55
unsafe extern "C" fn _start ( ) -> ! {
58
56
asm ! (
59
- // 关中断
60
- " csrw mie, zero" ,
61
- // 设置栈
62
57
" la sp, {stack}
63
58
li t0, {per_hart_stack_size}
64
59
csrr t1, mhartid
@@ -67,14 +62,14 @@ unsafe extern "C" fn _start() -> ! {
67
62
addi t1, t1, -1
68
63
bnez t1, 1b
69
64
call {move_stack}
65
+ call {rust_main}
66
+ j {trap}
70
67
" ,
71
- " call {rust_main}" ,
72
- " j {trap}" ,
73
68
per_hart_stack_size = const LEN_STACK_PER_HART ,
74
69
stack = sym ROOT_STACK ,
75
70
move_stack = sym fast_trap:: reuse_stack_for_trap,
76
71
rust_main = sym rust_main,
77
- trap = sym fast_trap :: trap_entry ,
72
+ trap = sym trap_vec ,
78
73
options( noreturn)
79
74
)
80
75
}
@@ -175,8 +170,8 @@ extern "C" fn rust_main(_hartid: usize, opaque: usize) {
175
170
asm ! ( "csrw mideleg, {}" , in( reg) !0 ) ;
176
171
asm ! ( "csrw medeleg, {}" , in( reg) !0 ) ;
177
172
asm ! ( "csrw mcounteren, {}" , in( reg) !0 ) ;
178
- medeleg:: clear_supervisor_env_call ( ) ;
179
- medeleg:: clear_machine_env_call ( ) ;
173
+ riscv :: register :: medeleg:: clear_supervisor_env_call ( ) ;
174
+ riscv :: register :: medeleg:: clear_machine_env_call ( ) ;
180
175
}
181
176
}
182
177
@@ -187,6 +182,7 @@ fn hart_id() -> usize {
187
182
188
183
/// 设置 PMP。
189
184
fn set_pmp ( board_info : & BoardInfo ) {
185
+ use riscv:: register:: * ;
190
186
let mem = & board_info. mem ;
191
187
unsafe {
192
188
pmpcfg0:: set_pmp ( 0 , Range :: OFF , Permission :: NONE , false ) ;
@@ -220,7 +216,10 @@ extern "C" fn fast_handler(
220
216
a6 : usize ,
221
217
a7 : usize ,
222
218
) -> FastResult {
223
- use mcause:: { Exception as E , Interrupt as I , Trap as T } ;
219
+ use riscv:: register:: {
220
+ mcause:: { self , Exception as E , Interrupt as I , Trap as T } ,
221
+ mepc, mstatus, mtval,
222
+ } ;
224
223
225
224
let cause = mcause:: read ( ) ;
226
225
// 启动
@@ -232,21 +231,21 @@ extern "C" fn fast_handler(
232
231
match unsafe { hart_ctx. hsm . local ( ) } . start ( ) {
233
232
Ok ( supervisor) => {
234
233
unsafe {
235
- mtvec :: write ( trap_vec :: trap_vec as _ , mtvec :: TrapMode :: Vectored ) ;
234
+ load_trap_vec ( true ) ;
236
235
mstatus:: set_mpie ( ) ;
237
236
mstatus:: set_mpp ( mstatus:: MPP :: Supervisor ) ;
238
- asm ! ( "csrw mie, {}" , in ( reg ) ( 1 << 3 ) | ( 1 << 7 ) | ( 1 << 11 ) ) ;
237
+ mie :: write ( mie:: MSIE | mie :: MTIE | mie :: MEIE ) ;
239
238
}
240
239
hart_ctx. trap . a [ 0 ] = hart_id;
241
240
hart_ctx. trap . a [ 1 ] = supervisor. opaque ;
242
241
hart_ctx. trap . pc = supervisor. start_addr ;
243
242
}
244
243
Err ( _state) => {
245
244
unsafe {
246
- mtvec :: write ( trap_vec :: trap_vec as _ , mtvec :: TrapMode :: Direct ) ;
245
+ load_trap_vec ( false ) ;
247
246
mstatus:: set_mpie ( ) ;
248
247
mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
249
- asm ! ( "csrw mie, {}" , in ( reg ) 1 << 3 ) ;
248
+ mie:: write ( mie :: MSIE ) ;
250
249
} ;
251
250
hart_ctx. trap . pc = _stop as usize ;
252
251
}
@@ -265,9 +264,9 @@ extern "C" fn fast_handler(
265
264
if ret. is_ok ( ) && a7 == hsm:: EID_HSM {
266
265
if a6 == hsm:: HART_STOP {
267
266
unsafe {
268
- mtvec :: write ( trap_vec :: trap_vec as _ , mtvec :: TrapMode :: Direct ) ;
267
+ load_trap_vec ( true ) ;
269
268
mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
270
- asm ! ( "csrw mie, {}" , in ( reg ) 1 << 3 ) ;
269
+ mie:: write ( mie :: MSIE ) ;
271
270
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . trap . pc = _stop as usize ;
272
271
}
273
272
return ctx. call ( 0 ) ;
@@ -276,7 +275,7 @@ extern "C" fn fast_handler(
276
275
&& ctx. a0 ( ) == hsm:: HART_SUSPEND_TYPE_NON_RETENTIVE as usize
277
276
{
278
277
unsafe {
279
- mtvec :: write ( trap_vec :: trap_vec as _ , mtvec :: TrapMode :: Direct ) ;
278
+ load_trap_vec ( false ) ;
280
279
mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
281
280
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . trap . pc = _stop as usize ;
282
281
}
0 commit comments