|
460 | 460 | #[cfg(riscv)]
|
461 | 461 | mod asm;
|
462 | 462 |
|
| 463 | +#[cfg(not(feature = "no-exceptions"))] |
| 464 | +mod exceptions; |
| 465 | + |
| 466 | +#[cfg(not(feature = "no-interrupts"))] |
| 467 | +mod interrupts; |
| 468 | + |
463 | 469 | #[cfg(feature = "s-mode")]
|
464 | 470 | use riscv::register::scause as xcause;
|
465 | 471 |
|
@@ -519,108 +525,12 @@ pub struct TrapFrame {
|
519 | 525 | #[export_name = "_start_trap_rust"]
|
520 | 526 | pub unsafe extern "C" fn start_trap_rust(trap_frame: *const TrapFrame) {
|
521 | 527 | extern "C" {
|
522 |
| - fn ExceptionHandler(trap_frame: &TrapFrame); |
523 |
| - fn _dispatch_interrupt(code: usize); |
| 528 | + fn _dispatch_core_interrupt(code: usize); |
| 529 | + fn _dispatch_exception(trap_frame: &TrapFrame, code: usize); |
524 | 530 | }
|
525 | 531 |
|
526 |
| - let cause = xcause::read(); |
527 |
| - let code = cause.code(); |
528 |
| - |
529 |
| - if cause.is_exception() { |
530 |
| - let trap_frame = &*trap_frame; |
531 |
| - if code < __EXCEPTIONS.len() { |
532 |
| - let h = &__EXCEPTIONS[code]; |
533 |
| - if let Some(handler) = h { |
534 |
| - handler(trap_frame); |
535 |
| - } else { |
536 |
| - ExceptionHandler(trap_frame); |
537 |
| - } |
538 |
| - } else { |
539 |
| - ExceptionHandler(trap_frame); |
540 |
| - } |
541 |
| - } else { |
542 |
| - _dispatch_interrupt(code); |
| 532 | + match xcause::read().cause() { |
| 533 | + xcause::Trap::Interrupt(code) => _dispatch_core_interrupt(code), |
| 534 | + xcause::Trap::Exception(code) => _dispatch_exception(&*trap_frame, code), |
543 | 535 | }
|
544 | 536 | }
|
545 |
| - |
546 |
| -extern "C" { |
547 |
| - fn InstructionMisaligned(trap_frame: &TrapFrame); |
548 |
| - fn InstructionFault(trap_frame: &TrapFrame); |
549 |
| - fn IllegalInstruction(trap_frame: &TrapFrame); |
550 |
| - fn Breakpoint(trap_frame: &TrapFrame); |
551 |
| - fn LoadMisaligned(trap_frame: &TrapFrame); |
552 |
| - fn LoadFault(trap_frame: &TrapFrame); |
553 |
| - fn StoreMisaligned(trap_frame: &TrapFrame); |
554 |
| - fn StoreFault(trap_frame: &TrapFrame); |
555 |
| - fn UserEnvCall(trap_frame: &TrapFrame); |
556 |
| - fn SupervisorEnvCall(trap_frame: &TrapFrame); |
557 |
| - fn MachineEnvCall(trap_frame: &TrapFrame); |
558 |
| - fn InstructionPageFault(trap_frame: &TrapFrame); |
559 |
| - fn LoadPageFault(trap_frame: &TrapFrame); |
560 |
| - fn StorePageFault(trap_frame: &TrapFrame); |
561 |
| -} |
562 |
| - |
563 |
| -#[doc(hidden)] |
564 |
| -#[no_mangle] |
565 |
| -pub static __EXCEPTIONS: [Option<unsafe extern "C" fn(&TrapFrame)>; 16] = [ |
566 |
| - Some(InstructionMisaligned), |
567 |
| - Some(InstructionFault), |
568 |
| - Some(IllegalInstruction), |
569 |
| - Some(Breakpoint), |
570 |
| - Some(LoadMisaligned), |
571 |
| - Some(LoadFault), |
572 |
| - Some(StoreMisaligned), |
573 |
| - Some(StoreFault), |
574 |
| - Some(UserEnvCall), |
575 |
| - Some(SupervisorEnvCall), |
576 |
| - None, |
577 |
| - Some(MachineEnvCall), |
578 |
| - Some(InstructionPageFault), |
579 |
| - Some(LoadPageFault), |
580 |
| - None, |
581 |
| - Some(StorePageFault), |
582 |
| -]; |
583 |
| - |
584 |
| -#[export_name = "_dispatch_interrupt"] |
585 |
| -unsafe extern "C" fn dispatch_interrupt(code: usize) { |
586 |
| - extern "C" { |
587 |
| - fn DefaultHandler(); |
588 |
| - } |
589 |
| - |
590 |
| - if code < __INTERRUPTS.len() { |
591 |
| - let h = &__INTERRUPTS[code]; |
592 |
| - if let Some(handler) = h { |
593 |
| - handler(); |
594 |
| - } else { |
595 |
| - DefaultHandler(); |
596 |
| - } |
597 |
| - } else { |
598 |
| - DefaultHandler(); |
599 |
| - } |
600 |
| -} |
601 |
| - |
602 |
| -extern "C" { |
603 |
| - fn SupervisorSoft(); |
604 |
| - fn MachineSoft(); |
605 |
| - fn SupervisorTimer(); |
606 |
| - fn MachineTimer(); |
607 |
| - fn SupervisorExternal(); |
608 |
| - fn MachineExternal(); |
609 |
| -} |
610 |
| - |
611 |
| -#[doc(hidden)] |
612 |
| -#[no_mangle] |
613 |
| -pub static __INTERRUPTS: [Option<unsafe extern "C" fn()>; 12] = [ |
614 |
| - None, |
615 |
| - Some(SupervisorSoft), |
616 |
| - None, |
617 |
| - Some(MachineSoft), |
618 |
| - None, |
619 |
| - Some(SupervisorTimer), |
620 |
| - None, |
621 |
| - Some(MachineTimer), |
622 |
| - None, |
623 |
| - Some(SupervisorExternal), |
624 |
| - None, |
625 |
| - Some(MachineExternal), |
626 |
| -]; |
0 commit comments