#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 = read_csr(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 = read_csr(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()); }