summaryrefslogtreecommitdiff
path: root/kernel/start.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/start.c')
-rw-r--r--kernel/start.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/start.c b/kernel/start.c
index 1876680..2d89d90 100644
--- a/kernel/start.c
+++ b/kernel/start.c
@@ -44,7 +44,16 @@ start()
// keep each CPU's hartid in its tp register, for cpuid().
int id = r_mhartid();
w_tp(id);
-
+
+ // allow access to all physical memory by S mode
+ // see figure 3.27 "PMP address register format, RV64" and table 3.10 "NAPOT
+ // range encoding in PMP address and configuration registers" in the RISC-V
+ // privileged specification
+ // we set the bits such that this matches any 56-bit physical address
+ w_pmpaddr0((~0ULL) >> 10);
+ // then we allow the access
+ w_pmpcfg0(PMP_R | PMP_W | PMP_X | PMP_MATCH_NAPOT);
+
// switch to supervisor mode and jump to main().
asm volatile("mret");
}