blob: 139b4dd6621cf5e3ffc0af60a618edc9babcbbbc [file] [log] [blame]
/*
* Copyright 2017, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*/
#include <stdio.h> /* For fprintf() */
#include <stdlib.h> /* For abort() */
#include <assert.h>
#include <sel4/sel4.h>
#include <sel4utils/strerror.h>
#define _PRIV_SEL4_FAULTLIST_UNKNOWN_IDX (seL4_Fault_UserException + 1)
#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
#define _PRIV_SEL4_FAULTLIST_MAX_IDX (seL4_Fault_VCPUFault)
#else
#define _PRIV_SEL4_FAULTLIST_MAX_IDX (seL4_Fault_VMFault)
#endif
char *sel4_errlist[] = {
[seL4_NoError] = "seL4_NoError",
[seL4_InvalidArgument] = "seL4_InvalidArgument",
[seL4_InvalidCapability] = "seL4_InvalidCapability",
[seL4_IllegalOperation] = "seL4_IllegalOperation",
[seL4_RangeError] = "seL4_RangeError",
[seL4_AlignmentError] = "seL4_AlignmentError",
[seL4_FailedLookup] = "seL4_FailedLookup",
[seL4_TruncatedMessage] = "seL4_TruncatedMessage",
[seL4_DeleteFirst] = "seL4_DeleteFirst",
[seL4_RevokeFirst] = "seL4_RevokeFirst",
[seL4_NotEnoughMemory] = "seL4_NotEnoughMemory",
NULL
};
char *sel4_faultlist[] = {
[seL4_Fault_NullFault] = "seL4_Fault_NullFault",
[seL4_Fault_CapFault] = "seL4_Fault_CapFault",
[seL4_Fault_UnknownSyscall] = "seL4_Fault_UnknownSyscall",
[seL4_Fault_UserException] = "seL4_Fault_UserException",
[_PRIV_SEL4_FAULTLIST_UNKNOWN_IDX] = "Unknown Fault",
[seL4_Fault_VMFault] = "seL4_Fault_VMFault",
#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
[seL4_Fault_VGICMaintenance] = "seL4_Fault_VGICMaintenance",
[seL4_Fault_VCPUFault] = "seL4_Fault_VCPUFault"
#endif
};
const char *
sel4_strerror(int errcode)
{
assert(errcode < sizeof(sel4_errlist) / sizeof(*sel4_errlist) - 1);
return sel4_errlist[errcode];
}
void
__sel4_error(int sel4_error, const char *file,
const char *function, int line, char * str)
{
fprintf(stderr, "seL4 Error: %s, function %s, file %s, line %d: %s\n",
sel4_errlist[sel4_error],
function, file, line, str);
abort();
}
const char *
sel4_strfault(int faultlabel)
{
if (faultlabel > _PRIV_SEL4_FAULTLIST_MAX_IDX || faultlabel == _PRIV_SEL4_FAULTLIST_UNKNOWN_IDX
|| faultlabel < seL4_Fault_NullFault) {
return sel4_faultlist[_PRIV_SEL4_FAULTLIST_UNKNOWN_IDX];
}
return sel4_faultlist[faultlabel];
}