sel4_sys/fault/arch/
x86_64.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        Some(sel4_cfg_wrap_match! {
19            match label {
20                seL4_Fault_tag::seL4_Fault_UnknownSyscall => {
21                    assert!(length == seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_Length);
22                    seL4_Fault_UnknownSyscall_Unpacked {
23                        RAX: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RAX),
24                        RBX: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RBX),
25                        RCX: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RCX),
26                        RDX: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RDX),
27                        RSI: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RSI),
28                        RDI: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RDI),
29                        RBP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_RBP),
30                        R8: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R8),
31                        R9: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R9),
32                        R10: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R10),
33                        R11: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R11),
34                        R12: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R12),
35                        R13: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R13),
36                        R14: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R14),
37                        R15: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_R15),
38                        FaultIP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_FaultIP),
39                        RSP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_SP),
40                        FLAGS: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_FLAGS),
41                        Syscall: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_Syscall),
42                    }
43                    .unsplay()
44                }
45                seL4_Fault_tag::seL4_Fault_UserException => {
46                    assert!(length == seL4_UserException_Msg::seL4_UserException_Length);
47                    seL4_Fault_UserException_Unpacked {
48                        FaultIP: f(seL4_UserException_Msg::seL4_UserException_FaultIP),
49                        Stack: f(seL4_UserException_Msg::seL4_UserException_SP),
50                        FLAGS: f(seL4_UserException_Msg::seL4_UserException_FLAGS),
51                        Number: f(seL4_UserException_Msg::seL4_UserException_Number),
52                        Code: f(seL4_UserException_Msg::seL4_UserException_Code),
53                    }
54                    .unsplay()
55                }
56                seL4_Fault_tag::seL4_Fault_VMFault => {
57                    assert!(length == seL4_VMFault_Msg::seL4_VMFault_Length);
58                    seL4_Fault_VMFault_Unpacked {
59                        IP: f(seL4_VMFault_Msg::seL4_VMFault_IP),
60                        Addr: f(seL4_VMFault_Msg::seL4_VMFault_Addr),
61                        PrefetchFault: f(seL4_VMFault_Msg::seL4_VMFault_PrefetchFault),
62                        FSR: f(seL4_VMFault_Msg::seL4_VMFault_FSR),
63                    }
64                    .unsplay()
65                }
66                _ => return None,
67            }
68        })
69    }
70}