commit 43be64fccc4807ec2802d7424818d6392e2c38e8
parent 9469372d1915f951022b6e83a77cfa02cd5d0419
Author: Roberto E. Vargas Caballero <roberto.vargas@midokura.com>
Date: Sat, 19 Nov 2022 08:26:25 +0100
os9: Add unmapseg()
This function is needed if we want to unmap a segment, that is
for example needed in rfork or when a task is destroyed.
Diffstat:
4 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/include/os9/os9.h b/include/os9/os9.h
@@ -279,6 +279,7 @@ extern int debug(void);
/* arch mmu.c */
extern int vmap(phyaddr_t, uintptr_t, int);
+extern int vunmap(phyaddr_t);
/* arch functions */
extern Context *getctx(Context *ctx);
diff --git a/src/os9/arch/arm64/mmu.c b/src/os9/arch/arm64/mmu.c
@@ -261,6 +261,16 @@ vmap(phyaddr_t pa, uintptr_t va, int perm)
return 0;
}
+
+int
+vunmap(phyaddr_t pa)
+{
+ /& TODO */
+ return 0;
+}
+
+
+
void
taskmap(void)
{
diff --git a/src/os9/hosted/mmu.c b/src/os9/hosted/mmu.c
@@ -9,6 +9,13 @@ vmap(phyaddr_t pa, uintptr_t va, int flags)
return 0;
}
+int
+vunmap(phyaddr_t pa)
+{
+ dbg("vunmap %llx\n", (long long) pa);
+ return 0;
+}
+
Ptable *
initptable(Task *tp)
{
diff --git a/src/os9/proc.c b/src/os9/proc.c
@@ -110,6 +110,19 @@ gettask(int pid)
int
unmapseg(Map *mp)
{
+ Page *p;
+
+ dbg("unmap %s: %llx -> %llx\n",
+ (mp->name) ? mp->name : "unnamed",
+ mp->va, mp->pa);
+
+ for (p = mp->pages; p; p = p->next) {
+ vunmap(p->pa);
+ freep(p);
+ }
+
+ mp->pages = NULL;
+
return 0;
}