summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-11-18 00:43:20 -0500
committerIan Moffett <ian@osmora.org>2025-11-18 00:43:20 -0500
commitf3fe5e8d39fc9bbcffb346d0b7329445140a1e93 (patch)
tree8b6e26b015fc1e60964c1f1db1da8a910a7606fc
parent7dd5178ddd0078d2e1ef38722bff1172f79f0f05 (diff)
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 <ian@osmora.org>
-rw-r--r--sys/arch/amd64/cpu/mmu.c28
-rw-r--r--sys/inc/mu/mmu.h6
-rw-r--r--sys/mu/mmu_stub.c6
3 files changed, 40 insertions, 0 deletions
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 <sys/types.h>
+#include <sys/errno.h>
#include <sys/cdefs.h>
#include <kern/panic.h>
#include <mu/mmu.h>
#include <vm/vm.h>
+#include <vm/phys.h>
#include <md/vas.h>
/*
@@ -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
@@ -35,6 +35,12 @@
#include <md/vas.h> /* 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 <sys/cdefs.h>
#include <mu/mmu.h>
+__weak int
+mu_pmap_forkvas(struct mmu_vas *result)
+{
+ (void)result;
+}
+
__weak void
mu_pmap_init(void)
{