sel4_sys/fault/arch/
riscv.rs
1use crate::bf::*;
8use crate::c::*;
9
10use sel4_config::sel4_cfg_wrap_match;
11
12impl seL4_Fault {
13 pub(crate) fn arch_get_with(
14 label: seL4_Word,
15 length: seL4_Word,
16 f: impl Fn(core::ffi::c_ulong) -> seL4_Word,
17 ) -> Option<Self> {
18 let f = |i: core::ffi::c_uint| f(i.into());
19 let length: core::ffi::c_uint = length.try_into().unwrap();
20 Some(sel4_cfg_wrap_match! {
21 match label {
22 seL4_Fault_tag::seL4_Fault_UnknownSyscall => {
23 assert!(length == seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_Length);
24 seL4_Fault_UnknownSyscall_Unpacked {
25 FaultIP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_FaultIP),
26 SP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_SP),
27 RA: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RA),
28 A0: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A0),
29 A1: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A1),
30 A2: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A2),
31 A3: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A3),
32 A4: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A4),
33 A5: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A5),
34 A6: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_A6),
35 Syscall: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_Syscall),
36 }
37 .unsplay()
38 }
39 seL4_Fault_tag::seL4_Fault_UserException => {
40 assert!(length == seL4_UserException_Msg::seL4_UserException_Length);
41 seL4_Fault_UserException_Unpacked {
42 FaultIP: f(seL4_UserException_Msg::seL4_UserException_FaultIP),
43 SP: f(seL4_UserException_Msg::seL4_UserException_SP),
44 Number: f(seL4_UserException_Msg::seL4_UserException_Number),
45 Code: f(seL4_UserException_Msg::seL4_UserException_Code),
46 }
47 .unsplay()
48 }
49 seL4_Fault_tag::seL4_Fault_VMFault => {
50 assert!(length == seL4_VMFault_Msg::seL4_VMFault_Length);
51 seL4_Fault_VMFault_Unpacked {
52 IP: f(seL4_VMFault_Msg::seL4_VMFault_IP),
53 Addr: f(seL4_VMFault_Msg::seL4_VMFault_Addr),
54 PrefetchFault: f(seL4_VMFault_Msg::seL4_VMFault_PrefetchFault),
55 FSR: f(seL4_VMFault_Msg::seL4_VMFault_FSR),
56 }
57 .unsplay()
58 }
59 _ => return None,
60 }
61 })
62 }
63}