#include #include #include "platform.h" #include "encoding.h" extern int main(int argc, char** argv); extern void trap_entry(); uint32_t get_cpu_freq() { return 65000000; } static void uart_init(size_t baud_rate) { GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; } #ifdef USE_PLIC extern void handle_m_ext_interrupt(); #endif #ifdef USE_M_TIME extern void handle_m_time_interrupt(); #endif uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) { if (0){ #ifdef USE_PLIC // External Machine-Level interrupt from PLIC } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { handle_m_ext_interrupt(); #endif #ifdef USE_M_TIME // External Machine-Level interrupt from PLIC } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ handle_m_time_interrupt(); #endif } else { write(1, "Unhandled Trap:\n", 16); _exit(1 + mcause); } return epc; } void _init() { uart_init(115200); printf("core freq at %d Hz\n", get_cpu_freq()); write_csr(mtvec, &trap_entry); _exit(main(0, NULL)); }