summaryrefslogtreecommitdiff
path: root/startup/riscv_reset_handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'startup/riscv_reset_handler.cpp')
-rw-r--r--startup/riscv_reset_handler.cpp11
1 files changed, 11 insertions, 0 deletions
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));
+}