@@ -218,7 +218,7 @@ extern "C" fn fast_handler(
218
218
) -> FastResult {
219
219
use riscv:: register:: {
220
220
mcause:: { self , Exception as E , Interrupt as I , Trap as T } ,
221
- mepc , mstatus , mtval,
221
+ mtval,
222
222
} ;
223
223
224
224
let cause = mcause:: read ( ) ;
@@ -231,21 +231,25 @@ extern "C" fn fast_handler(
231
231
match unsafe { hart_ctx. hsm . local ( ) } . start ( ) {
232
232
Ok ( supervisor) => {
233
233
unsafe {
234
- load_trap_vec ( true ) ;
235
- mstatus:: set_mpie ( ) ;
236
- mstatus:: set_mpp ( mstatus:: MPP :: Supervisor ) ;
234
+ let mut status = mstatus:: read ( ) ;
235
+ status &= !mstatus:: MPP ;
236
+ status |= mstatus:: MPIE | mstatus:: MPP_SUPERVISOR ;
237
+ mstatus:: write ( status) ;
237
238
mie:: write ( mie:: MSIE | mie:: MTIE | mie:: MEIE ) ;
239
+ load_trap_vec ( true ) ;
238
240
}
239
241
hart_ctx. trap . a [ 0 ] = hart_id;
240
242
hart_ctx. trap . a [ 1 ] = supervisor. opaque ;
241
243
hart_ctx. trap . pc = supervisor. start_addr ;
242
244
}
243
245
Err ( _state) => {
244
246
unsafe {
245
- load_trap_vec ( false ) ;
246
- mstatus:: set_mpie ( ) ;
247
- mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
247
+ let mut status = mstatus:: read ( ) ;
248
+ status &= !mstatus:: MPP ;
249
+ status |= mstatus:: MPIE | mstatus:: MPP_MACHINE ;
250
+ mstatus:: write ( status) ;
248
251
mie:: write ( mie:: MSIE ) ;
252
+ load_trap_vec ( false ) ;
249
253
} ;
250
254
hart_ctx. trap . pc = _stop as usize ;
251
255
}
@@ -262,27 +266,27 @@ extern "C" fn fast_handler(
262
266
[ ctx. a0 ( ) , a1, a2, a3, a4, a5] ,
263
267
) ;
264
268
if ret. is_ok ( ) && a7 == hsm:: EID_HSM {
269
+ // 关闭
265
270
if a6 == hsm:: HART_STOP {
266
271
unsafe {
267
- load_trap_vec ( true ) ;
268
- mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
272
+ load_trap_vec ( false ) ;
269
273
mie:: write ( mie:: MSIE ) ;
270
274
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . trap . pc = _stop as usize ;
271
275
}
272
276
return ctx. call ( 0 ) ;
273
277
}
278
+ // 不可恢复挂起
274
279
if a6 == hsm:: HART_SUSPEND
275
280
&& ctx. a0 ( ) == hsm:: HART_SUSPEND_TYPE_NON_RETENTIVE as usize
276
281
{
277
282
unsafe {
278
283
load_trap_vec ( false ) ;
279
- mstatus:: set_mpp ( mstatus:: MPP :: Machine ) ;
280
284
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . trap . pc = _stop as usize ;
281
285
}
282
286
return ctx. call ( 0 ) ;
283
287
}
284
288
}
285
- mepc:: write ( mepc :: read ( ) + 4 ) ;
289
+ mepc:: next ( ) ;
286
290
ctx. save_args ( ret. value , a2, a3, a4, a5, a6, a7) ;
287
291
ctx. write_a ( 0 , ret. error ) ;
288
292
ctx. restore ( )
@@ -469,18 +473,19 @@ impl rustsbi::Hsm for Hsm {
469
473
spec:: HART_SUSPEND_TYPE_RETENTIVE => unsafe {
470
474
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . hsm . local ( ) . suspend ( ) ;
471
475
asm ! (
472
- " la {0}, 1f
473
- csrrw {0}, mtvec, {0}
474
- csrrw {1}, mepc, {1}
475
- csrrw {2}, mstatus, {2 }
476
+ " la {0}, 1f
477
+ csrrw {0}, mtvec, {0}
478
+ csrr {1}, mepc
479
+ csrrsi {2}, mstatus, {mie }
476
480
wfi
477
- 1: csrrw {2}, mstatus, {2}
478
- csrrw {1}, mepc, {1}
479
- csrrw {0}, mtvec, {0}
481
+ 1: csrw mstatus, {2}
482
+ csrw mepc, {1}
483
+ csrw mtvec, {0}
480
484
" ,
481
485
out( reg) _,
482
486
out( reg) _,
483
487
out( reg) _,
488
+ mie = const mstatus:: MIE ,
484
489
) ;
485
490
ROOT_STACK [ hart_id ( ) ] . hart_context ( ) . hsm . local ( ) . resume ( ) ;
486
491
SbiRet :: success ( 0 )
0 commit comments