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
13LIBSEL4_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_RAX),
18                                             seL4_GetMR(seL4_UnknownSyscall_RBX),
19                                             seL4_GetMR(seL4_UnknownSyscall_RCX),
20                                             seL4_GetMR(seL4_UnknownSyscall_RDX),
21                                             seL4_GetMR(seL4_UnknownSyscall_RSI),
22                                             seL4_GetMR(seL4_UnknownSyscall_RDI),
23                                             seL4_GetMR(seL4_UnknownSyscall_RBP),
24                                             seL4_GetMR(seL4_UnknownSyscall_R8),
25                                             seL4_GetMR(seL4_UnknownSyscall_R9),
26                                             seL4_GetMR(seL4_UnknownSyscall_R10),
27                                             seL4_GetMR(seL4_UnknownSyscall_R11),
28                                             seL4_GetMR(seL4_UnknownSyscall_R12),
29                                             seL4_GetMR(seL4_UnknownSyscall_R13),
30                                             seL4_GetMR(seL4_UnknownSyscall_R14),
31                                             seL4_GetMR(seL4_UnknownSyscall_R15),
32                                             seL4_GetMR(seL4_UnknownSyscall_FaultIP),
33                                             seL4_GetMR(seL4_UnknownSyscall_SP),
34                                             seL4_GetMR(seL4_UnknownSyscall_FLAGS),
35                                             seL4_GetMR(seL4_UnknownSyscall_Syscall));
36
37    case seL4_Fault_UserException:
38        return seL4_Fault_UserException_new(seL4_GetMR(seL4_UserException_FaultIP),
39                                            seL4_GetMR(seL4_UserException_SP),
40                                            seL4_GetMR(seL4_UserException_FLAGS),
41                                            seL4_GetMR(seL4_UserException_Number),
42                                            seL4_GetMR(seL4_UserException_Code));
43    case seL4_Fault_VMFault:
44        return seL4_Fault_VMFault_new(seL4_GetMR(seL4_VMFault_IP),
45                                      seL4_GetMR(seL4_VMFault_Addr),
46                                      seL4_GetMR(seL4_VMFault_PrefetchFault),
47                                      seL4_GetMR(seL4_VMFault_FSR));
48#ifdef CONFIG_KERNEL_MCS
49    case seL4_Fault_Timeout:
50        return seL4_Fault_Timeout_new(seL4_GetMR(seL4_Timeout_Data),
51                                      seL4_GetMR(seL4_Timeout_Consumed));
52#endif /* CONFIG_KERNEL_MCS */
53    default:
54        return seL4_Fault_NullFault_new();
55    }
56}
57
58