diff --git a/CMakeLists.txt b/CMakeLists.txt index dabf26d..76e1b3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.21) include(CheckLinkerFlag) project(mnrs-bsp LANGUAGES ASM C) +option(NO_INIT "use an empty init routine" OFF) set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/env/${BOARD}/link.lds" CACHE FILEPATH "Linker script to use for BSP linking") get_filename_component(LINKER_SCRIPT_DIR "${LINKER_SCRIPT}" DIRECTORY) @@ -30,18 +31,22 @@ target_include_directories(startup PUBLIC env include) add_subdirectory(libwrap) -add_library(bsp STATIC env/${BOARD}/init.c) -target_link_libraries(bsp PUBLIC startup wrap) -target_include_directories(bsp PUBLIC env/${BOARD}) +add_library(runtime STATIC env/${BOARD}/init.c) +target_include_directories(runtime PUBLIC env/${BOARD} env include) +if(NO_INIT) + target_compile_definitions(runtime PRIVATE NO_INIT) +endif() check_linker_flag(C "LINKER:--no-warn-rwx-segments" HAS_NO_WARN_RWX_SEGMENTS) - if(HAS_NO_WARN_RWX_SEGMENTS) - target_link_options(bsp INTERFACE LINKER:--no-warn-rwx-segments) + target_link_options(runtime INTERFACE LINKER:--no-warn-rwx-segments) endif() -target_link_options(bsp INTERFACE LINKER: -nostartfiles -T ${LINKER_SCRIPT} -L${LINKER_SCRIPT_DIR}) +target_link_options(runtime INTERFACE LINKER: -nostartfiles -T ${LINKER_SCRIPT} -L${LINKER_SCRIPT_DIR}) if(SEMIHOSTING) - target_include_directories(bsp INTERFACE include) - target_sources(bsp INTERFACE env/semihosting.c env/trap.c) + target_sources(runtime INTERFACE env/semihosting.c env/trap.c) endif() + +add_library(bsp INTERFACE) +target_link_libraries(bsp INTERFACE startup runtime wrap) + diff --git a/env/riscv_vp/init.c b/env/riscv_vp/init.c index 3c830cc..dc60394 100644 --- a/env/riscv_vp/init.c +++ b/env/riscv_vp/init.c @@ -2,18 +2,14 @@ #include #include -#include "platform.h" #include "encoding.h" - +#include "platform.h" extern int main(int argc, char** argv); extern void trap_entry(void); -#define IRQ_M_SOFT 3 -#define IRQ_M_TIMER 7 -#define IRQ_M_EXT 11 - -#define NUM_INTERRUPTS 16 -#define MTIMER_NEXT_TICK_INC 1000 +#define IRQ_M_SOFT 3 +#define IRQ_M_TIMER 7 +#define IRQ_M_EXT 11 void handle_m_ext_interrupt(void); void handle_m_time_interrupt(void); @@ -21,118 +17,94 @@ uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp); void default_handler(void); void _init(void); -typedef void (*my_interrupt_function_ptr_t) (void); +typedef void (*my_interrupt_function_ptr_t)(void); my_interrupt_function_ptr_t localISR[NUM_INTERRUPTS] __attribute__((aligned(64))); -static unsigned long mtime_lo(void) -{ +static unsigned long mtime_lo(void) { unsigned long ret; - __asm volatile("rdtime %0":"=r"(ret)); + __asm volatile("rdtime %0" : "=r"(ret)); return ret; } +#if __riscv_xlen == 32 -#if __riscv_xlen==32 - -static uint32_t mtime_hi(void) -{ +static uint32_t mtime_hi(void) { unsigned long ret; - __asm volatile("rdtimeh %0":"=r"(ret)); + __asm volatile("rdtimeh %0" : "=r"(ret)); return ret; } -uint64_t get_timer_value(void) -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#elif __riscv_xlen==64 - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -unsigned long get_cpu_freq() -{ - return 100000000; -} - -void init_pll(void){ - //TODO: implement initialization -} - -static void uart_init(size_t baud_rate) -{ - //TODO: implement initialization -} - -void __attribute__((weak)) handle_m_ext_interrupt(){ -} - -void __attribute__((weak)) handle_m_time_interrupt(){ - uint64_t time = get_aclint_mtime(aclint); - time+=MTIMER_NEXT_TICK_INC; - set_aclint_mtimecmp(aclint, time); -} - -void __attribute__((weak)) default_handler(void) { - puts("default handler\n"); -} - -void __attribute__((weak)) interrupt_handler(unsigned) { - puts("interrupt handler\n"); -} - -uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp){ - if ((mcause & MCAUSE_INT)) { - if ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT) { - handle_m_ext_interrupt(); - } else if (((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); - } else { - interrupt_handler(mcause& ~MCAUSE_INT); +uint64_t get_timer_value(void) { + while(1) { + uint32_t hi = mtime_hi(); + uint32_t lo = mtime_lo(); + if(hi == mtime_hi()) + return ((uint64_t)hi << 32) | lo; } - } else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return mepc; } -void _init() -{ - -#ifndef NO_INIT - init_pll(); - uart_init(115200); - printf("core freq at %lu Hz\n", get_cpu_freq()); - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - int i=0; - while(i +#define NUM_INTERRUPTS 16 +#define MTIMER_NEXT_TICK_INC 1000 + void init_pll(void); unsigned long get_cpu_freq(void); unsigned long get_timer_freq(void); diff --git a/env/start.S b/env/start.S index 9e2437b..9582c85 100644 --- a/env/start.S +++ b/env/start.S @@ -60,7 +60,7 @@ _start: fssr x0 1: #endif - + call _init /* argc = argv = 0 */ li a0, 0 li a1, 0