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/types.h>
11 #include <sel4/sel4_arch/faults.h>
12 
seL4_getFault(seL4_MessageInfo_t tag)13 LIBSEL4_INLINE_FUNC seL4_Fault_t seL4_getFault(seL4_MessageInfo_t tag)
14 {
15 
16     switch (seL4_MessageInfo_get_label(tag)) {
17     case seL4_Fault_CapFault:
18         return seL4_Fault_CapFault_new(seL4_GetMR(seL4_CapFault_IP),
19                                        seL4_GetMR(seL4_CapFault_Addr),
20                                        seL4_GetMR(seL4_CapFault_InRecvPhase),
21                                        seL4_GetMR(seL4_CapFault_LookupFailureType),
22                                        seL4_GetMR(seL4_CapFault_BitsLeft),
23                                        seL4_GetMR(seL4_CapFault_GuardMismatch_GuardFound),
24                                        seL4_GetMR(seL4_CapFault_GuardMismatch_BitsFound));
25 #ifdef CONFIG_HARDWARE_DEBUG_API
26     case seL4_Fault_DebugException:
27         return seL4_Fault_DebugException_new(seL4_GetMR(seL4_DebugException_FaultIP),
28                                              seL4_GetMR(seL4_DebugException_ExceptionReason),
29                                              seL4_GetMR(seL4_DebugException_TriggerAddress),
30                                              seL4_GetMR(seL4_DebugException_BreakpointNumber));
31 #endif
32     default:
33         return seL4_getArchFault(tag);
34     }
35 }
36 
37 #ifdef CONFIG_HARDWARE_DEBUG_API
seL4_isDebugException_tag(seL4_MessageInfo_t tag)38 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isDebugException_tag(seL4_MessageInfo_t tag)
39 {
40     return seL4_MessageInfo_get_label(tag) == seL4_Fault_DebugException;
41 }
42 #endif
43 
seL4_isVMFault_tag(seL4_MessageInfo_t tag)44 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isVMFault_tag(seL4_MessageInfo_t tag)
45 {
46     return seL4_MessageInfo_get_label(tag) == seL4_Fault_VMFault;
47 }
48 
seL4_isUnknownSyscall_tag(seL4_MessageInfo_t tag)49 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isUnknownSyscall_tag(seL4_MessageInfo_t tag)
50 {
51     return seL4_MessageInfo_get_label(tag) == seL4_Fault_UnknownSyscall;
52 }
53 
seL4_isUserException_tag(seL4_MessageInfo_t tag)54 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isUserException_tag(seL4_MessageInfo_t tag)
55 {
56     return seL4_MessageInfo_get_label(tag) == seL4_Fault_UserException;
57 }
58 
seL4_isNullFault_tag(seL4_MessageInfo_t tag)59 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isNullFault_tag(seL4_MessageInfo_t tag)
60 {
61     return seL4_MessageInfo_get_label(tag) == seL4_Fault_NullFault;
62 }
63 
seL4_isCapFault_tag(seL4_MessageInfo_t tag)64 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isCapFault_tag(seL4_MessageInfo_t tag)
65 {
66     return seL4_MessageInfo_get_label(tag) == seL4_Fault_CapFault;
67 }
68 
69 #ifdef CONFIG_KERNEL_MCS
seL4_isTimeoutFault_tag(seL4_MessageInfo_t tag)70 LIBSEL4_INLINE_FUNC seL4_Bool seL4_isTimeoutFault_tag(seL4_MessageInfo_t tag)
71 {
72     return seL4_MessageInfo_get_label(tag) == seL4_Fault_Timeout;
73 }
74 
seL4_TimeoutReply_new(seL4_Bool resume,seL4_UserContext regs,seL4_Word length)75 LIBSEL4_INLINE_FUNC seL4_MessageInfo_t seL4_TimeoutReply_new(seL4_Bool resume, seL4_UserContext regs, seL4_Word length)
76 {
77     seL4_MessageInfo_t info = seL4_MessageInfo_new(!resume, 0, 0, length);
78     for (seL4_Word i = 0; i < length; i++) {
79         seL4_SetMR(i, ((seL4_Word *) &regs)[i]);
80     }
81 
82     return info;
83 }
84 #endif /* CONFIG_KERNEL_MCS */
85