From 23a2994e051488561294050993f16162f24a85e7 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Sat, 10 Sep 2022 20:18:42 +0200 Subject: startup: Add RISC-V reset handler. --- SConscript | 2 +- platforms/riscv.yaml | 5 ++++- startup/SConscript | 12 ++++++++++++ startup/riscv_reset_handler.cpp | 11 +++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 startup/SConscript create mode 100644 startup/riscv_reset_handler.cpp diff --git a/SConscript b/SConscript index 7d3ff74..1378e7d 100644 --- a/SConscript +++ b/SConscript @@ -22,7 +22,7 @@ env.Append( env.SConscript('usb/SConscript'), env.SConscript('display/SConscript'), env.SConscript('wpan/SConscript'), - Glob('startup/*.cpp'), + env.SConscript('startup/SConscript'), Glob('os/*.cpp'), ], ) diff --git a/platforms/riscv.yaml b/platforms/riscv.yaml index 16db64b..f66a3ef 100644 --- a/platforms/riscv.yaml +++ b/platforms/riscv.yaml @@ -33,7 +33,10 @@ 8: UEI 9: SEI 11: MEI - + + startup: + - riscv_reset_handler + toolchains: - riscv64-unknown-elf diff --git a/startup/SConscript b/startup/SConscript new file mode 100644 index 0000000..971f9fa --- /dev/null +++ b/startup/SConscript @@ -0,0 +1,12 @@ +Import('env') + +sources = [ + File('entry.cpp'), +] + +startup = env['PLATFORM_SPEC'].get('startup', []) + +for file in startup: + sources.append(File(f'{file}.cpp')) + +Return('sources') diff --git a/startup/riscv_reset_handler.cpp b/startup/riscv_reset_handler.cpp new file mode 100644 index 0000000..0eed06d --- /dev/null +++ b/startup/riscv_reset_handler.cpp @@ -0,0 +1,11 @@ +void entry(); +extern int _ram_end; + +[[gnu::naked]] +[[gnu::section(".vectors")]] +void _reset_handler() { + // Initialize stack pointer. + asm volatile("lui sp, %%hi(%0); add sp, sp, %%lo(%0)" :: "i"(&_ram_end)); + // Absolute jump to entry function. + asm volatile("jr %0" :: "m"(entry)); +} -- cgit v1.2.3