#include "init.h"
#include "encoding.h"

int main(void);

trap_handler_t trap_handler[NHARTS] = {0};

void set_trap_handler(trap_handler_t handler)
{
    unsigned hartid = csr_read(mhartid);
    trap_handler[hartid] = handler;
}

void enable_timer_interrupts()
{
    set_csr(mie, MIP_MTIP);
    set_csr(mstatus, MSTATUS_MIE);
}

void handle_trap(unsigned int mcause, void *mepc, void *sp)
{
    unsigned hartid = csr_read(mhartid);
    if (trap_handler[hartid]) {
        trap_handler[hartid](hartid, mcause, mepc, sp);
        return;
    }

    while (1)
        ;
}

void _exit(int status)
{
    // Make sure gcc doesn't inline _exit, so we can actually set a breakpoint
    // on it.
    volatile int i = 42;
    while (i)
        ;
    // _exit isn't supposed to return.
    while (1)
        ;
}

void _init()
{
    _exit(main());
}
