diff options
| author | hachem <im@hachem.wtf> | 2026-10-09 11:08:09 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-09 11:08:09 +0200 |
| commit | e0572c37d970d601c17085bdb082cc6ef4356891 (patch) | |
| tree | f0b4d71c92978e74d127d7090d3e11380378a8b3 /kernel/vmm.rv | |
| parent | 8cb66100fe802c38d180ea29a11a902decf0fd8b (diff) | |
chore: fmt some revo code based on lung's example
Diffstat (limited to 'kernel/vmm.rv')
| -rw-r--r-- | kernel/vmm.rv | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/vmm.rv b/kernel/vmm.rv index 0de5f33..54d1695 100644 --- a/kernel/vmm.rv +++ b/kernel/vmm.rv @@ -2,22 +2,28 @@ # everything here only writes small entries we construct, so its f64 safe const PTE_ADDR = 0x000FFFFFFFFFF000 -fn pte_index(virtual_address, level) (virtual_address shr (12 + 9 * level)) band 0x1ff +fn pte_index(virtual_address, level) -> num do + return (virtual_address shr (12 + 9 * level)) band 0x1ff +end -fn next_table(table, index) do +fn next_table(table, index) -> num do const slot = table + index * 8 const entry = mem_read(slot, 8) - if (entry band 1) != 0 return entry band PTE_ADDR + if (entry band 1) != 0 do + return entry band PTE_ADDR + end + const frame = frame_alloc() mem_zero(frame, 4096) mem_write(slot, frame bor 7, 8) # present | write | user - frame + return frame end fn as_map(pml4, virtual_address, physical_address, flags) do const pdpt = next_table(pml4, pte_index(virtual_address, 3)) const pd = next_table(pdpt, pte_index(virtual_address, 2)) const pt = next_table(pd, pte_index(virtual_address, 1)) + mem_write(pt + pte_index(virtual_address, 0) * 8, (physical_address band PTE_ADDR) bor flags bor 1, 8) invlpg(virtual_address) end |
