hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/vmm.rv
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
committerhachem <im@hachem.wtf>2026-09-25 11:31:59 +0200
commited285c9fc665e262ed21c7bf5734acb2b7a532db (patch)
treee51434e8069bc7219221cc1136515828d0293aca /kernel/vmm.rv
parentd18d1da05a4d065d54787434d6bc46f3354626a5 (diff)
feat: load + run native ELF binaries
Diffstat (limited to 'kernel/vmm.rv')
-rw-r--r--kernel/vmm.rv24
1 files changed, 24 insertions, 0 deletions
diff --git a/kernel/vmm.rv b/kernel/vmm.rv
new file mode 100644
index 0000000..d6673b3
--- /dev/null
+++ b/kernel/vmm.rv
@@ -0,0 +1,24 @@
+# build the 4-level page tables for one user page
+# everything here only writes small entries we construct, so it's f64-safe
+const PTE_ADDR = 0x000FFFFFFFFFF000
+
+fn pte_idx(virt, level) (virt shr (12 + 9 * level)) band 0x1ff
+
+# next-level table phys under entry `i` of table `tbl`, creating it if absent
+fn next_table(tbl, i) do
+ const slot = tbl + i * 8
+ const entry = mem_read(slot, 8)
+ if (entry band 1) != 0 return entry band PTE_ADDR
+ const frame = frame_alloc()
+ mem_zero(frame, 4096)
+ mem_write(slot, frame bor 7, 8) # present | write | user
+ frame
+end
+
+fn as_map(pml4, virt, phys, flags) do
+ const pdpt = next_table(pml4, pte_idx(virt, 3))
+ const pd = next_table(pdpt, pte_idx(virt, 2))
+ const pt = next_table(pd, pte_idx(virt, 1))
+ mem_write(pt + pte_idx(virt, 0) * 8, (phys band PTE_ADDR) bor flags bor 1, 8)
+ invlpg(virt)
+end