summaryrefslogtreecommitdiff
path: root/start.c
diff options
context:
space:
mode:
Diffstat (limited to 'start.c')
-rw-r--r--start.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/start.c b/start.c
index 53edb8e..ce22be8 100644
--- a/start.c
+++ b/start.c
@@ -9,12 +9,12 @@ void main();
// entry.S needs one stack per CPU.
__attribute__ ((aligned (16))) char stack0[4096 * NCPU];
-// assembly code in kernelvec for machine-mode timer interrupt.
-extern void machinevec();
-
// scratch area for timer interrupt, one per CPU.
uint64 mscratch0[NCPU * 32];
+// assembly code in kernelvec for machine-mode timer interrupt.
+extern void machinevec();
+
// entry.S jumps here in machine mode on stack0.
void
mstart()
@@ -48,7 +48,9 @@ mstart()
w_mstatus(r_mstatus() | MSTATUS_MIE);
w_mie(r_mie() | MIE_MTIE);
- // call main(hartid) in supervisor mode.
- asm("csrr a0, mhartid ; \
- mret");
+ // keep each CPU's hartid in its tp register, for cpuid().
+ w_tp(id);
+
+ // call main() in supervisor mode.
+ asm("mret");
}