diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-27 06:50:02 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-27 06:53:33 -0400 |
commit | 41f5792098c8f2764441eca195a24918b4ae390f (patch) | |
tree | 99ac25e4ce281f9bf1f8d832c5b774bba2115dc4 /src/sys | |
parent | add156b750d77132ca2d063a4718ac1a5139e59a (diff) |
kern: proc: Protect mapping list with spinlock
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/include/sys/proc.h | 2 | ||||
-rw-r--r-- | src/sys/os/os_proc.c | 3 | ||||
-rw-r--r-- | src/sys/vm/vm_map.c | 2 |
3 files changed, 7 insertions, 0 deletions
diff --git a/src/sys/include/sys/proc.h b/src/sys/include/sys/proc.h index c31cc4c..c5b0fda 100644 --- a/src/sys/include/sys/proc.h +++ b/src/sys/include/sys/proc.h @@ -36,6 +36,7 @@ #include <sys/param.h> #include <sys/queue.h> #include <os/mac.h> +#include <os/spinlock.h> #include <os/filedesc.h> #include <vm/vm.h> #include <machine/pcb.h> /* standard */ @@ -66,6 +67,7 @@ struct proc { struct syscall_domain scdom; struct filedesc *fdtab[FD_MAX]; mac_level_t level; + struct spinlock maplist_lock; TAILQ_HEAD(, vm_range) maplist; TAILQ_ENTRY(proc) link; }; diff --git a/src/sys/os/os_proc.c b/src/sys/os/os_proc.c index 448402f..ef98ce2 100644 --- a/src/sys/os/os_proc.c +++ b/src/sys/os/os_proc.c @@ -127,7 +127,10 @@ proc_add_range(struct proc *procp, vaddr_t va, paddr_t pa, size_t len) range->pa_base = pa; range->va_base = va; range->len = ALIGN_UP(len, PSIZE); + + spinlock_acquire(&procp->maplist_lock); TAILQ_INSERT_TAIL(&procp->maplist, range, link); + spinlock_release(&procp->maplist_lock); return 0; } diff --git a/src/sys/vm/vm_map.c b/src/sys/vm/vm_map.c index 277ff9a..c724168 100644 --- a/src/sys/vm/vm_map.c +++ b/src/sys/vm/vm_map.c @@ -126,7 +126,9 @@ vm_map(struct vm_vas *vas, struct mmu_map *spec, size_t len, int prot) /* Add the range if we can */ if (self != NULL) { + spinlock_acquire(&self->maplist_lock); proc_add_range(self, spec->va, spec->pa, len); + spinlock_release(&self->maplist_lock); } /* Place a guard page at the end */ |