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