summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-11-21 22:45:41 -0500
committerIan Moffett <ian@osmora.org>2025-11-21 22:45:41 -0500
commit01001c2aa2216c92603e1bdc334613e5adcacb04 (patch)
treed70c5222caea12188128266b3d38861bbae911e5
parent03090935db3e40132177e8ec25b7503b0e2ee78d (diff)
kern/amd64: mu: Add pmap unmap function
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/arch/amd64/cpu/mmu.c21
-rw-r--r--sys/inc/mu/mmu.h9
-rw-r--r--sys/mu/mmu_stub.c10
3 files changed, 40 insertions, 0 deletions
diff --git a/sys/arch/amd64/cpu/mmu.c b/sys/arch/amd64/cpu/mmu.c
index b709ee1..2be4b12 100644
--- a/sys/arch/amd64/cpu/mmu.c
+++ b/sys/arch/amd64/cpu/mmu.c
@@ -193,6 +193,27 @@ mu_pmap_map(struct mmu_vas *vas, uintptr_t pa, uintptr_t va,
}
int
+mu_pmap_unmap(struct mmu_vas *vas, uintptr_t va, pagesize_t ps)
+{
+ uintptr_t *pagetbl;
+ size_t index;
+
+ if (vas == NULL) {
+ return -EINVAL;
+ }
+
+ pagetbl = pmap_get_level(vas, va, false, PMAP_PML1);
+ if (pagetbl == NULL) {
+ return 0;
+ }
+
+ index = pmap_get_index(va, PMAP_PML1);
+ pagetbl[index] = 0;
+ pmap_invlpg(va);
+ return 0;
+}
+
+int
mu_pmap_readvas(struct mmu_vas *vas)
{
__asmv(
diff --git a/sys/inc/mu/mmu.h b/sys/inc/mu/mmu.h
index da2a286..d9be17a 100644
--- a/sys/inc/mu/mmu.h
+++ b/sys/inc/mu/mmu.h
@@ -50,6 +50,15 @@ __strong int mu_pmap_map(
);
/*
+ * Destroy a virtual to physical address mapping
+ *
+ * @vas: Virtual addres space to unmap from
+ * @va: Virtual address to unmap
+ * @ps: Pagesize of region covered by virtual address
+ */
+__strong int mu_pmap_unmap(struct mmu_vas *vas, uintptr_t va, pagesize_t ps);
+
+/*
* Copy the current VAS leaving the user-side
* zeroed
*/
diff --git a/sys/mu/mmu_stub.c b/sys/mu/mmu_stub.c
index 586edd4..729303b 100644
--- a/sys/mu/mmu_stub.c
+++ b/sys/mu/mmu_stub.c
@@ -43,6 +43,16 @@ mu_pmap_map(struct mmu_vas *vas, uintptr_t pa, uintptr_t va, uint16_t prot,
}
__weak int
+mu_pmap_unmap(struct mmu_vas *vas, uintptr_t va, pagesize_t ps)
+{
+ (void)vas;
+ (void)va;
+ (void)ps;
+
+ return 0;
+}
+
+__weak int
mu_pmap_forkvas(struct mmu_vas *result)
{
(void)result;