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