@@ -233,32 +233,60 @@ extern "C" fn fast_handler(
233
233
match cause. cause ( ) {
234
234
// SBI call
235
235
T :: Exception ( E :: SupervisorEnvCall ) => {
236
- use sbi_spec:: hsm;
237
- let ret = unsafe { SBI . assume_init_mut ( ) } . handle_ecall (
236
+ use sbi_spec:: { base , hsm, legacy } ;
237
+ let mut ret = unsafe { SBI . assume_init_mut ( ) } . handle_ecall (
238
238
a7,
239
239
a6,
240
240
[ ctx. a0 ( ) , a1, a2, a3, a4, a5] ,
241
241
) ;
242
- if ret. is_ok ( ) && a7 == hsm:: EID_HSM {
243
- // 关闭
244
- if a6 == hsm:: HART_STOP {
245
- local_hsm ( ) . stop ( ) ;
246
- mie:: write ( mie:: MSIE ) ;
247
- trap_vec:: load ( false ) ;
248
- ctx. regs ( ) . pc = _stop as _ ;
249
- return ctx. call ( 0 ) ;
242
+ if ret. is_ok ( ) {
243
+ match a7 {
244
+ hsm:: EID_HSM => {
245
+ // 关闭
246
+ if a6 == hsm:: HART_STOP {
247
+ local_hsm ( ) . stop ( ) ;
248
+ mie:: write ( mie:: MSIE ) ;
249
+ trap_vec:: load ( false ) ;
250
+ ctx. regs ( ) . pc = _stop as _ ;
251
+ return ctx. call ( 0 ) ;
252
+ }
253
+ // 不可恢复挂起
254
+ if a6 == hsm:: HART_SUSPEND
255
+ && ctx. a0 ( ) == hsm:: HART_SUSPEND_TYPE_NON_RETENTIVE as usize
256
+ {
257
+ trap_vec:: load ( false ) ;
258
+ ctx. regs ( ) . pc = _stop as _ ;
259
+ return ctx. call ( 0 ) ;
260
+ }
261
+ }
262
+ base:: EID_BASE => {
263
+ if a6 == base:: PROBE_EXTENSION {
264
+ if matches ! (
265
+ ctx. a0( ) ,
266
+ legacy:: LEGACY_CONSOLE_PUTCHAR | legacy:: LEGACY_CONSOLE_GETCHAR
267
+ ) {
268
+ ret. value = 1 ;
269
+ }
270
+ }
271
+ }
272
+ _ => { }
250
273
}
251
- // 不可恢复挂起
252
- if a6 == hsm:: HART_SUSPEND
253
- && ctx. a0 ( ) == hsm:: HART_SUSPEND_TYPE_NON_RETENTIVE as usize
254
- {
255
- trap_vec:: load ( false ) ;
256
- ctx. regs ( ) . pc = _stop as _ ;
257
- return ctx. call ( 0 ) ;
274
+ } else {
275
+ match a7 {
276
+ legacy:: LEGACY_CONSOLE_PUTCHAR => {
277
+ print ! ( "{}" , ctx. a0( ) as u8 as char ) ;
278
+ ret. error = 0 ;
279
+ ret. value = a1;
280
+ }
281
+ legacy:: LEGACY_CONSOLE_GETCHAR => {
282
+ ret. error = unsafe { UART . lock ( ) . assume_init_mut ( ) } . receive ( ) as _ ;
283
+ ret. value = a1;
284
+ }
285
+ _ => { }
258
286
}
259
287
}
260
- mepc:: next ( ) ;
261
288
ctx. regs ( ) . a = [ ret. error , ret. value , a2, a3, a4, a5, a6, a7] ;
289
+ mepc:: next ( ) ;
262
290
ctx. restore ( )
263
291
}
264
292
// 其他陷入
0 commit comments