summaryrefslogtreecommitdiff
path: root/src/sys/arch
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-09-23 11:32:15 -0400
committerIan Moffett <ian@osmora.org>2025-09-23 11:32:15 -0400
commit6abb6c1c0d73aeb73c92085fbae99690537c46d8 (patch)
treed59e3b074402d42d77b99ab61e35b00d31ece69c /src/sys/arch
parent4f32156ff69980b8e9768d8593c25bdd8f7a1f34 (diff)
kern/amd64: proc: Deallocate mapped frames on exit
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch')
-rw-r--r--src/sys/arch/amd64/os/os_proc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/sys/arch/amd64/os/os_proc.c b/src/sys/arch/amd64/os/os_proc.c
index 8318476..d944f41 100644
--- a/src/sys/arch/amd64/os/os_proc.c
+++ b/src/sys/arch/amd64/os/os_proc.c
@@ -33,6 +33,7 @@
#include <sys/cdefs.h>
#include <vm/mmu.h>
#include <vm/map.h>
+#include <vm/physseg.h>
#include <machine/pcb.h>
#include <machine/gdt.h>
#include <machine/frame.h>
@@ -221,9 +222,11 @@ done:
int
md_proc_kill(struct proc *procp, int flags)
{
+ const size_t PSIZE = DEFAULT_PAGESIZE;
struct proc *self;
struct pcore *core = this_core();
struct md_pcb *pcbp;
+ struct vm_range *range;
if (core == NULL) {
return -ENXIO;
@@ -234,6 +237,15 @@ md_proc_kill(struct proc *procp, int flags)
procp = core->curproc;
}
+ /* Free every range */
+ TAILQ_FOREACH(range, &procp->maplist, link) {
+ if (range == NULL) {
+ continue;
+ }
+
+ vm_free_frame(range->pa_base, range->len / PSIZE);
+ }
+
/* Release the VAS */
pcbp = &procp->pcb;
mmu_free_vas(&pcbp->vas);