diff options
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 */ |