sel4_sys/fault/arch/
riscv.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use 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}