From 0411e090837b2cc273ac2c5eb2ab4466fb70ad20 Mon Sep 17 00:00:00 2001 From: guenther Date: Sat, 3 May 2014 22:44:36 +0000 Subject: [PATCH] Move the u-area allocation and pmap-magic logic to its own function uvm_uarea_alloc() function name from NetBSD; arm testing by miod@ --- sys/kern/kern_fork.c | 7 ++----- sys/uvm/uvm_extern.h | 3 ++- sys/uvm/uvm_glue.c | 31 +++++++++++++++++++++++-------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index bad4221d5d5..da052e891ff 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.163 2014/04/18 11:51:17 guenther Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.164 2014/05/03 22:44:36 guenther Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -287,10 +287,7 @@ fork1(struct proc *curp, int flags, void *stack, pid_t *tidptr, } } - uaddr = uvm_km_kmemalloc_pla(kernel_map, uvm.kernel_object, USPACE, - USPACE_ALIGN, UVM_KMF_ZERO, - no_constraint.ucr_low, no_constraint.ucr_high, - 0, 0, USPACE/PAGE_SIZE); + uaddr = uvm_uarea_alloc(); if (uaddr == 0) { if ((flags & FORK_THREAD) == 0) { (void)chgproccnt(uid, -1); diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index 06919d70979..d6eae9c297f 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.112 2014/04/03 21:40:10 tedu Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.113 2014/05/03 22:44:36 guenther Exp $ */ /* $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $ */ /* @@ -513,6 +513,7 @@ int uvm_fault(vm_map_t, vaddr_t, #if defined(KGDB) void uvm_chgkprot(caddr_t, size_t, int); #endif +vaddr_t uvm_uarea_alloc(void); void uvm_fork(struct proc *, struct proc *, boolean_t, void *, size_t, void (*)(void *), void *); void uvm_exit(struct proc *); diff --git a/sys/uvm/uvm_glue.c b/sys/uvm/uvm_glue.c index ffb283f22c1..324794c09e3 100644 --- a/sys/uvm/uvm_glue.c +++ b/sys/uvm/uvm_glue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_glue.c,v 1.62 2014/04/13 23:14:15 tedu Exp $ */ +/* $OpenBSD: uvm_glue.c,v 1.63 2014/05/03 22:44:36 guenther Exp $ */ /* $NetBSD: uvm_glue.c,v 1.44 2001/02/06 19:54:44 eeh Exp $ */ /* @@ -293,12 +293,32 @@ uvm_vsunlock_device(struct proc *p, void *addr, size_t len, void *map) uvm_km_free(kernel_map, kva, sz); } +/* + * uvm_uarea_alloc: allocate the u-area for a new thread + */ +vaddr_t +uvm_uarea_alloc(void) +{ + vaddr_t uaddr; + + uaddr = uvm_km_kmemalloc_pla(kernel_map, uvm.kernel_object, USPACE, + USPACE_ALIGN, UVM_KMF_ZERO, + no_constraint.ucr_low, no_constraint.ucr_high, + 0, 0, USPACE/PAGE_SIZE); + +#ifdef PMAP_UAREA + /* Tell the pmap this is a u-area mapping */ + if (uaddr != 0) + PMAP_UAREA(uaddr); +#endif + + return (uaddr); +} + /* * uvm_fork: fork a virtual address space * * - the address space is copied as per parent map's inherit values - * - a new "user" structure is allocated for the child process - * [filled in by MD layer...] * - if specified, the child gets a new user stack described by * stack and stacksize * - NOTE: the kernel stack may be at a different location in the child @@ -318,11 +338,6 @@ uvm_fork(struct proc *p1, struct proc *p2, boolean_t shared, void *stack, } else p2->p_vmspace = uvmspace_fork(p1->p_vmspace); /* fork vmspace */ -#ifdef PMAP_UAREA - /* Tell the pmap this is a u-area mapping */ - PMAP_UAREA((vaddr_t)p2->p_addr); -#endif - /* * cpu_fork() copy and update the pcb, and make the child ready * to run. If this is a normal user fork, the child will exit -- 2.20.1