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
14LIBSEL4_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_HighBits),
45                                      seL4_GetMR(seL4_Timeout_Consumed_LowBits));
46#endif /* CONFIG_KERNEL_MCS */
47    default:
48        return seL4_Fault_NullFault_new();
49    }
50}
51
52