From 50e1b103669a334d31bb27d7d858400c7a12e29e Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Fri, 19 Sep 2025 23:29:18 -0400 Subject: kern: proc: Keep track of mapped areas with ranges This commit adds a virtual memory range queue to the process descriptor in order to keep track of mapped pages and free their respective frames upon program exit. Signed-off-by: Ian Moffett --- src/sys/os/os_proc.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src/sys/os/os_proc.c') diff --git a/src/sys/os/os_proc.c b/src/sys/os/os_proc.c index 329a3ea..3a42496 100644 --- a/src/sys/os/os_proc.c +++ b/src/sys/os/os_proc.c @@ -30,11 +30,38 @@ #include #include #include +#include +#include #include +#include +#include +#include #include static pid_t next_pid = 0; +/* + * Deallocate saved memory ranges + * + * @proc: Process to target + */ +static void +proc_clear_ranges(struct proc *proc) +{ + const size_t PSIZE = DEFAULT_PAGESIZE; + struct vm_range *range; + size_t n_pages; + + TAILQ_FOREACH(range, &proc->maplist, link) { + if (range == NULL) { + continue; + } + + n_pages = ALIGN_UP(range->len, PSIZE) / PSIZE; + vm_free_frame(range->pa_base, n_pages); + } +} + /* * MI proc init code */ @@ -52,6 +79,7 @@ proc_init(struct proc *procp, int flags) /* Put the process in a known state */ scdp = &procp->scdom; memset(procp, 0, sizeof(*procp)); + TAILQ_INIT(&procp->maplist); /* * Initialize each platform latch @@ -72,6 +100,31 @@ proc_init(struct proc *procp, int flags) return error; } +/* + * Add range to process + */ +int +proc_add_range(struct proc *procp, vaddr_t va, paddr_t pa, size_t len) +{ + const size_t PSIZE = DEFAULT_PAGESIZE; + struct vm_range *range; + + if (procp == NULL) { + return -EINVAL; + } + + range = kalloc(sizeof(*range)); + if (range == NULL) { + return -ENOMEM; + } + + range->pa_base = pa; + range->va_base = va; + range->len = ALIGN_UP(len, PSIZE); + TAILQ_INSERT_TAIL(&procp->maplist, range, link); + return 0; +} + /* * Kill a specific process */ @@ -83,5 +136,6 @@ proc_kill(struct proc *procp, int status) } procp->flags |= PROC_EXITING; + proc_clear_ranges(procp); return md_proc_kill(procp, 0); } -- cgit v1.2.3