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
13#include <stdio.h> /* For fprintf() */
14#include <stdlib.h> /* For abort() */
15#include <assert.h>
16#include <sel4/sel4.h>
17#include <sel4utils/strerror.h>
18
19#define _PRIV_SEL4_FAULTLIST_UNKNOWN_IDX (seL4_Fault_UserException + 1)
20#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
21#define _PRIV_SEL4_FAULTLIST_MAX_IDX     (seL4_Fault_VCPUFault)
22#else
23#define _PRIV_SEL4_FAULTLIST_MAX_IDX     (seL4_Fault_VMFault)
24#endif
25
26char *sel4_errlist[] = {
27    [seL4_NoError] = "seL4_NoError",
28    [seL4_InvalidArgument] = "seL4_InvalidArgument",
29    [seL4_InvalidCapability] = "seL4_InvalidCapability",
30    [seL4_IllegalOperation] = "seL4_IllegalOperation",
31    [seL4_RangeError] = "seL4_RangeError",
32    [seL4_AlignmentError] = "seL4_AlignmentError",
33    [seL4_FailedLookup] = "seL4_FailedLookup",
34    [seL4_TruncatedMessage] = "seL4_TruncatedMessage",
35    [seL4_DeleteFirst] = "seL4_DeleteFirst",
36    [seL4_RevokeFirst] = "seL4_RevokeFirst",
37    [seL4_NotEnoughMemory] = "seL4_NotEnoughMemory",
38    NULL
39};
40
41char *sel4_faultlist[] = {
42    [seL4_Fault_NullFault] = "seL4_Fault_NullFault",
43    [seL4_Fault_CapFault] = "seL4_Fault_CapFault",
44    [seL4_Fault_UnknownSyscall] = "seL4_Fault_UnknownSyscall",
45    [seL4_Fault_UserException] = "seL4_Fault_UserException",
46    [_PRIV_SEL4_FAULTLIST_UNKNOWN_IDX] = "Unknown Fault",
47    [seL4_Fault_VMFault] = "seL4_Fault_VMFault",
48#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
49    [seL4_Fault_VGICMaintenance] = "seL4_Fault_VGICMaintenance",
50    [seL4_Fault_VCPUFault] = "seL4_Fault_VCPUFault"
51#endif
52};
53
54const char *
55sel4_strerror(int errcode)
56{
57    assert(errcode < sizeof(sel4_errlist) / sizeof(*sel4_errlist) - 1);
58    return sel4_errlist[errcode];
59}
60
61void
62__sel4_error(int sel4_error, const char *file,
63             const char *function, int line, char * str)
64{
65    fprintf(stderr, "seL4 Error: %s, function %s, file %s, line %d: %s\n",
66            sel4_errlist[sel4_error],
67            function, file, line, str);
68    abort();
69}
70
71const char *
72sel4_strfault(int faultlabel)
73{
74    if (faultlabel > _PRIV_SEL4_FAULTLIST_MAX_IDX || faultlabel == _PRIV_SEL4_FAULTLIST_UNKNOWN_IDX
75	|| faultlabel < seL4_Fault_NullFault) {
76        return sel4_faultlist[_PRIV_SEL4_FAULTLIST_UNKNOWN_IDX];
77    }
78
79    return sel4_faultlist[faultlabel];
80}
81