1 /*
2  * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3  * Copyright 2015, 2016 Hesham Almatary <heshamelmatary@gmail.com>
4  *
5  * SPDX-License-Identifier: BSD-2-Clause
6  */
7 
8 #pragma once
9 
10 #include <autoconf.h>
11 #include <sel4/faults.h>
12 #include <sel4/sel4_arch/constants.h>
13 
seL4_getArchFault(seL4_MessageInfo_t tag)14 LIBSEL4_INLINE_FUNC seL4_Fault_t seL4_getArchFault(seL4_MessageInfo_t tag)
15 {
16     switch (seL4_MessageInfo_get_label(tag)) {
17     case seL4_Fault_UnknownSyscall:
18         return seL4_Fault_UnknownSyscall_new(
19                    seL4_GetMR(seL4_UnknownSyscall_FaultIP),
20                    seL4_GetMR(seL4_UnknownSyscall_SP),
21                    seL4_GetMR(seL4_UnknownSyscall_RA),
22                    seL4_GetMR(seL4_UnknownSyscall_A0),
23                    seL4_GetMR(seL4_UnknownSyscall_A1),
24                    seL4_GetMR(seL4_UnknownSyscall_A2),
25                    seL4_GetMR(seL4_UnknownSyscall_A3),
26                    seL4_GetMR(seL4_UnknownSyscall_A4),
27                    seL4_GetMR(seL4_UnknownSyscall_A5),
28                    seL4_GetMR(seL4_UnknownSyscall_A6),
29                    seL4_GetMR(seL4_UnknownSyscall_Syscall));
30 
31     case seL4_Fault_UserException:
32         return seL4_Fault_UserException_new(seL4_GetMR(seL4_UserException_FaultIP),
33                                             seL4_GetMR(seL4_UserException_SP),
34                                             seL4_GetMR(seL4_UserException_Number),
35                                             seL4_GetMR(seL4_UserException_Code));
36     case seL4_Fault_VMFault:
37         return seL4_Fault_VMFault_new(seL4_GetMR(seL4_VMFault_IP),
38                                       seL4_GetMR(seL4_VMFault_Addr),
39                                       seL4_GetMR(seL4_VMFault_PrefetchFault),
40                                       seL4_GetMR(seL4_VMFault_FSR));
41 #ifdef CONFIG_KERNEL_MCS
42     case seL4_Fault_Timeout:
43         return seL4_Fault_Timeout_new(seL4_GetMR(seL4_Timeout_Data),
44                                       seL4_GetMR(seL4_Timeout_Consumed));
45 #endif /* CONFIG_KERNEL_MCS */
46     default:
47         return seL4_Fault_NullFault_new();
48     }
49 }
50 
51