@@ -214,6 +214,10 @@ extern "C" fn fast_handler(
214
214
} ) ;
215
215
mie:: write ( mie:: MSIE | mie:: MTIE ) ;
216
216
trap_vec:: load ( true ) ;
217
+ unsafe {
218
+ riscv:: register:: sstatus:: clear_sie ( ) ;
219
+ riscv:: register:: satp:: write ( 0 ) ;
220
+ }
217
221
ctx. regs ( ) . a [ 0 ] = hart_id;
218
222
ctx. regs ( ) . a [ 1 ] = supervisor. opaque ;
219
223
ctx. regs ( ) . pc = supervisor. start_addr ;
@@ -254,8 +258,13 @@ extern "C" fn fast_handler(
254
258
if a6 == hsm:: HART_SUSPEND
255
259
&& ctx. a0 ( ) == hsm:: HART_SUSPEND_TYPE_NON_RETENTIVE as usize
256
260
{
257
- trap_vec:: load ( false ) ;
258
- ctx. regs ( ) . pc = _stop as _ ;
261
+ unsafe {
262
+ riscv:: register:: sstatus:: clear_sie ( ) ;
263
+ riscv:: register:: satp:: write ( 0 ) ;
264
+ }
265
+ ctx. regs ( ) . a [ 0 ] = hart_id ( ) ;
266
+ ctx. regs ( ) . a [ 1 ] = a2;
267
+ ctx. regs ( ) . pc = a1;
259
268
return ctx. call ( 0 ) ;
260
269
}
261
270
}
@@ -389,23 +398,18 @@ impl rustsbi::Hsm for Hsm {
389
398
}
390
399
}
391
400
392
- fn hart_suspend ( & self , suspend_type : u32 , resume_addr : usize , opaque : usize ) -> SbiRet {
393
- use rustsbi:: spec:: hsm as spec;
394
- match suspend_type {
395
- spec:: HART_SUSPEND_TYPE_NON_RETENTIVE => {
396
- local_hsm ( ) . suspend_non_retentive ( Supervisor {
397
- start_addr : resume_addr,
398
- opaque,
399
- } ) ;
400
- SbiRet :: success ( 0 )
401
- }
402
- spec:: HART_SUSPEND_TYPE_RETENTIVE => unsafe {
403
- local_hsm ( ) . suspend ( ) ;
404
- riscv:: asm:: wfi ( ) ;
405
- local_hsm ( ) . resume ( ) ;
406
- SbiRet :: success ( 0 )
407
- } ,
408
- _ => SbiRet :: not_supported ( ) ,
401
+ fn hart_suspend ( & self , suspend_type : u32 , _resume_addr : usize , _opaque : usize ) -> SbiRet {
402
+ use rustsbi:: spec:: hsm:: * ;
403
+ if matches ! (
404
+ suspend_type,
405
+ HART_SUSPEND_TYPE_NON_RETENTIVE | HART_SUSPEND_TYPE_RETENTIVE
406
+ ) {
407
+ local_hsm ( ) . suspend ( ) ;
408
+ unsafe { riscv:: asm:: wfi ( ) } ;
409
+ local_hsm ( ) . resume ( ) ;
410
+ SbiRet :: success ( 0 )
411
+ } else {
412
+ SbiRet :: not_supported ( )
409
413
}
410
414
}
411
415
}
0 commit comments