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 +++++++++++++++++++++++++++++++++++++++ sys/include/vm/pmap.h | 4 ++++ 2 files changed, 43 insertions(+) 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) { diff --git a/sys/include/vm/pmap.h b/sys/include/vm/pmap.h index fcef35d..6e37a00 100644 --- a/sys/include/vm/pmap.h +++ b/sys/include/vm/pmap.h @@ -53,6 +53,8 @@ #define PMAP_WRITABLE __BIT(0) /* Writable */ #define PMAP_EXEC __BIT(1) /* Executable */ +#define is_vas_valid(vas) (vas.top_level != 0) + /* * vm_ctx - Per core virtual memory context */ @@ -63,6 +65,8 @@ struct vm_ctx { struct spinlock dynalloc_lock; }; +struct vas pmap_create_vas(struct vm_ctx *); + /* * Read virtual address space descriptor * and return it. -- cgit v1.2.3