1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12#pragma once
13
14#include <autoconf.h>
15#include <sel4/faults.h>
16#include <sel4/sel4_arch/constants.h>
17
18LIBSEL4_INLINE_FUNC seL4_Fault_t
19seL4_getArchFault(seL4_MessageInfo_t tag)
20{
21    switch (seL4_MessageInfo_get_label(tag)) {
22    case seL4_Fault_UnknownSyscall:
23        return seL4_Fault_UnknownSyscall_new(seL4_GetMR(seL4_UnknownSyscall_EAX),
24                                             seL4_GetMR(seL4_UnknownSyscall_EBX),
25                                             seL4_GetMR(seL4_UnknownSyscall_ECX),
26                                             seL4_GetMR(seL4_UnknownSyscall_EDX),
27                                             seL4_GetMR(seL4_UnknownSyscall_ESI),
28                                             seL4_GetMR(seL4_UnknownSyscall_EDI),
29                                             seL4_GetMR(seL4_UnknownSyscall_EBP),
30                                             seL4_GetMR(seL4_UnknownSyscall_FaultIP),
31                                             seL4_GetMR(seL4_UnknownSyscall_SP),
32                                             seL4_GetMR(seL4_UnknownSyscall_FLAGS),
33                                             seL4_GetMR(seL4_UnknownSyscall_Syscall));
34
35    case seL4_Fault_UserException:
36        return seL4_Fault_UserException_new(seL4_GetMR(seL4_UserException_FaultIP),
37                                            seL4_GetMR(seL4_UserException_SP),
38                                            seL4_GetMR(seL4_UserException_FLAGS),
39                                            seL4_GetMR(seL4_UserException_Number),
40                                            seL4_GetMR(seL4_UserException_Code));
41    case seL4_Fault_VMFault:
42        return seL4_Fault_VMFault_new(seL4_GetMR(seL4_VMFault_IP),
43                                      seL4_GetMR(seL4_VMFault_Addr),
44                                      seL4_GetMR(seL4_VMFault_PrefetchFault),
45                                      seL4_GetMR(seL4_VMFault_FSR));
46    case seL4_Fault_Timeout:
47        return seL4_Fault_Timeout_new(seL4_GetMR(seL4_Timeout_Data),
48                                      seL4_GetMR(seL4_Timeout_Consumed_HighBits),
49                                      seL4_GetMR(seL4_Timeout_Consumed_LowBits));
50
51    default:
52        return seL4_Fault_NullFault_new();
53    }
54}
55