Module Name: src
Committed By: rmind
Date: Sat Nov 21 15:36:34 UTC 2009
Modified Files:
src/sys/arch/hp300/dev: hil.c
src/sys/arch/hp300/hp300: machdep.c trap.c
src/sys/arch/hp700/dev: pdc.c
src/sys/arch/hp700/gsc: gscbus.c
src/sys/arch/hp700/hp700: machdep.c
src/sys/arch/hppa/hppa: core_machdep.c db_interface.c db_trace.c fpu.c
hppa_machdep.c pmap.c process_machdep.c sig_machdep.c trap.c
vm_machdep.c
src/sys/arch/ia64/ia64: cpu.c machdep.c vm_machdep.c
src/sys/arch/ia64/include: proc.h
Log Message:
Use lwp_getpcb() on hppa and ia64, clean from struct user usage.
To generate a diff of this commit:
cvs rdiff -u -r1.82 -r1.83 src/sys/arch/hp300/dev/hil.c
cvs rdiff -u -r1.208 -r1.209 src/sys/arch/hp300/hp300/machdep.c
cvs rdiff -u -r1.140 -r1.141 src/sys/arch/hp300/hp300/trap.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/hp700/dev/pdc.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/hp700/gsc/gscbus.c
cvs rdiff -u -r1.72 -r1.73 src/sys/arch/hp700/hp700/machdep.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/hppa/hppa/core_machdep.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/hppa/hppa/db_interface.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/hppa/hppa/db_trace.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/hppa/hppa/fpu.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/hppa/hppa/hppa_machdep.c
cvs rdiff -u -r1.56 -r1.57 src/sys/arch/hppa/hppa/pmap.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/hppa/hppa/process_machdep.c
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/hppa/hppa/sig_machdep.c
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/hppa/hppa/trap.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/hppa/hppa/vm_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/ia64/ia64/cpu.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/ia64/ia64/machdep.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/ia64/ia64/vm_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/ia64/include/proc.h
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/hp300/dev/hil.c
diff -u src/sys/arch/hp300/dev/hil.c:1.82 src/sys/arch/hp300/dev/hil.c:1.83
--- src/sys/arch/hp300/dev/hil.c:1.82 Fri Jun 13 09:41:15 2008
+++ src/sys/arch/hp300/dev/hil.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: hil.c,v 1.82 2008/06/13 09:41:15 cegger Exp $ */
+/* $NetBSD: hil.c,v 1.83 2009/11/21 15:36:33 rmind Exp $ */
/*
* Copyright (c) 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hil.c,v 1.82 2008/06/13 09:41:15 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hil.c,v 1.83 2009/11/21 15:36:33 rmind Exp $");
#include "ite.h"
#include "rnd.h"
@@ -93,7 +93,6 @@
#include <sys/proc.h>
#include <sys/tty.h>
#include <sys/uio.h>
-#include <sys/user.h>
#include <sys/kauth.h>
#include <uvm/uvm_extern.h>
Index: src/sys/arch/hp300/hp300/machdep.c
diff -u src/sys/arch/hp300/hp300/machdep.c:1.208 src/sys/arch/hp300/hp300/machdep.c:1.209
--- src/sys/arch/hp300/hp300/machdep.c:1.208 Sat Nov 7 07:27:43 2009
+++ src/sys/arch/hp300/hp300/machdep.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.208 2009/11/07 07:27:43 cegger Exp $ */
+/* $NetBSD: machdep.c,v 1.209 2009/11/21 15:36:33 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.208 2009/11/07 07:27:43 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.209 2009/11/21 15:36:33 rmind Exp $");
#include "opt_ddb.h"
#include "opt_compat_netbsd.h"
@@ -105,7 +105,6 @@
#include <sys/signalvar.h>
#include <sys/syscallargs.h>
#include <sys/tty.h>
-#include <sys/user.h>
#include <sys/core.h>
#include <sys/kcore.h>
#include <sys/vnode.h>
@@ -375,6 +374,7 @@
setregs(struct lwp *l, struct exec_package *pack, u_long stack)
{
struct frame *frame = (struct frame *)l->l_md.md_regs;
+ struct pcb *pcb = lwp_getpcb(l);
frame->f_sr = PSL_USERSET;
frame->f_pc = pack->ep_entry & ~1;
@@ -396,9 +396,9 @@
frame->f_regs[SP] = stack;
/* restore a null state frame */
- l->l_addr->u_pcb.pcb_fpregs.fpf_null = 0;
+ pcb->pcb_fpregs.fpf_null = 0;
if (fputype)
- m68881_restore(&l->l_addr->u_pcb.pcb_fpregs);
+ m68881_restore(&pcb->pcb_fpregs);
}
/*
@@ -634,10 +634,11 @@
void
cpu_reboot(int howto, char *bootstr)
{
+ struct pcb *pcb = lwp_getpcb(curlwp);
/* take a snap shot before clobbering any registers */
- if (curlwp->l_addr)
- savectx(&curlwp->l_addr->u_pcb);
+ if (pcb != NULL)
+ savectx(pcb);
/* If system is cold, just halt. */
if (cold) {
Index: src/sys/arch/hp300/hp300/trap.c
diff -u src/sys/arch/hp300/hp300/trap.c:1.140 src/sys/arch/hp300/hp300/trap.c:1.141
--- src/sys/arch/hp300/hp300/trap.c:1.140 Tue Jan 27 20:30:13 2009
+++ src/sys/arch/hp300/hp300/trap.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.140 2009/01/27 20:30:13 martin Exp $ */
+/* $NetBSD: trap.c,v 1.141 2009/11/21 15:36:33 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.140 2009/01/27 20:30:13 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.141 2009/11/21 15:36:33 rmind Exp $");
#include "opt_ddb.h"
#include "opt_execfmt.h"
@@ -96,7 +96,6 @@
#include <sys/sa.h>
#include <sys/savar.h>
#include <sys/syscall.h>
-#include <sys/user.h>
#include <sys/userret.h>
#include <sys/kauth.h>
@@ -290,6 +289,7 @@
extern char fubail[], subail[];
struct lwp *l;
struct proc *p;
+ struct pcb *pcb;
ksiginfo_t ksi;
int s;
u_quad_t sticks = 0 /* XXX initializer works around compiler bug */;
@@ -301,11 +301,8 @@
ksi.ksi_trap = type & ~T_USER;
p = l->l_proc;
-
-#ifdef DIAGNOSTIC
- if (l->l_addr == NULL)
- panic("trap: no pcb");
-#endif
+ pcb = lwp_getpcb(l);
+ KASSERT(pcb != NULL);
if (USERMODE(fp->f_sr)) {
type |= T_USER;
@@ -352,7 +349,7 @@
panic("trap");
case T_BUSERR: /* kernel bus error */
- if (l->l_addr->u_pcb.pcb_onfault == 0)
+ if (pcb->pcb_onfault == 0)
goto dopanic;
/* FALLTHROUGH */
@@ -365,7 +362,7 @@
*/
fp->f_stackadj = exframesize[fp->f_format];
fp->f_format = fp->f_vector = 0;
- fp->f_pc = (int) l->l_addr->u_pcb.pcb_onfault;
+ fp->f_pc = (int)pcb->pcb_onfault;
return;
case T_BUSERR|T_USER: /* bus error */
@@ -546,8 +543,7 @@
* If we were doing profiling ticks or other user mode
* stuff from interrupt code, Just Say No.
*/
- if (l->l_addr->u_pcb.pcb_onfault == fubail ||
- l->l_addr->u_pcb.pcb_onfault == subail)
+ if (pcb->pcb_onfault == fubail || pcb->pcb_onfault == subail)
goto copyfault;
/* fall into ... */
@@ -574,7 +570,7 @@
* argument space is lazy-allocated.
*/
if ((type & T_USER) == 0 &&
- ((l->l_addr->u_pcb.pcb_onfault == 0) || KDFAULT(code)))
+ ((pcb->pcb_onfault == 0) || KDFAULT(code)))
map = kernel_map;
else {
map = vm ? &vm->vm_map : kernel_map;
@@ -632,7 +628,7 @@
} else
ksi.ksi_code = SEGV_MAPERR;
if (type == T_MMUFLT) {
- if (l->l_addr->u_pcb.pcb_onfault)
+ if (pcb->pcb_onfault)
goto copyfault;
printf("uvm_fault(%p, 0x%lx, 0x%x) -> 0x%x\n",
map, va, ftype, rv);
@@ -685,9 +681,10 @@
struct fmt7 *f = &fp->f_fmt7;
struct lwp *l = curlwp;
struct proc *p = l->l_proc;
+ struct pcb *pcb = lwp_getpcb(l);
+ void *oonfault = pcb->pcb_onfault;
int err = 0;
u_int fa;
- void *oonfault = l->l_addr->u_pcb.pcb_onfault;
paddr_t pa;
#ifdef DEBUG
@@ -910,7 +907,7 @@
#endif
}
}
- l->l_addr->u_pcb.pcb_onfault = oonfault;
+ pcb->pcb_onfault = oonfault;
if (err)
err = SIGSEGV;
return err;
Index: src/sys/arch/hp700/dev/pdc.c
diff -u src/sys/arch/hp700/dev/pdc.c:1.32 src/sys/arch/hp700/dev/pdc.c:1.33
--- src/sys/arch/hp700/dev/pdc.c:1.32 Tue Nov 3 05:07:25 2009
+++ src/sys/arch/hp700/dev/pdc.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pdc.c,v 1.32 2009/11/03 05:07:25 snj Exp $ */
+/* $NetBSD: pdc.c,v 1.33 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: pdc.c,v 1.14 2001/04/29 21:05:43 mickey Exp $ */
@@ -29,14 +29,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.32 2009/11/03 05:07:25 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.33 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/proc.h>
#include <sys/tty.h>
-#include <sys/user.h>
#include <sys/callout.h>
#include <sys/conf.h>
#include <sys/kauth.h>
Index: src/sys/arch/hp700/gsc/gscbus.c
diff -u src/sys/arch/hp700/gsc/gscbus.c:1.18 src/sys/arch/hp700/gsc/gscbus.c:1.19
--- src/sys/arch/hp700/gsc/gscbus.c:1.18 Tue Nov 3 05:07:25 2009
+++ src/sys/arch/hp700/gsc/gscbus.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: gscbus.c,v 1.18 2009/11/03 05:07:25 snj Exp $ */
+/* $NetBSD: gscbus.c,v 1.19 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: gscbus.c,v 1.13 2001/08/01 20:32:04 miod Exp $ */
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gscbus.c,v 1.18 2009/11/03 05:07:25 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gscbus.c,v 1.19 2009/11/21 15:36:33 rmind Exp $");
#define GSCDEBUG
@@ -78,7 +78,6 @@
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/malloc.h>
-#include <sys/user.h>
#include <sys/mbuf.h>
#include <sys/reboot.h>
Index: src/sys/arch/hp700/hp700/machdep.c
diff -u src/sys/arch/hp700/hp700/machdep.c:1.72 src/sys/arch/hp700/hp700/machdep.c:1.73
--- src/sys/arch/hp700/hp700/machdep.c:1.72 Sat Nov 7 07:27:43 2009
+++ src/sys/arch/hp700/hp700/machdep.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.72 2009/11/07 07:27:43 cegger Exp $ */
+/* $NetBSD: machdep.c,v 1.73 2009/11/21 15:36:33 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.72 2009/11/07 07:27:43 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.73 2009/11/21 15:36:33 rmind Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@@ -1835,11 +1835,12 @@
int
kcopy(const void *from, void *to, size_t size)
{
- u_int oldh = curlwp->l_addr->u_pcb.pcb_onfault;
+ struct pcb *pcb = lwp_getpcb(curlwp);
+ u_int oldh = pcb->pcb_onfault;
- curlwp->l_addr->u_pcb.pcb_onfault = (u_int)©_on_fault;
+ pcb->pcb_onfault = (u_int)©_on_fault;
memcpy(to, from, size);
- curlwp->l_addr->u_pcb.pcb_onfault = oldh;
+ pcb->pcb_onfault = oldh;
return 0;
}
@@ -1854,7 +1855,7 @@
struct trapframe *tf = l->l_md.md_regs;
pmap_t pmap = p->p_vmspace->vm_map.pmap;
pa_space_t space = pmap->pm_space;
- struct pcb *pcb = &l->l_addr->u_pcb;
+ struct pcb *pcb = lwp_getpcb(l);
tf->tf_flags = TFF_SYS|TFF_LAST;
tf->tf_iioq_tail = 4 +
Index: src/sys/arch/hppa/hppa/core_machdep.c
diff -u src/sys/arch/hppa/hppa/core_machdep.c:1.3 src/sys/arch/hppa/hppa/core_machdep.c:1.4
--- src/sys/arch/hppa/hppa/core_machdep.c:1.3 Tue Nov 3 05:07:26 2009
+++ src/sys/arch/hppa/hppa/core_machdep.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: core_machdep.c,v 1.3 2009/11/03 05:07:26 snj Exp $ */
+/* $NetBSD: core_machdep.c,v 1.4 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: vm_machdep.c,v 1.25 2001/09/19 20:50:56 mickey Exp $ */
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.3 2009/11/03 05:07:26 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.4 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -38,7 +38,6 @@
#include <sys/malloc.h>
#include <sys/buf.h>
#include <sys/vnode.h>
-#include <sys/user.h>
#include <sys/ptrace.h>
#include <sys/exec.h>
#include <sys/core.h>
Index: src/sys/arch/hppa/hppa/db_interface.c
diff -u src/sys/arch/hppa/hppa/db_interface.c:1.19 src/sys/arch/hppa/hppa/db_interface.c:1.20
--- src/sys/arch/hppa/hppa/db_interface.c:1.19 Sun Nov 15 18:17:18 2009
+++ src/sys/arch/hppa/hppa/db_interface.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: db_interface.c,v 1.19 2009/11/15 18:17:18 dholland Exp $ */
+/* $NetBSD: db_interface.c,v 1.20 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: db_interface.c,v 1.16 2001/03/22 23:31:45 mickey Exp $ */
@@ -29,12 +29,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.19 2009/11/15 18:17:18 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.20 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
-#include <sys/user.h>
#include <machine/db_machdep.h>
#include <machine/frame.h>
Index: src/sys/arch/hppa/hppa/db_trace.c
diff -u src/sys/arch/hppa/hppa/db_trace.c:1.5 src/sys/arch/hppa/hppa/db_trace.c:1.6
--- src/sys/arch/hppa/hppa/db_trace.c:1.5 Tue Nov 3 05:07:26 2009
+++ src/sys/arch/hppa/hppa/db_trace.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: db_trace.c,v 1.5 2009/11/03 05:07:26 snj Exp $ */
+/* $NetBSD: db_trace.c,v 1.6 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: db_interface.c,v 1.16 2001/03/22 23:31:45 mickey Exp $ */
@@ -29,12 +29,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.5 2009/11/03 05:07:26 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.6 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
-#include <sys/user.h>
#include <machine/db_machdep.h>
@@ -77,8 +76,8 @@
} else {
if (trace_thread) {
struct proc *p;
- struct user *u;
struct lwp *l;
+
if (lwpaddr) {
l = (struct lwp *)addr;
p = l->l_proc;
@@ -94,14 +93,14 @@
KASSERT(l != NULL);
}
(*pr)("lid %d ", l->l_lid);
- u = l->l_addr;
if (p == curproc && l == curlwp) {
fp = (int *)ddb_regs.tf_r3;
pc = ddb_regs.tf_iioq_head;
rp = ddb_regs.tf_rp;
} else {
+ struct pcb *pcb = lwp_getpcb(l);
/* cpu_switchto fp, and return point */
- fp = (int *)(u->u_pcb.pcb_ksp -
+ fp = (int *)(pcb->pcb_ksp -
(HPPA_FRAME_SIZE + 16*4));
pc = 0;
rp = fp[-5];
Index: src/sys/arch/hppa/hppa/fpu.c
diff -u src/sys/arch/hppa/hppa/fpu.c:1.18 src/sys/arch/hppa/hppa/fpu.c:1.19
--- src/sys/arch/hppa/hppa/fpu.c:1.18 Sun May 24 06:53:35 2009
+++ src/sys/arch/hppa/hppa/fpu.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.c,v 1.18 2009/05/24 06:53:35 skrll Exp $ */
+/* $NetBSD: fpu.c,v 1.19 2009/11/21 15:36:33 rmind Exp $ */
/*
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -34,13 +34,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.18 2009/05/24 06:53:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.19 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
-#include <sys/user.h>
#include <uvm/uvm_extern.h>
@@ -217,6 +216,7 @@
hppa_fpu_flush(struct lwp *l)
{
struct trapframe *tf = l->l_md.md_regs;
+ struct pcb *pcb = lwp_getpcb(l);
/*
* If we have a hardware FPU, and this process'
@@ -228,7 +228,7 @@
return;
}
- hppa_fpu_swap(&l->l_addr->u_pcb, NULL);
+ hppa_fpu_swap(pcb, NULL);
fpu_cur_uspace = 0;
}
@@ -241,6 +241,7 @@
static int
hppa_fpu_ls(struct trapframe *frame, struct lwp *l)
{
+ struct pcb *pcb = lwp_getpcb(l);
u_int inst, inst_b, inst_x, inst_s, inst_t;
int log2size;
u_int *base;
@@ -270,14 +271,14 @@
* The space must be the user's space, else we
* segfault.
*/
- if (inst_s != l->l_addr->u_pcb.pcb_space)
+ if (inst_s != pcb->pcb_space)
return (EFAULT);
/* See whether or not this is a doubleword load/store. */
log2size = (inst & OPCODE_DOUBLE) ? 3 : 2;
/* Get the floating point register. */
- fpreg = ((char *)l->l_addr->u_pcb.pcb_fpregs) + (inst_t << log2size);
+ fpreg = ((char *)pcb->pcb_fpregs) + (inst_t << log2size);
/* Get the base register. */
base = FRAME_REG(frame, inst_b, r0);
@@ -338,8 +339,7 @@
error = (inst & OPCODE_STORE) ?
copyout(fpreg, (void *) offset, 1 << log2size) :
copyin((const void *) offset, fpreg, 1 << log2size);
- fdcache(HPPA_SID_KERNEL, (vaddr_t)fpreg,
- sizeof(l->l_addr->u_pcb.pcb_fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)fpreg, sizeof(pcb->pcb_fpregs));
return error;
}
@@ -349,6 +349,7 @@
void
hppa_fpu_emulate(struct trapframe *frame, struct lwp *l, u_int inst)
{
+ struct pcb *pcb = lwp_getpcb(l);
u_int opcode, class, sub;
u_int *fpregs;
int exception;
@@ -389,7 +390,7 @@
#endif
/* Get this LWP's FPU registers. */
- fpregs = (u_int *) l->l_addr->u_pcb.pcb_fpregs;
+ fpregs = (u_int *)pcb->pcb_fpregs;
/* Dispatch on the opcode. */
switch (opcode) {
@@ -444,8 +445,7 @@
ksi.ksi_addr = (void *)frame->tf_iioq_head;
trapsignal(l, &ksi);
}
- fdcache(HPPA_SID_KERNEL, (vaddr_t)fpregs,
- sizeof(l->l_addr->u_pcb.pcb_fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)fpregs, sizeof(pcb->pcb_fpregs));
}
#endif /* FPEMUL */
Index: src/sys/arch/hppa/hppa/hppa_machdep.c
diff -u src/sys/arch/hppa/hppa/hppa_machdep.c:1.17 src/sys/arch/hppa/hppa/hppa_machdep.c:1.18
--- src/sys/arch/hppa/hppa/hppa_machdep.c:1.17 Mon Jun 1 07:10:14 2009
+++ src/sys/arch/hppa/hppa/hppa_machdep.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: hppa_machdep.c,v 1.17 2009/06/01 07:10:14 skrll Exp $ */
+/* $NetBSD: hppa_machdep.c,v 1.18 2009/11/21 15:36:33 rmind Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -27,14 +27,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hppa_machdep.c,v 1.17 2009/06/01 07:10:14 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hppa_machdep.c,v 1.18 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sa.h>
#include <sys/lwp.h>
#include <sys/savar.h>
-#include <sys/user.h>
#include <sys/proc.h>
#include <sys/ras.h>
#include <sys/cpu.h>
@@ -141,6 +140,7 @@
cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags)
{
struct trapframe *tf = l->l_md.md_regs;
+ struct pcb *pcb = lwp_getpcb(l);
__greg_t *gr = mcp->__gregs;
__greg_t ras_pc;
@@ -207,10 +207,9 @@
}
hppa_fpu_flush(l);
- memcpy(&mcp->__fpregs, l->l_addr->u_pcb.pcb_fpregs,
- sizeof(mcp->__fpregs));
- fdcache(HPPA_SID_KERNEL, (vaddr_t)l->l_addr->u_pcb.pcb_fpregs,
- sizeof(l->l_addr->u_pcb.pcb_fpregs));
+ memcpy(&mcp->__fpregs, pcb->pcb_fpregs, sizeof(mcp->__fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)pcb->pcb_fpregs,
+ sizeof(pcb->pcb_fpregs));
*flags |= _UC_FPU;
}
@@ -317,11 +316,12 @@
}
if ((flags & _UC_FPU) != 0) {
+ struct pcb *pcb = lwp_getpcb(l);
+
hppa_fpu_flush(l);
- memcpy(l->l_addr->u_pcb.pcb_fpregs, &mcp->__fpregs,
- sizeof(mcp->__fpregs));
- fdcache(HPPA_SID_KERNEL, (vaddr_t)l->l_addr->u_pcb.pcb_fpregs,
- sizeof(l->l_addr->u_pcb.pcb_fpregs));
+ memcpy(pcb->pcb_fpregs, &mcp->__fpregs, sizeof(mcp->__fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)pcb->pcb_fpregs,
+ sizeof(pcb->pcb_fpregs));
}
mutex_enter(p->p_lock);
Index: src/sys/arch/hppa/hppa/pmap.c
diff -u src/sys/arch/hppa/hppa/pmap.c:1.56 src/sys/arch/hppa/hppa/pmap.c:1.57
--- src/sys/arch/hppa/hppa/pmap.c:1.56 Sat Nov 14 13:31:44 2009
+++ src/sys/arch/hppa/hppa/pmap.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.56 2009/11/14 13:31:44 skrll Exp $ */
+/* $NetBSD: pmap.c,v 1.57 2009/11/21 15:36:33 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.56 2009/11/14 13:31:44 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.57 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1678,13 +1678,13 @@
struct proc *p = l->l_proc;
pmap_t pmap = p->p_vmspace->vm_map.pmap;
pa_space_t space = pmap->pm_space;
- struct pcb *pcb = &l->l_addr->u_pcb;
+ struct pcb *pcb = lwp_getpcb(l);
KASSERT(pcb->pcb_uva == (vaddr_t)l->l_addr);
/* space is cached for the copy{in,out}'s pleasure */
pcb->pcb_space = space;
- fdcache(HPPA_SID_KERNEL, (vaddr_t)pcb, PAGE_SIZE);
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)l->l_addr, PAGE_SIZE);
if (p == curproc)
mtctl(pmap->pm_pid, CR_PIDR2);
Index: src/sys/arch/hppa/hppa/process_machdep.c
diff -u src/sys/arch/hppa/hppa/process_machdep.c:1.13 src/sys/arch/hppa/hppa/process_machdep.c:1.14
--- src/sys/arch/hppa/hppa/process_machdep.c:1.13 Tue Nov 3 05:07:26 2009
+++ src/sys/arch/hppa/hppa/process_machdep.c Sat Nov 21 15:36:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: process_machdep.c,v 1.13 2009/11/03 05:07:26 snj Exp $ */
+/* $NetBSD: process_machdep.c,v 1.14 2009/11/21 15:36:33 rmind Exp $ */
/* $OpenBSD: process_machdep.c,v 1.3 1999/06/18 05:19:52 mickey Exp $ */
@@ -29,13 +29,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.13 2009/11/03 05:07:26 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.14 2009/11/21 15:36:33 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/ptrace.h>
-#include <sys/user.h>
#include <uvm/uvm_extern.h>
@@ -110,10 +109,11 @@
int
process_read_fpregs(struct lwp *l, struct fpreg *fpregs)
{
+ struct pcb *pcb = lwp_getpcb(l);
+
hppa_fpu_flush(l);
- memcpy(fpregs, l->l_addr->u_pcb.pcb_fpregs, sizeof(*fpregs));
- fdcache(HPPA_SID_KERNEL, (vaddr_t)&l->l_addr->u_pcb.pcb_fpregs,
- sizeof(*fpregs));
+ memcpy(fpregs, pcb->pcb_fpregs, sizeof(*fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)&pcb->pcb_fpregs, sizeof(*fpregs));
return 0;
}
@@ -174,19 +174,19 @@
int
process_write_fpregs(struct lwp *l, const struct fpreg *fpregs)
{
+ struct pcb *pcb = lwp_getpcb(l);
+
hppa_fpu_flush(l);
- memcpy(l->l_addr->u_pcb.pcb_fpregs, fpregs, sizeof(*fpregs));
- fdcache(HPPA_SID_KERNEL, (vaddr_t)&l->l_addr->u_pcb.pcb_fpregs,
- sizeof(*fpregs));
+ memcpy(pcb->pcb_fpregs, fpregs, sizeof(*fpregs));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)&pcb->pcb_fpregs, sizeof(*fpregs));
return 0;
}
int
process_set_pc(struct lwp *l, void *addr)
{
+
l->l_md.md_regs->tf_iioq_head = (register_t)addr | HPPA_PC_PRIV_USER;
l->l_md.md_regs->tf_iioq_tail = l->l_md.md_regs->tf_iioq_head + 4;
-
return 0;
}
-
Index: src/sys/arch/hppa/hppa/sig_machdep.c
diff -u src/sys/arch/hppa/hppa/sig_machdep.c:1.22 src/sys/arch/hppa/hppa/sig_machdep.c:1.23
--- src/sys/arch/hppa/hppa/sig_machdep.c:1.22 Fri Nov 21 01:57:33 2008
+++ src/sys/arch/hppa/hppa/sig_machdep.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sig_machdep.c,v 1.22 2008/11/21 01:57:33 he Exp $ */
+/* $NetBSD: sig_machdep.c,v 1.23 2009/11/21 15:36:34 rmind Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -104,7 +104,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.22 2008/11/21 01:57:33 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.23 2009/11/21 15:36:34 rmind Exp $");
#include "opt_compat_netbsd.h"
@@ -112,7 +112,6 @@
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
-#include <sys/user.h>
#include <sys/signal.h>
#include <sys/signalvar.h>
@@ -157,6 +156,7 @@
{
struct lwp *l = curlwp;
struct proc *p = l->l_proc;
+ struct pcb *pcb = lwp_getpcb(l);
struct sigacts *ps = p->p_sigacts;
struct sigframe_siginfo *fp, frame;
struct trapframe *tf;
@@ -209,7 +209,7 @@
tf->tf_r3 = (__greg_t)&fp->sf_uc;
fp++;
- tf->tf_iisq_head = tf->tf_iisq_tail = l->l_addr->u_pcb.pcb_space;
+ tf->tf_iisq_head = tf->tf_iisq_tail = pcb->pcb_space;
tf->tf_iioq_head =
(__greg_t)ps->sa_sigdesc[sig].sd_tramp | HPPA_PC_PRIV_USER;
tf->tf_iioq_tail = tf->tf_iioq_head + 4;
Index: src/sys/arch/hppa/hppa/trap.c
diff -u src/sys/arch/hppa/hppa/trap.c:1.60 src/sys/arch/hppa/hppa/trap.c:1.61
--- src/sys/arch/hppa/hppa/trap.c:1.60 Tue Nov 3 05:07:26 2009
+++ src/sys/arch/hppa/hppa/trap.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.60 2009/11/03 05:07:26 snj Exp $ */
+/* $NetBSD: trap.c,v 1.61 2009/11/21 15:36:34 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.60 2009/11/03 05:07:26 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.61 2009/11/21 15:36:34 rmind Exp $");
/* #define INTRDEBUG */
/* #define TRAPDEBUG */
@@ -79,7 +79,6 @@
#include <sys/ktrace.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
-#include <sys/user.h>
#include <sys/acct.h>
#include <sys/signal.h>
#include <sys/device.h>
@@ -481,7 +480,7 @@
{
struct lwp *l;
struct proc *p;
- struct pcb *pcbp;
+ struct pcb *pcb;
vaddr_t va;
struct vm_map *map;
struct vmspace *vm;
@@ -579,6 +578,8 @@
}
}
#endif
+ pcb = lwp_getpcb(l);
+
switch (type) {
case T_NONEXIST:
case T_NONEXIST|T_USER:
@@ -639,13 +640,11 @@
break;
case T_DATALIGN:
- if (l->l_addr->u_pcb.pcb_onfault) {
+ if (pcb->pcb_onfault) {
do_onfault:
- pcbp = &l->l_addr->u_pcb;
- frame->tf_iioq_tail = 4 +
- (frame->tf_iioq_head =
- pcbp->pcb_onfault);
- pcbp->pcb_onfault = 0;
+ frame->tf_iioq_head = pcb->pcb_onfault;
+ frame->tf_iioq_tail = 4 + frame->tf_iioq_head;
+ pcb->pcb_onfault = 0;
break;
}
/*FALLTHROUGH*/
@@ -721,7 +720,7 @@
int i;
hppa_fpu_flush(l);
- fpp = l->l_addr->u_pcb.pcb_fpregs;
+ fpp = pcb->pcb_fpregs;
pex = (uint32_t *)&fpp[1];
for (i = 1; i < 8 && !*pex; i++, pex++)
;
@@ -856,10 +855,10 @@
/* Never call uvm_fault in interrupt context. */
KASSERT(hppa_intr_depth == 0);
- onfault = l->l_addr->u_pcb.pcb_onfault;
- l->l_addr->u_pcb.pcb_onfault = 0;
+ onfault = pcb->pcb_onfault;
+ pcb->pcb_onfault = 0;
ret = uvm_fault(map, va, vftype);
- l->l_addr->u_pcb.pcb_onfault = onfault;
+ pcb->pcb_onfault = onfault;
#ifdef TRAPDEBUG
printf("uvm_fault(%p, %x, %d)=%d\n",
@@ -896,7 +895,7 @@
ksi.ksi_addr = (void *)va;
trapsignal(l, &ksi);
} else {
- if (l->l_addr->u_pcb.pcb_onfault) {
+ if (pcb->pcb_onfault) {
goto do_onfault;
}
panic("trap: uvm_fault(%p, %lx, %d): %d",
Index: src/sys/arch/hppa/hppa/vm_machdep.c
diff -u src/sys/arch/hppa/hppa/vm_machdep.c:1.37 src/sys/arch/hppa/hppa/vm_machdep.c:1.38
--- src/sys/arch/hppa/hppa/vm_machdep.c:1.37 Wed Oct 21 21:12:00 2009
+++ src/sys/arch/hppa/hppa/vm_machdep.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.37 2009/10/21 21:12:00 rmind Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.38 2009/11/21 15:36:34 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.37 2009/10/21 21:12:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.38 2009/11/21 15:36:34 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -38,7 +38,6 @@
#include <sys/malloc.h>
#include <sys/buf.h>
#include <sys/vnode.h>
-#include <sys/user.h>
#include <sys/ptrace.h>
#include <sys/exec.h>
#include <sys/core.h>
@@ -55,18 +54,18 @@
cpu_activate_pcb(struct lwp *l)
{
struct trapframe *tf = l->l_md.md_regs;
- vaddr_t pcb = (vaddr_t)l->l_addr;
+ struct pcb *pcb = lwp_getpcb(l);
+ vaddr_t uarea = (vaddr_t)pcb;
#ifdef DIAGNOSTIC
- vaddr_t maxsp = pcb + USPACE;
+ vaddr_t maxsp = (vaddr_t)uarea + USPACE;
#endif
-
- KASSERT(tf == (void *)(pcb + PAGE_SIZE));
+ KASSERT(tf == (void *)(uarea + PAGE_SIZE));
/*
* Stash the physical for the pcb of U for later perusal
*/
- l->l_addr->u_pcb.pcb_uva = pcb;
- tf->tf_cr30 = kvtop((void *)pcb);
- fdcache(HPPA_SID_KERNEL, pcb, sizeof(l->l_addr->u_pcb));
+ pcb->pcb_uva = uarea;
+ tf->tf_cr30 = kvtop((void *)uarea);
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)pcb, sizeof(struct pcb));
#ifdef DIAGNOSTIC
/* Create the kernel stack red zone. */
@@ -82,14 +81,14 @@
struct proc *p = l2->l_proc;
pmap_t pmap = p->p_vmspace->vm_map.pmap;
pa_space_t space = pmap->pm_space;
- struct pcb *pcbp;
+ struct pcb *pcb1, *pcb2;
struct trapframe *tf;
register_t sp, osp;
-#ifdef DIAGNOSTIC
- if (round_page(sizeof(struct user)) > PAGE_SIZE)
- panic("USPACE too small for user");
-#endif
+ KASSERT(round_page(sizeof(struct pcb)) <= PAGE_SIZE);
+
+ pcb1 = lwp_getpcb(l1);
+ pcb2 = lwp_getpcb(l2);
l2->l_md.md_flags = 0;
@@ -97,15 +96,14 @@
hppa_fpu_flush(l1);
/* Now copy the parent PCB into the child. */
- pcbp = &l2->l_addr->u_pcb;
- memcpy(pcbp, &l1->l_addr->u_pcb, sizeof(*pcbp));
- fdcache(HPPA_SID_KERNEL, (vaddr_t)&l1->l_addr->u_pcb,
- sizeof(pcbp->pcb_fpregs));
+ memcpy(pcb2, pcb1, sizeof(struct pcb));
+ fdcache(HPPA_SID_KERNEL, (vaddr_t)pcb1, sizeof(pcb1->pcb_fpregs));
+
/* reset any of the pending FPU exceptions from parent */
- pcbp->pcb_fpregs[0] = HPPA_FPU_FORK(pcbp->pcb_fpregs[0]);
- pcbp->pcb_fpregs[1] = 0;
- pcbp->pcb_fpregs[2] = 0;
- pcbp->pcb_fpregs[3] = 0;
+ pcb2->pcb_fpregs[0] = HPPA_FPU_FORK(pcb2->pcb_fpregs[0]);
+ pcb2->pcb_fpregs[1] = 0;
+ pcb2->pcb_fpregs[2] = 0;
+ pcb2->pcb_fpregs[3] = 0;
sp = (register_t)l2->l_addr + PAGE_SIZE;
l2->l_md.md_regs = tf = (struct trapframe *)sp;
@@ -133,7 +131,7 @@
mfctl(CR_EIEM, tf->tf_eiem);
tf->tf_ipsw = PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I /* | PSW_L */ |
(kpsw & PSW_O);
- pcbp->pcb_fpregs[HPPA_NFPREGS] = 0;
+ pcb2->pcb_fpregs[HPPA_NFPREGS] = 0;
/*
* Set up return value registers as libc:fork() expects
@@ -167,18 +165,18 @@
* stack usage is std frame + callee-save registers
*/
sp += HPPA_FRAME_SIZE + 16*4;
- pcbp->pcb_ksp = sp;
+ pcb2->pcb_ksp = sp;
fdcache(HPPA_SID_KERNEL, (vaddr_t)l2->l_addr, sp - (vaddr_t)l2->l_addr);
}
void
cpu_setfunc(struct lwp *l, void (*func)(void *), void *arg)
{
- struct pcb *pcbp = &l->l_addr->u_pcb;
+ struct pcb *pcb = lwp_getpcb(l);
struct trapframe *tf;
register_t sp, osp;
- sp = (register_t)pcbp + PAGE_SIZE;
+ sp = (register_t)pcb + PAGE_SIZE;
l->l_md.md_regs = tf = (struct trapframe *)sp;
sp += sizeof(struct trapframe);
@@ -203,7 +201,7 @@
* stack usage is std frame + callee-save registers
*/
sp += HPPA_FRAME_SIZE + 16*4;
- pcbp->pcb_ksp = sp;
+ pcb->pcb_ksp = sp;
fdcache(HPPA_SID_KERNEL, (vaddr_t)l->l_addr, sp - (vaddr_t)l->l_addr);
}
Index: src/sys/arch/ia64/ia64/cpu.c
diff -u src/sys/arch/ia64/ia64/cpu.c:1.6 src/sys/arch/ia64/ia64/cpu.c:1.7
--- src/sys/arch/ia64/ia64/cpu.c:1.6 Mon Jul 20 06:12:41 2009
+++ src/sys/arch/ia64/ia64/cpu.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.6 2009/07/20 06:12:41 kiyohara Exp $ */
+/* $NetBSD: cpu.c,v 1.7 2009/11/21 15:36:34 rmind Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -30,11 +30,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.6 2009/07/20 06:12:41 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.7 2009/11/21 15:36:34 rmind Exp $");
#include <sys/param.h>
#include <sys/proc.h>
-#include <sys/user.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/malloc.h>
Index: src/sys/arch/ia64/ia64/machdep.c
diff -u src/sys/arch/ia64/ia64/machdep.c:1.17 src/sys/arch/ia64/ia64/machdep.c:1.18
--- src/sys/arch/ia64/ia64/machdep.c:1.17 Sun Aug 23 16:15:45 2009
+++ src/sys/arch/ia64/ia64/machdep.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.17 2009/08/23 16:15:45 ahoka Exp $ */
+/* $NetBSD: machdep.c,v 1.18 2009/11/21 15:36:34 rmind Exp $ */
/*-
* Copyright (c) 2003,2004 Marcel Moolenaar
@@ -741,7 +741,8 @@
* sane) context as the initial context for new threads that are
* forked from us.
*/
- if (savectx(&lwp0.l_addr->u_pcb)) panic("savectx failed");
+ if (savectx(lwp_getpcb(&lwp0)))
+ panic("savectx failed");
/*
* Initialize debuggers, and break into them if appropriate.
Index: src/sys/arch/ia64/ia64/vm_machdep.c
diff -u src/sys/arch/ia64/ia64/vm_machdep.c:1.8 src/sys/arch/ia64/ia64/vm_machdep.c:1.9
--- src/sys/arch/ia64/ia64/vm_machdep.c:1.8 Thu Oct 22 22:28:57 2009
+++ src/sys/arch/ia64/ia64/vm_machdep.c Sat Nov 21 15:36:34 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.8 2009/10/22 22:28:57 rmind Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.9 2009/11/21 15:36:34 rmind Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -36,7 +36,6 @@
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/systm.h>
-#include <sys/user.h>
#include <machine/frame.h>
#include <machine/md_var.h>
@@ -84,23 +83,24 @@
cpu_lwp_fork(struct lwp *l1, struct lwp *l2, void *stack, size_t stacksize,
void (*func)(void *), void *arg)
{
- struct pcb *pcb;
+ struct pcb *pcb1, *pcb2;
struct trapframe *tf;
- /* Copy pcb from lwp l1 to l2. */
+ pcb1 = lwp_getpcb(l1);
+ pcb2 = lwp_getpcb(l2);
+
+ /* Copy pcb from lwp l1 to l2. */
if (l1 == curlwp) {
/* Sync the PCB before we copy it. */
- savectx(&l1->l_addr->u_pcb);
+ savectx(pcb1);
#if 0
-// ia64_highfp_save(???);
+ /* ia64_highfp_save(???); */
#endif
+ } else {
+ KASSERT(l1 == &lwp0);
}
-#ifdef DIAGNOSTIC
- else if (l1 != &lwp0)
- panic("cpu_lwp_fork: curlwp");
-#endif
- pcb = &l2->l_addr->u_pcb;
- *pcb = l1->l_addr->u_pcb;
+
+ *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;
@@ -130,9 +130,9 @@
tf->tf_scratch.gr2 = (unsigned long)FDESC_FUNC(func);
tf->tf_scratch.gr3 = (unsigned long)arg;
- pcb->pcb_special.sp = (unsigned long)tf - 16;
- pcb->pcb_special.rp = (unsigned long)FDESC_FUNC(lwp_trampoline);
- pcb->pcb_special.pfs = 0;
+ pcb2->pcb_special.sp = (unsigned long)tf - 16;
+ pcb2->pcb_special.rp = (unsigned long)FDESC_FUNC(lwp_trampoline);
+ pcb2->pcb_special.pfs = 0;
return;
}
Index: src/sys/arch/ia64/include/proc.h
diff -u src/sys/arch/ia64/include/proc.h:1.3 src/sys/arch/ia64/include/proc.h:1.4
--- src/sys/arch/ia64/include/proc.h:1.3 Thu Mar 20 09:09:20 2008
+++ src/sys/arch/ia64/include/proc.h Sat Nov 21 15:36:34 2009
@@ -1,7 +1,9 @@
#ifndef _IA64_PROC_H_
#define _IA64_PROC_H_
+#include <sys/user.h> /* for sizeof(struct user) */
#include <machine/frame.h>
+
/*
* Machine-dependent part of the lwp structure for ia64
*/