@@ -10,8 +10,8 @@ use riscv::register::{
10
10
scause:: { Exception , Trap } ,
11
11
} ;
12
12
13
- pub fn execute_supervisor ( supervisor_mepc : usize , a0 : usize , a1 : usize , hsm : QemuHsm ) -> ! {
14
- let mut rt = Runtime :: new_sbi_supervisor ( supervisor_mepc, a0 , a1) ;
13
+ pub fn execute_supervisor ( supervisor_mepc : usize , hart_id : usize , a1 : usize , hsm : QemuHsm ) -> ! {
14
+ let mut rt = Runtime :: new_sbi_supervisor ( supervisor_mepc, hart_id , a1) ;
15
15
hsm. record_current_start_finished ( ) ;
16
16
loop {
17
17
match Pin :: new ( & mut rt) . resume ( ( ) ) {
@@ -28,7 +28,8 @@ pub fn execute_supervisor(supervisor_mepc: usize, a0: usize, a1: usize, hsm: Qem
28
28
}
29
29
hsm. record_current_start_finished ( ) ;
30
30
ctx. mstatus = riscv:: register:: mstatus:: read ( ) ; // get from modified sstatus
31
- ctx. a0 = opaque;
31
+ ctx. a0 = hart_id;
32
+ ctx. a1 = opaque;
32
33
ctx. mepc = start_paddr;
33
34
}
34
35
} else {
@@ -67,14 +68,26 @@ pub fn execute_supervisor(supervisor_mepc: usize, a0: usize, a1: usize, hsm: Qem
67
68
hsm. record_current_stop_finished ( ) ;
68
69
pause ( ) ;
69
70
if let Some ( HsmCommand :: Start ( start_paddr, opaque) ) = hsm. last_command ( ) {
71
+ // Resuming from a non-retentive suspend state is relatively more involved and requires software
72
+ // to restore various hart registers and CSRs for all privilege modes.
73
+ // Upon resuming from non-retentive suspend state, the hart will jump to supervisor-mode at address
74
+ // specified by `resume_addr` with specific registers values described in the table below:
75
+ //
76
+ // | Register Name | Register Value
77
+ // |:--------------|:--------------
78
+ // | `satp` | 0
79
+ // | `sstatus.SIE` | 0
80
+ // | a0 | hartid
81
+ // | a1 | `opaque` parameter
70
82
unsafe {
71
83
riscv:: register:: satp:: write ( 0 ) ;
72
84
riscv:: register:: sstatus:: clear_sie ( ) ;
73
85
}
74
86
hsm. record_current_start_finished ( ) ;
75
87
let ctx = rt. context_mut ( ) ;
76
88
ctx. mstatus = riscv:: register:: mstatus:: read ( ) ; // get from modified sstatus
77
- ctx. a0 = opaque;
89
+ ctx. a0 = hart_id;
90
+ ctx. a1 = opaque;
78
91
ctx. mepc = start_paddr;
79
92
}
80
93
}
0 commit comments