1use crate::TrapFrame;
15
16extern "C" {
17 fn InstructionMisaligned(trap_frame: &TrapFrame);
18 fn InstructionFault(trap_frame: &TrapFrame);
19 fn IllegalInstruction(trap_frame: &TrapFrame);
20 fn Breakpoint(trap_frame: &TrapFrame);
21 fn LoadMisaligned(trap_frame: &TrapFrame);
22 fn LoadFault(trap_frame: &TrapFrame);
23 fn StoreMisaligned(trap_frame: &TrapFrame);
24 fn StoreFault(trap_frame: &TrapFrame);
25 fn UserEnvCall(trap_frame: &TrapFrame);
26 fn SupervisorEnvCall(trap_frame: &TrapFrame);
27 fn MachineEnvCall(trap_frame: &TrapFrame);
28 fn InstructionPageFault(trap_frame: &TrapFrame);
29 fn LoadPageFault(trap_frame: &TrapFrame);
30 fn StorePageFault(trap_frame: &TrapFrame);
31}
32
33#[no_mangle]
35pub static __EXCEPTIONS: [Option<unsafe extern "C" fn(&TrapFrame)>; 16] = [
36 Some(InstructionMisaligned),
37 Some(InstructionFault),
38 Some(IllegalInstruction),
39 Some(Breakpoint),
40 Some(LoadMisaligned),
41 Some(LoadFault),
42 Some(StoreMisaligned),
43 Some(StoreFault),
44 Some(UserEnvCall),
45 Some(SupervisorEnvCall),
46 None,
47 Some(MachineEnvCall),
48 Some(InstructionPageFault),
49 Some(LoadPageFault),
50 None,
51 Some(StorePageFault),
52];
53
54#[no_mangle]
61pub unsafe extern "C" fn _dispatch_exception(trap_frame: &TrapFrame, code: usize) {
62 extern "C" {
63 fn ExceptionHandler(trap_frame: &TrapFrame);
64 }
65 match __EXCEPTIONS.get(code) {
66 Some(Some(handler)) => handler(trap_frame),
67 _ => ExceptionHandler(trap_frame),
68 }
69}