Module Name:    src
Committed By:   rmind
Date:           Sun Nov 29 04:15:43 UTC 2009

Modified Files:
        src/sys/arch/acorn26/acorn26: vm_machdep.c
        src/sys/arch/alpha/alpha: vm_machdep.c
        src/sys/arch/amd64/amd64: machdep.c
        src/sys/arch/arm/arm32: arm32_machdep.c vm_machdep.c
        src/sys/arch/hppa/hppa: vm_machdep.c
        src/sys/arch/i386/i386: machdep.c
        src/sys/arch/ia64/ia64: vm_machdep.c
        src/sys/arch/m68k/m68k: vm_machdep.c
        src/sys/arch/sh3/sh3: vm_machdep.c
        src/sys/arch/vax/vax: vm_machdep.c
        src/sys/arch/x86/x86: vm_machdep.c

Log Message:
Replace l_addr with uvm_lwp_getuarea() in various MD code, mostly 
cpu_lwp_fork().


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/acorn26/acorn26/vm_machdep.c
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/alpha/alpha/vm_machdep.c
cvs rdiff -u -r1.138 -r1.139 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.70 -r1.71 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.52 -r1.53 src/sys/arch/arm/arm32/vm_machdep.c
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/hppa/hppa/vm_machdep.c
cvs rdiff -u -r1.679 -r1.680 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/ia64/ia64/vm_machdep.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/m68k/m68k/vm_machdep.c
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/sh3/sh3/vm_machdep.c
cvs rdiff -u -r1.109 -r1.110 src/sys/arch/vax/vax/vm_machdep.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/x86/x86/vm_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/acorn26/acorn26/vm_machdep.c
diff -u src/sys/arch/acorn26/acorn26/vm_machdep.c:1.25 src/sys/arch/acorn26/acorn26/vm_machdep.c:1.26
--- src/sys/arch/acorn26/acorn26/vm_machdep.c:1.25	Fri Nov 27 03:23:03 2009
+++ src/sys/arch/acorn26/acorn26/vm_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.25 2009/11/27 03:23:03 rmind Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.26 2009/11/29 04:15:42 rmind Exp $ */
 
 /*-
  * Copyright (c) 2000, 2001 Ben Harris
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.25 2009/11/27 03:23:03 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.26 2009/11/29 04:15:42 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -106,7 +106,6 @@
 	struct pcb *pcb1, *pcb2;
 	struct trapframe *tf;
 	struct switchframe *sf;
-	char *stacktop;
 
 #if 0
 	printf("cpu_lwp_fork: %p -> %p\n", p1, p2);
@@ -120,8 +119,7 @@
 	/* pmap_activate(l2); XXX Other ports do.  Why?  */
 
 	/* Set up the kernel stack */
-	stacktop = (char *)l2->l_addr + USPACE;
-	tf = (struct trapframe *)stacktop - 1;
+	tf = (struct trapframe *)(uvm_lwp_getuarea(l2) + USPACE) - 1;
 	sf = (struct switchframe *)tf - 1;
 	/* Duplicate old process's trapframe (if it had one) */
 	if (pcb1->pcb_tf == NULL)

Index: src/sys/arch/alpha/alpha/vm_machdep.c
diff -u src/sys/arch/alpha/alpha/vm_machdep.c:1.103 src/sys/arch/alpha/alpha/vm_machdep.c:1.104
--- src/sys/arch/alpha/alpha/vm_machdep.c:1.103	Thu Nov 26 00:19:11 2009
+++ src/sys/arch/alpha/alpha/vm_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.103 2009/11/26 00:19:11 matt Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.104 2009/11/29 04:15:42 rmind Exp $ */
 
 /*
  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.103 2009/11/26 00:19:11 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.104 2009/11/29 04:15:42 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -143,7 +143,7 @@
 		 * will be to right address, with correct registers.
 		 */
 		l2tf = l2->l_md.md_tf = (struct trapframe *)
-		    ((char *)l2->l_addr + USPACE - sizeof(struct trapframe));
+		    (uvm_lwp_getuarea(l2) + USPACE - sizeof(struct trapframe));
 		memcpy(l2->l_md.md_tf, l1->l_md.md_tf,
 		    sizeof(struct trapframe));
 

Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.138 src/sys/arch/amd64/amd64/machdep.c:1.139
--- src/sys/arch/amd64/amd64/machdep.c:1.138	Thu Nov 26 00:19:12 2009
+++ src/sys/arch/amd64/amd64/machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.138 2009/11/26 00:19:12 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.139 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008
@@ -107,7 +107,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.138 2009/11/26 00:19:12 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.139 2009/11/29 04:15:42 rmind Exp $");
 
 /* #define XENDEBUG_LOW  */
 
@@ -403,15 +403,13 @@
 void
 x86_64_proc0_tss_ldt_init(void)
 {
-	struct lwp *l;
-	struct pcb *pcb;
+	struct lwp *l = &lwp0;
+	struct pcb *pcb = lwp_getpcb(l);
 
-	l = &lwp0;
-	pcb = lwp_getpcb(l);
 	pcb->pcb_flags = 0;
 	pcb->pcb_fs = 0;
 	pcb->pcb_gs = 0;
-	pcb->pcb_rsp0 = (USER_TO_UAREA(l->l_addr) + KSTACK_SIZE - 16) & ~0xf;
+	pcb->pcb_rsp0 = (uvm_lwp_getuarea(l) + KSTACK_SIZE - 16) & ~0xf;
 	pcb->pcb_iopl = SEL_KPL;
 
 	pmap_kernel()->pm_ldt_sel = GSYSSEL(GLDT_SEL, SEL_KPL);

Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.70 src/sys/arch/arm/arm32/arm32_machdep.c:1.71
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.70	Fri Nov 27 03:23:05 2009
+++ src/sys/arch/arm/arm32/arm32_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_machdep.c,v 1.70 2009/11/27 03:23:05 rmind Exp $	*/
+/*	$NetBSD: arm32_machdep.c,v 1.71 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.70 2009/11/27 03:23:05 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.71 2009/11/29 04:15:42 rmind Exp $");
 
 #include "opt_md.h"
 #include "opt_pmap_debug.h"
@@ -254,10 +254,9 @@
 
 	curpcb = lwp_getpcb(&lwp0);
 	curpcb->pcb_flags = 0;
-	curpcb->pcb_un.un_32.pcb32_sp = (u_int)lwp0.l_addr +
-	    USPACE_SVC_STACK_TOP;
-
-        curpcb->pcb_tf = (struct trapframe *)curpcb->pcb_un.un_32.pcb32_sp - 1;
+	curpcb->pcb_un.un_32.pcb32_sp =
+	    uvm_lwp_getuarea(&lwp0) + USPACE_SVC_STACK_TOP;
+	curpcb->pcb_tf = (struct trapframe *)curpcb->pcb_un.un_32.pcb32_sp - 1;
 }
 
 /*

Index: src/sys/arch/arm/arm32/vm_machdep.c
diff -u src/sys/arch/arm/arm32/vm_machdep.c:1.52 src/sys/arch/arm/arm32/vm_machdep.c:1.53
--- src/sys/arch/arm/arm32/vm_machdep.c:1.52	Thu Nov 26 00:19:12 2009
+++ src/sys/arch/arm/arm32/vm_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.52 2009/11/26 00:19:12 matt Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.53 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.52 2009/11/26 00:19:12 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.53 2009/11/29 04:15:42 rmind Exp $");
 
 #include "opt_armfpe.h"
 #include "opt_pmap_debug.h"
@@ -133,6 +133,7 @@
 {
 	struct pcb *pcb1, *pcb2;
 	struct trapframe *tf;
+	vaddr_t uv;
 
 	pcb1 = lwp_getpcb(l1);
 	pcb2 = lwp_getpcb(l2);
@@ -164,14 +165,15 @@
 	*pcb2 = *pcb1;
 
 	/* 
-	 * Set up the stack for the process.
+	 * Set up the kernel stack for the process.
 	 * Note: this stack is not in use if we are forking from p1
 	 */
-	pcb2->pcb_un.un_32.pcb32_sp = (u_int)l2->l_addr + USPACE_SVC_STACK_TOP;
+	uv = uvm_lwp_getuarea(l2);
+	pcb2->pcb_un.un_32.pcb32_sp = uv + USPACE_SVC_STACK_TOP;
 
 #ifdef STACKCHECKS
 	/* Fill the kernel stack with a known pattern */
-	memset(((u_char *)l2->l_addr) + USPACE_SVC_STACK_BOTTOM, 0xdd,
+	memset((void *)(uv + USPACE_SVC_STACK_BOTTOM), 0xdd,
 	    (USPACE_SVC_STACK_TOP - USPACE_SVC_STACK_BOTTOM));
 #endif	/* STACKCHECKS */
 

Index: src/sys/arch/hppa/hppa/vm_machdep.c
diff -u src/sys/arch/hppa/hppa/vm_machdep.c:1.38 src/sys/arch/hppa/hppa/vm_machdep.c:1.39
--- src/sys/arch/hppa/hppa/vm_machdep.c:1.38	Sat Nov 21 15:36:34 2009
+++ src/sys/arch/hppa/hppa/vm_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.38 2009/11/21 15:36:34 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.39 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*	$OpenBSD: vm_machdep.c,v 1.64 2008/09/30 18:54:26 miod Exp $	*/
 
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.38 2009/11/21 15:36:34 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.39 2009/11/29 04:15:42 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -84,6 +84,7 @@
 	struct pcb *pcb1, *pcb2;
 	struct trapframe *tf;
 	register_t sp, osp;
+	vaddr_t uv;
 
 	KASSERT(round_page(sizeof(struct pcb)) <= PAGE_SIZE);
 
@@ -105,7 +106,8 @@
 	pcb2->pcb_fpregs[2] = 0;
 	pcb2->pcb_fpregs[3] = 0;
 
-	sp = (register_t)l2->l_addr + PAGE_SIZE;
+	uv = uvm_lwp_getuarea(l2);
+	sp = (register_t)uv + PAGE_SIZE;
 	l2->l_md.md_regs = tf = (struct trapframe *)sp;
 	sp += sizeof(struct trapframe);
 
@@ -166,13 +168,14 @@
 	 */
 	sp += HPPA_FRAME_SIZE + 16*4;
 	pcb2->pcb_ksp = sp;
-	fdcache(HPPA_SID_KERNEL, (vaddr_t)l2->l_addr, sp - (vaddr_t)l2->l_addr);
+	fdcache(HPPA_SID_KERNEL, uv, sp - uv);
 }
 
 void
 cpu_setfunc(struct lwp *l, void (*func)(void *), void *arg)
 {
 	struct pcb *pcb = lwp_getpcb(l);
+	vaddr_t uv = uvm_lwp_getuarea(l);
 	struct trapframe *tf;
 	register_t sp, osp;
 
@@ -202,7 +205,7 @@
 	 */
 	sp += HPPA_FRAME_SIZE + 16*4;
 	pcb->pcb_ksp = sp;
-	fdcache(HPPA_SID_KERNEL, (vaddr_t)l->l_addr, sp - (vaddr_t)l->l_addr);
+	fdcache(HPPA_SID_KERNEL, uv, sp - uv);
 }
 
 void

Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.679 src/sys/arch/i386/i386/machdep.c:1.680
--- src/sys/arch/i386/i386/machdep.c:1.679	Fri Nov 27 03:23:10 2009
+++ src/sys/arch/i386/i386/machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.679 2009/11/27 03:23:10 rmind Exp $	*/
+/*	$NetBSD: machdep.c,v 1.680 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.679 2009/11/27 03:23:10 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.680 2009/11/29 04:15:42 rmind Exp $");
 
 #include "opt_beep.h"
 #include "opt_compat_ibcs2.h"
@@ -522,15 +522,12 @@
 void
 i386_proc0_tss_ldt_init(void)
 {
-	struct lwp *l;
-	struct pcb *pcb;
-
-	l = &lwp0;
-	pcb = lwp_getpcb(l);
+	struct lwp *l = &lwp0;
+	struct pcb *pcb = lwp_getpcb(l);
 
 	pmap_kernel()->pm_ldt_sel = GSEL(GLDT_SEL, SEL_KPL);
 	pcb->pcb_cr0 = rcr0() & ~CR0_TS;
-	pcb->pcb_esp0 = USER_TO_UAREA(l->l_addr) + KSTACK_SIZE - 16;
+	pcb->pcb_esp0 = uvm_lwp_getuarea(l) + KSTACK_SIZE - 16;
 	pcb->pcb_iopl = SEL_KPL;
 	l->l_md.md_regs = (struct trapframe *)pcb->pcb_esp0 - 1;
 	memcpy(pcb->pcb_fsd, &gdt[GUDATA_SEL], sizeof(pcb->pcb_fsd));
@@ -1321,8 +1318,8 @@
 	pcb->pcb_cr3 = PDPpaddr - KERNBASE;
 	__PRINTK(("pcb_cr3 0x%lx cr3 0x%lx\n",
 	    PDPpaddr - KERNBASE, xpmap_ptom(PDPpaddr - KERNBASE)));
-	XENPRINTK(("lwp0.l_addr %p first_avail %p\n",
-	    lwp0.l_addr, (void *)(long)first_avail));
+	XENPRINTK(("lwp0uarea %p first_avail %p\n",
+	    lwp0uarea, (void *)(long)first_avail));
 	XENPRINTK(("ptdpaddr %p atdevbase %p\n", (void *)PDPpaddr,
 	    (void *)atdevbase));
 #endif

Index: src/sys/arch/ia64/ia64/vm_machdep.c
diff -u src/sys/arch/ia64/ia64/vm_machdep.c:1.9 src/sys/arch/ia64/ia64/vm_machdep.c:1.10
--- src/sys/arch/ia64/ia64/vm_machdep.c:1.9	Sat Nov 21 15:36:34 2009
+++ src/sys/arch/ia64/ia64/vm_machdep.c	Sun Nov 29 04:15:42 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.9 2009/11/21 15:36:34 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.10 2009/11/29 04:15:42 rmind Exp $	*/
 
 /*
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -103,7 +103,7 @@
 	*pcb2 = *pcb1;
 
 	l2->l_md.md_flags = l1->l_md.md_flags;
-	l2->l_md.md_tf = (struct trapframe *)((vaddr_t)l2->l_addr + USPACE) - 1;
+	l2->l_md.md_tf = (struct trapframe *)(uvm_lwp_getuarea(l2) + USPACE) - 1;
 	l2->l_md.md_astpending = 0;
 
         /*

Index: src/sys/arch/m68k/m68k/vm_machdep.c
diff -u src/sys/arch/m68k/m68k/vm_machdep.c:1.30 src/sys/arch/m68k/m68k/vm_machdep.c:1.31
--- src/sys/arch/m68k/m68k/vm_machdep.c:1.30	Mon Nov 23 00:11:44 2009
+++ src/sys/arch/m68k/m68k/vm_machdep.c	Sun Nov 29 04:15:43 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.30 2009/11/23 00:11:44 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.31 2009/11/29 04:15:43 rmind Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.30 2009/11/23 00:11:44 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.31 2009/11/29 04:15:43 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -148,7 +148,7 @@
 	/*
 	 * Copy the trap frame.
 	 */
-	tf = (struct trapframe *)((u_int)l2->l_addr + USPACE) - 1;
+	tf = (struct trapframe *)(uvm_lwp_getuarea(l2) + USPACE) - 1;
 	l2->l_md.md_regs = (int *)tf;
 	*tf = *(struct trapframe *)l1->l_md.md_regs;
 

Index: src/sys/arch/sh3/sh3/vm_machdep.c
diff -u src/sys/arch/sh3/sh3/vm_machdep.c:1.64 src/sys/arch/sh3/sh3/vm_machdep.c:1.65
--- src/sys/arch/sh3/sh3/vm_machdep.c:1.64	Sat Nov 21 17:40:28 2009
+++ src/sys/arch/sh3/sh3/vm_machdep.c	Sun Nov 29 04:15:43 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.64 2009/11/21 17:40:28 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.65 2009/11/29 04:15:43 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc. All rights reserved.
@@ -81,7 +81,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.64 2009/11/21 17:40:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.65 2009/11/29 04:15:43 rmind Exp $");
 
 #include "opt_kstack_debug.h"
 
@@ -162,9 +162,6 @@
 /*
  * Reset the stack pointer for the lwp and arrange for it to call the
  * specified function with the specified argument on next switch.
- *
- * XXX: Scheduler activations relics!  Not used anymore but keep
- * around for reference in case we gonna revive SA.
  */
 void
 cpu_setfunc(struct lwp *l, void (*func)(void *), void *arg)
@@ -182,14 +179,13 @@
 	sf->sf_r12 = (int)func;
 }
 
-
 static void
 sh3_setup_uarea(struct lwp *l)
 {
 	struct pcb *pcb;
 	struct trapframe *tf;
 	struct switchframe *sf;
-	vaddr_t spbase, fptop;
+	vaddr_t uv, spbase, fptop;
 #define	P1ADDR(x)	(SH3_PHYS_TO_P1SEG(*__pmap_kpte_lookup(x) & PG_PPN))
 
 	pcb = lwp_getpcb(l);
@@ -211,14 +207,15 @@
 	l->l_md.md_regs = tf;
 
 	/* set up the kernel stack pointer */
-	spbase = (vaddr_t)l->l_addr + PAGE_SIZE;
+	uv = uvm_lwp_getuarea(l);
+	spbase = uv + PAGE_SIZE;
 #ifdef P1_STACK
 	/*
 	 * wbinv u-area to avoid cache-aliasing, since kernel stack
 	 * is accessed from P1 instead of P3.
 	 */
 	if (SH_HAS_VIRTUAL_ALIAS)
-		sh_dcache_wbinv_range((vaddr_t)l->l_addr, USPACE);
+		sh_dcache_wbinv_range(uv, USPACE);
 	spbase = P1ADDR(spbase);
 #else /* !P1_STACK */
 #ifdef SH4

Index: src/sys/arch/vax/vax/vm_machdep.c
diff -u src/sys/arch/vax/vax/vm_machdep.c:1.109 src/sys/arch/vax/vax/vm_machdep.c:1.110
--- src/sys/arch/vax/vax/vm_machdep.c:1.109	Sat Nov 21 04:45:39 2009
+++ src/sys/arch/vax/vax/vm_machdep.c	Sun Nov 29 04:15:43 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.109 2009/11/21 04:45:39 rmind Exp $	     */
+/*	$NetBSD: vm_machdep.c,v 1.110 2009/11/29 04:15:43 rmind Exp $	     */
 
 /*
  * Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.109 2009/11/21 04:45:39 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.110 2009/11/29 04:15:43 rmind Exp $");
 
 #include "opt_execfmt.h"
 #include "opt_compat_ultrix.h"
@@ -98,6 +98,7 @@
 	struct pcb *pcb1, *pcb2;
 	struct trapframe *tf;
 	struct callsframe *cf;
+	vaddr_t uv;
 	extern int sret; /* Return address in trap routine */
 
 	pcb1 = lwp_getpcb(l1);
@@ -114,7 +115,8 @@
 	/*
 	 * Copy the trap frame.
 	 */
-	tf = (struct trapframe *)((u_int)l2->l_addr + USPACE) - 1;
+	uv = uvm_lwp_getuarea(l2);
+	tf = (struct trapframe *)(uv + USPACE) - 1;
 	pcb2->framep = tf;
 	*tf = *(struct trapframe *)pcb1->framep;
 
@@ -126,7 +128,7 @@
 	pmap_activate(l2);
 
 	/* Mark guard page invalid in kernel stack */
-	kvtopte((uintptr_t)l2->l_addr + REDZONEADDR)->pg_v = 0;
+	kvtopte((uintptr_t)uv + REDZONEADDR)->pg_v = 0;
 
 	/*
 	 * Set up the calls frame above (below) the trapframe and populate
@@ -181,12 +183,13 @@
 cpu_setfunc(struct lwp *l, void (*func)(void *), void *arg)
 {
 	struct pcb *pcb = lwp_getpcb(l);
-	struct trapframe *tf = (struct trapframe *)((u_int)l->l_addr + USPACE) - 1;
+	struct trapframe *tf;
 	struct callsframe *cf;
 	extern int sret;
 
 	panic("cpu_setfunc() called\n");
 
+	tf = (struct trapframe *)(uvm_lwp_getuarea(l) + USPACE) - 1;
 	cf = (struct callsframe *)tf - 1;
 	cf->ca_cond = 0;
 	cf->ca_maskpsw = 0x20000000;

Index: src/sys/arch/x86/x86/vm_machdep.c
diff -u src/sys/arch/x86/x86/vm_machdep.c:1.7 src/sys/arch/x86/x86/vm_machdep.c:1.8
--- src/sys/arch/x86/x86/vm_machdep.c:1.7	Wed Nov 25 13:38:38 2009
+++ src/sys/arch/x86/x86/vm_machdep.c	Sun Nov 29 04:15:43 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.7 2009/11/25 13:38:38 rmind Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.8 2009/11/29 04:15:43 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986 The Regents of the University of California.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.7 2009/11/25 13:38:38 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.8 2009/11/29 04:15:43 rmind Exp $");
 
 #include "opt_mtrr.h"
 
@@ -140,6 +140,7 @@
 {
 	struct pcb *pcb1, *pcb2;
 	struct trapframe *tf;
+	vaddr_t uv;
 
 	pcb1 = lwp_getpcb(l1);
 	pcb2 = lwp_getpcb(l2);
@@ -181,14 +182,16 @@
 	 * 
 	 * Also, copy PCB %fs/%gs base from parent.
 	 */
+	uv = uvm_lwp_getuarea(l2);
+
 #ifdef __x86_64__
-	pcb2->pcb_rsp0 = (USER_TO_UAREA(l2->l_addr) + KSTACK_SIZE - 16) & ~0xf;
+	pcb2->pcb_rsp0 = (uv + KSTACK_SIZE - 16) & ~0xf;
 	tf = (struct trapframe *)pcb2->pcb_rsp0 - 1;
 
 	pcb2->pcb_fs = pcb1->pcb_fs;
 	pcb2->pcb_gs = pcb1->pcb_gs;
 #else
-	pcb2->pcb_esp0 = (USER_TO_UAREA(l2->l_addr) + KSTACK_SIZE - 16);
+	pcb2->pcb_esp0 = (uv + KSTACK_SIZE - 16);
 	tf = (struct trapframe *)pcb2->pcb_esp0 - 1;
 
 	memcpy(&pcb2->pcb_fsd, pcb1->pcb_fsd, sizeof(pcb2->pcb_fsd));
@@ -197,7 +200,10 @@
 #endif
 	l2->l_md.md_regs = tf;
 
-	/* Copy the trapframe from parent. */
+	/*
+	 * Copy the trapframe from parent, so that return to userspace
+	 * will be to right address, with correct registers.
+	 */
 	memcpy(tf, l1->l_md.md_regs, sizeof(struct trapframe));
 
 	/* Child LWP might get aston() before returning to userspace. */
@@ -205,7 +211,7 @@
 
 #if 0 /* DIAGNOSTIC */
 	/* Set a red zone in the kernel stack after the uarea. */
-	pmap_kremove(USER_TO_UAREA(l2->l_addr), PAGE_SIZE);
+	pmap_kremove(uv, PAGE_SIZE);
 	pmap_update(pmap_kernel());
 #endif
 

Reply via email to