sel4_sys/fault/arch/
aarch64.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                        X0: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X0),
24                        X1: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X1),
25                        X2: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X2),
26                        X3: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X3),
27                        X4: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X4),
28                        X5: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X5),
29                        X6: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X6),
30                        X7: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_X7),
31                        FaultIP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_FaultIP),
32                        SP: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_SP),
33                        LR: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_LR),
34                        SPSR: f(seL4_UnknownSyscall_Msg::seL4_UnknownSyscall_SPSR),
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                        Stack: f(seL4_UserException_Msg::seL4_UserException_SP),
44                        SPSR: f(seL4_UserException_Msg::seL4_UserException_SPSR),
45                        Number: f(seL4_UserException_Msg::seL4_UserException_Number),
46                        Code: f(seL4_UserException_Msg::seL4_UserException_Code),
47                    }
48                    .unsplay()
49                }
50                seL4_Fault_tag::seL4_Fault_VMFault => {
51                    assert!(length == seL4_VMFault_Msg::seL4_VMFault_Length);
52                    seL4_Fault_VMFault_Unpacked {
53                        IP: f(seL4_VMFault_Msg::seL4_VMFault_IP),
54                        Addr: f(seL4_VMFault_Msg::seL4_VMFault_Addr),
55                        PrefetchFault: f(seL4_VMFault_Msg::seL4_VMFault_PrefetchFault),
56                        FSR: f(seL4_VMFault_Msg::seL4_VMFault_FSR),
57                    }
58                    .unsplay()
59                }
60                #[sel4_cfg(ARM_HYPERVISOR_SUPPORT)]
61                seL4_Fault_tag::seL4_Fault_VGICMaintenance => {
62                    assert!(length == seL4_VGICMaintenance_Msg::seL4_VGICMaintenance_Length);
63                    seL4_Fault_VGICMaintenance_Unpacked {
64                        IDX: f(seL4_VGICMaintenance_Msg::seL4_VGICMaintenance_IDX),
65                    }
66                    .unsplay()
67                }
68                #[sel4_cfg(ARM_HYPERVISOR_SUPPORT)]
69                seL4_Fault_tag::seL4_Fault_VCPUFault => {
70                    assert!(length == seL4_VCPUFault_Msg::seL4_VCPUFault_Length);
71                    seL4_Fault_VCPUFault_Unpacked {
72                        HSR: f(seL4_VCPUFault_Msg::seL4_VCPUFault_HSR),
73                    }
74                    .unsplay()
75                }
76                #[sel4_cfg(ARM_HYPERVISOR_SUPPORT)]
77                seL4_Fault_tag::seL4_Fault_VPPIEvent => {
78                    // TODO
79                    // assert!(length == seL4_VPPIEvent_Msg::seL4_VPPIEvent_Length);
80                    seL4_Fault_VPPIEvent_Unpacked {
81                        irq: f(seL4_VPPIEvent_Msg::seL4_VPPIEvent_IRQ),
82                    }
83                    .unsplay()
84                }
85                _ => return None,
86            }
87        })
88    }
89}