From f3fe5e8d39fc9bbcffb346d0b7329445140a1e93 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 18 Nov 2025 00:43:20 -0500 Subject: kern/amd64: mmu: Add mu_pmap_forkvas() helper The mu_pmap_forkvas() function copies the current virtual address with the user porition zeroed. Signed-off-by: Ian Moffett --- sys/arch/amd64/cpu/mmu.c | 28 ++++++++++++++++++++++++++++ sys/inc/mu/mmu.h | 6 ++++++ sys/mu/mmu_stub.c | 6 ++++++ 3 files changed, 40 insertions(+) diff --git a/sys/arch/amd64/cpu/mmu.c b/sys/arch/amd64/cpu/mmu.c index 65c4e46..15ba19a 100644 --- a/sys/arch/amd64/cpu/mmu.c +++ b/sys/arch/amd64/cpu/mmu.c @@ -28,10 +28,12 @@ */ #include +#include #include #include #include #include +#include #include /* @@ -76,6 +78,32 @@ mu_pmap_writevas(struct mmu_vas *vas) return 0; } +int +mu_pmap_forkvas(struct mmu_vas *result) +{ + struct mmu_vas vas; + uintptr_t paddr, *pml4_dest; + uintptr_t *pml4_src; + + mu_pmap_readvas(&vas); + paddr = vm_phys_alloc(1); + if (paddr == 0) { + return -ENOMEM; + } + + pml4_dest = PHYS_TO_VIRT(paddr); + pml4_src = PHYS_TO_VIRT(vas.cr3); + for (uint16_t i = 0; i < 512; ++i) { + if (i < 256) { + pml4_dest[i] = 0; + } else { + pml4_dest[i] = pml4_src[i]; + } + } + + return 0; +} + void mu_pmap_init(void) { diff --git a/sys/inc/mu/mmu.h b/sys/inc/mu/mmu.h index ce52376..945e375 100644 --- a/sys/inc/mu/mmu.h +++ b/sys/inc/mu/mmu.h @@ -34,6 +34,12 @@ #include #include /* shared */ +/* + * Copy the current VAS leaving the user-side + * zeroed + */ +__strong int mu_pmap_forkvas(struct mmu_vas *result); + /* * Read the currently in-use virtual address space * structure diff --git a/sys/mu/mmu_stub.c b/sys/mu/mmu_stub.c index d2ab1eb..b53c3a4 100644 --- a/sys/mu/mmu_stub.c +++ b/sys/mu/mmu_stub.c @@ -30,6 +30,12 @@ #include #include +__weak int +mu_pmap_forkvas(struct mmu_vas *result) +{ + (void)result; +} + __weak void mu_pmap_init(void) { -- cgit v1.2.3