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