From b3ef38de81c03b5f86fd69805351d64760a1bf09 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 26 Feb 2024 10:13:21 -0500 Subject: kernel/amd64: pmap: Add support for creating VAS Signed-off-by: Ian Moffett --- sys/arch/amd64/amd64/pmap.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'sys/arch/amd64') diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c index a952b41..8a21f63 100644 --- a/sys/arch/amd64/amd64/pmap.c +++ b/sys/arch/amd64/amd64/pmap.c @@ -29,9 +29,11 @@ #include #include +#include #include #include #include +#include /* * Page-Table Entry (PTE) flags @@ -158,6 +160,43 @@ pmap_unmap(struct vm_ctx *ctx, vaddr_t va) return pmap_modify_tbl(ctx, va, 0); } +struct vas +pmap_create_vas(struct vm_ctx *ctx) +{ + struct vas current_vas = pmap_read_vas(); + struct vas new_vas = {0}; + uint64_t *src, *dest; + + /* + * We want to allocate a zeroed pageframe + * and copy the higher half to it. The lower + * half can remain zero for userland. + */ + new_vas.top_level = vm_alloc_pageframe(1); + + if (new_vas.top_level == 0) { + /* Top level may remain zero to denote failure */ + return new_vas; + } + + src = PHYS_TO_VIRT(current_vas.top_level); + dest = PHYS_TO_VIRT(new_vas.top_level); + + /* + * Copy the top half and zero the bottom + * half. + */ + for (size_t i = 0; i < 512; ++i) { + if (i < 256) { + dest[i] = 0; + continue; + } + dest[i] = src[i]; + } + + return new_vas; +} + struct vas pmap_read_vas(void) { -- cgit v1.2.3