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 *) ®s)[i]);
80 }
81
82 return info;
83 }
84 #endif /* CONFIG_KERNEL_MCS */
85