summaryrefslogtreecommitdiff
path: root/start.c
diff options
context:
space:
mode:
Diffstat (limited to 'start.c')
-rw-r--r--start.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/start.c b/start.c
new file mode 100644
index 0000000..5167ab4
--- /dev/null
+++ b/start.c
@@ -0,0 +1,34 @@
+#include "types.h"
+#include "memlayout.h"
+#include "riscv.h"
+#include "defs.h"
+
+void main();
+
+// entry.S uses this as the initial stack.
+char stack0[4096];
+
+// entry.S jumps here in machine mode on stack0.
+void
+mstart()
+{
+ // set M Previous Privilege mode to Supervisor, for mret.
+ unsigned long x = r_mstatus();
+ x &= ~MSTATUS_MPP_MASK;
+ x |= MSTATUS_MPP_S;
+ w_mstatus(x);
+
+ // set M Exception Program Counter to main, for mret.
+ // requires gcc -mcmodel=medany
+ w_mepc((uint64)main);
+
+ // disable paging for now.
+ w_satp(0);
+
+ // delegate all interrupts and exceptions to supervisor mode.
+ w_medeleg(0xffff);
+ w_mideleg(0xffff);
+
+ // jump to main in supervisor mode.
+ asm("mret");
+}