1/*
2 * Copyright 2018, 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 GNU General Public License version 2. Note that NO WARRANTY is provided.
8 * See "LICENSE_GPLv2.txt" for details.
9 *
10 * @TAG(DATA61_GPL)
11 */
12
13/*
14 *
15 * Copyright 2016, 2017 Hesham Almatary, Data61/CSIRO <hesham.almatary@data61.csiro.au>
16 * Copyright 2015, 2016 Hesham Almatary <heshamelmatary@gmail.com>
17 */
18
19#ifndef __LIBSEL4_SEL4_ARCH_FAULTS_H
20#define __LIBSEL4_SEL4_ARCH_FAULTS_H
21
22#include <autoconf.h>
23#include <sel4/faults.h>
24#include <sel4/sel4_arch/constants.h>
25
26LIBSEL4_INLINE_FUNC seL4_Fault_t
27seL4_getArchFault(seL4_MessageInfo_t tag)
28{
29    switch (seL4_MessageInfo_get_label(tag)) {
30    case seL4_Fault_UnknownSyscall:
31        return seL4_Fault_UnknownSyscall_new(
32                   seL4_GetMR(seL4_UnknownSyscall_FaultIP),
33                   seL4_GetMR(seL4_UnknownSyscall_SP),
34                   seL4_GetMR(seL4_UnknownSyscall_RA),
35                   seL4_GetMR(seL4_UnknownSyscall_A0),
36                   seL4_GetMR(seL4_UnknownSyscall_A1),
37                   seL4_GetMR(seL4_UnknownSyscall_A2),
38                   seL4_GetMR(seL4_UnknownSyscall_A3),
39                   seL4_GetMR(seL4_UnknownSyscall_A4),
40                   seL4_GetMR(seL4_UnknownSyscall_A5),
41                   seL4_GetMR(seL4_UnknownSyscall_A6),
42                   seL4_GetMR(seL4_UnknownSyscall_Syscall));
43
44    case seL4_Fault_UserException:
45        return seL4_Fault_UserException_new(seL4_GetMR(seL4_UserException_FaultIP),
46                                            seL4_GetMR(seL4_UserException_SP),
47                                            seL4_GetMR(seL4_UserException_FLAGS),
48                                            seL4_GetMR(seL4_UserException_Number),
49                                            seL4_GetMR(seL4_UserException_Code));
50    case seL4_Fault_VMFault:
51        return seL4_Fault_VMFault_new(seL4_GetMR(seL4_VMFault_IP),
52                                      seL4_GetMR(seL4_VMFault_Addr),
53                                      seL4_GetMR(seL4_VMFault_PrefetchFault),
54                                      seL4_GetMR(seL4_VMFault_FSR));
55    default:
56        return seL4_Fault_NullFault_new();
57    }
58}
59
60#endif /* __LIBSEL4_SEL4_ARCH_FAULTS_H */
61