/*
 * 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];
}
