- Use lwp_getpcb() on Alpha.
- Replace and clean struct user usage, slightly simplify some code parts. - Include sys/user.h in MD proc.h .
This commit is contained in:
parent
8065606a88
commit
498ef96f10
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: a12dc.c,v 1.23 2009/03/18 10:22:22 cegger Exp $ */
|
||||
/* $NetBSD: a12dc.c,v 1.24 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/* [Notice revision 2.2]
|
||||
* Copyright (c) 1997, 1998 Avalon Computer Systems, Inc.
|
||||
@ -64,7 +64,7 @@
|
||||
#ifndef BSIDE
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: a12dc.c,v 1.23 2009/03/18 10:22:22 cegger Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: a12dc.c,v 1.24 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
@ -73,7 +73,6 @@ __KERNEL_RCSID(0, "$NetBSD: a12dc.c,v 1.23 2009/03/18 10:22:22 cegger Exp $");
|
||||
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/conf.h>
|
||||
@ -159,7 +158,7 @@ a12dcattach(struct device *parent, struct device *self, void *aux)
|
||||
/* note that we've attached the chipset; can't have 2 A12Cs. */
|
||||
a12dcfound = 1;
|
||||
|
||||
printf(": driver %s\n", "$Revision: 1.23 $");
|
||||
printf(": driver %s\n", "$Revision: 1.24 $");
|
||||
|
||||
tp = a12dc_tty[0] = ttymalloc();
|
||||
tp->t_oproc = a12dcstart;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: compat_13_machdep.c,v 1.17 2008/04/24 18:39:20 ad Exp $ */
|
||||
/* $NetBSD: compat_13_machdep.c,v 1.18 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
|
||||
@ -29,14 +29,13 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.17 2008/04/24 18:39:20 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.18 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/syscallargs.h>
|
||||
|
||||
@ -66,6 +65,7 @@ compat_13_sys_sigreturn(struct lwp *l, const struct compat_13_sys_sigreturn_args
|
||||
} */
|
||||
struct sigcontext13 *scp, ksc;
|
||||
struct proc *p = l->l_proc;
|
||||
struct pcb *pcb;
|
||||
sigset13_t mask13;
|
||||
sigset_t mask;
|
||||
|
||||
@ -93,9 +93,10 @@ compat_13_sys_sigreturn(struct lwp *l, const struct compat_13_sys_sigreturn_args
|
||||
alpha_pal_wrusp(ksc.sc_regs[R_SP]);
|
||||
|
||||
/* XXX ksc.sc_ownedfp ? */
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
pcb = lwp_getpcb(l);
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
memcpy(&l->l_addr->u_pcb.pcb_fp, (struct fpreg *)ksc.sc_fpregs,
|
||||
memcpy(&pcb->pcb_fp, (struct fpreg *)ksc.sc_fpregs,
|
||||
sizeof(struct fpreg));
|
||||
/* XXX ksc.sc_fp_control ? */
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: compat_16_machdep.c,v 1.15 2008/11/21 19:48:56 he Exp $ */
|
||||
/* $NetBSD: compat_16_machdep.c,v 1.16 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
@ -77,7 +77,6 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/syscallargs.h>
|
||||
#include <sys/user.h>
|
||||
|
||||
#if defined(COMPAT_13) || defined(COMPAT_OSF1)
|
||||
#include <compat/sys/signal.h>
|
||||
@ -87,7 +86,7 @@
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/reg.h>
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: compat_16_machdep.c,v 1.15 2008/11/21 19:48:56 he Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: compat_16_machdep.c,v 1.16 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -106,6 +105,7 @@ sendsig_sigcontext(const ksiginfo_t *ksi, const sigset_t *mask)
|
||||
{
|
||||
struct lwp *l = curlwp;
|
||||
struct proc *p = l->l_proc;
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
struct sigacts *ps = p->p_sigacts;
|
||||
int onstack, sig = ksi->ksi_signo, error;
|
||||
struct sigframe_sigcontext *fp, frame;
|
||||
@ -132,10 +132,10 @@ sendsig_sigcontext(const ksiginfo_t *ksi, const sigset_t *mask)
|
||||
frame.sf_sc.sc_regs[R_SP] = alpha_pal_rdusp();
|
||||
|
||||
/* save the floating-point state, if necessary, then copy it. */
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 1);
|
||||
frame.sf_sc.sc_ownedfp = l->l_md.md_flags & MDP_FPUSED;
|
||||
memcpy((struct fpreg *)frame.sf_sc.sc_fpregs, &l->l_addr->u_pcb.pcb_fp,
|
||||
memcpy((struct fpreg *)frame.sf_sc.sc_fpregs, &pcb->pcb_fp,
|
||||
sizeof(struct fpreg));
|
||||
frame.sf_sc.sc_fp_control = alpha_read_fp_c(l);
|
||||
memset(frame.sf_sc.sc_reserved, 0, sizeof frame.sf_sc.sc_reserved);
|
||||
@ -252,6 +252,7 @@ compat_16_sys___sigreturn14(struct lwp *l, const struct compat_16_sys___sigretur
|
||||
} */
|
||||
struct sigcontext *scp, ksc;
|
||||
struct proc *p = l->l_proc;
|
||||
struct pcb *pcb;
|
||||
|
||||
/*
|
||||
* The trampoline code hands us the context.
|
||||
@ -281,11 +282,12 @@ compat_16_sys___sigreturn14(struct lwp *l, const struct compat_16_sys___sigretur
|
||||
alpha_pal_wrusp(ksc.sc_regs[R_SP]);
|
||||
|
||||
/* XXX ksc.sc_ownedfp ? */
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
pcb = lwp_getpcb(l);
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
memcpy(&l->l_addr->u_pcb.pcb_fp, (struct fpreg *)ksc.sc_fpregs,
|
||||
memcpy(&pcb->pcb_fp, (struct fpreg *)ksc.sc_fpregs,
|
||||
sizeof(struct fpreg));
|
||||
l->l_addr->u_pcb.pcb_fp.fpr_cr = ksc.sc_fpcr;
|
||||
pcb->pcb_fp.fpr_cr = ksc.sc_fpcr;
|
||||
l->l_md.md_flags = ksc.sc_fp_control & MDP_FP_C;
|
||||
|
||||
mutex_enter(p->p_lock);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: core_machdep.c,v 1.2 2009/08/15 23:44:57 matt Exp $ */
|
||||
/* $NetBSD: core_machdep.c,v 1.3 2009/11/21 05:35:40 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: core_machdep.c,v 1.2 2009/08/15 23:44:57 matt Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.3 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -37,7 +37,6 @@ __KERNEL_RCSID(0, "$NetBSD: core_machdep.c,v 1.2 2009/08/15 23:44:57 matt Exp $"
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/core.h>
|
||||
#include <sys/exec.h>
|
||||
|
||||
@ -72,9 +71,10 @@ cpu_coredump(struct lwp *l, void *iocookie, struct core *chdr)
|
||||
cpustate.md_tf = *l->l_md.md_tf;
|
||||
cpustate.md_tf.tf_regs[FRAME_SP] = alpha_pal_rdusp(); /* XXX */
|
||||
if (l->l_md.md_flags & MDP_FPUSED) {
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 1);
|
||||
cpustate.md_fpstate = l->l_addr->u_pcb.pcb_fp;
|
||||
cpustate.md_fpstate = pcb->pcb_fp;
|
||||
} else
|
||||
memset(&cpustate.md_fpstate, 0, sizeof(cpustate.md_fpstate));
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cpu.c,v 1.86 2009/09/06 18:06:24 mhitch Exp $ */
|
||||
/* $NetBSD: cpu.c,v 1.87 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
|
||||
@ -59,7 +59,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.86 2009/09/06 18:06:24 mhitch Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.87 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_multiprocessor.h"
|
||||
@ -69,7 +69,6 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.86 2009/09/06 18:06:24 mhitch Exp $");
|
||||
#include <sys/device.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/atomic.h>
|
||||
#include <sys/cpu.h>
|
||||
|
||||
@ -425,7 +424,7 @@ cpu_boot_secondary(struct cpu_info *ci)
|
||||
struct pcb *pcb;
|
||||
u_long cpumask;
|
||||
|
||||
pcb = &ci->ci_data.cpu_idlelwp->l_addr->u_pcb;
|
||||
pcb = lwp_getpcb(ci->ci_data.cpu_idlelwp);
|
||||
primary_pcsp = LOCATE_PCS(hwrpb, hwrpb->rpb_primary_cpu_id);
|
||||
pcsp = LOCATE_PCS(hwrpb, ci->ci_cpuid);
|
||||
cpumask = (1UL << ci->ci_cpuid);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: db_trace.c,v 1.25 2009/10/21 21:11:58 rmind Exp $ */
|
||||
/* $NetBSD: db_trace.c,v 1.26 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -35,12 +35,11 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.25 2009/10/21 21:11:58 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.26 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
|
||||
#include <machine/alpha.h>
|
||||
#include <machine/db_machdep.h>
|
||||
@ -230,7 +229,7 @@ db_stack_trace_print(db_expr_t addr, bool have_addr, db_expr_t count,
|
||||
KASSERT(l != NULL);
|
||||
}
|
||||
(*pr)("lid %d ", l->l_lid);
|
||||
pcbp = &l->l_addr->u_pcb;
|
||||
pcbp = lwp_getpcb(l);
|
||||
addr = (db_expr_t)pcbp->pcb_hw.apcb_ksp;
|
||||
callpc = pcbp->pcb_context[7];
|
||||
(*pr)("at 0x%lx\n", addr);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: linux_syscall.c,v 1.29 2008/10/21 12:16:58 ad Exp $ */
|
||||
/* $NetBSD: linux_syscall.c,v 1.30 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||
@ -89,12 +89,11 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_syscall.c,v 1.29 2008/10/21 12:16:58 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_syscall.c,v 1.30 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/signal.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/syscallvar.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: linux_trap.c,v 1.7 2008/04/28 20:23:10 martin Exp $ */
|
||||
/* $NetBSD: linux_trap.c,v 1.8 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
@ -30,12 +30,11 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_trap.c,v 1.7 2008/04/28 20:23:10 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: linux_trap.c,v 1.8 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/acct.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/signal.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: machdep.c,v 1.321 2009/10/25 20:39:45 mhitch Exp $ */
|
||||
/* $NetBSD: machdep.c,v 1.322 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
|
||||
@ -68,7 +68,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.321 2009/10/25 20:39:45 mhitch Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.322 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -1597,6 +1597,7 @@ void
|
||||
setregs(register struct lwp *l, struct exec_package *pack, u_long stack)
|
||||
{
|
||||
struct trapframe *tfp = l->l_md.md_tf;
|
||||
struct pcb *pcb;
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
#endif
|
||||
@ -1615,7 +1616,8 @@ setregs(register struct lwp *l, struct exec_package *pack, u_long stack)
|
||||
#else
|
||||
memset(tfp->tf_regs, 0, FRAME_SIZE * sizeof tfp->tf_regs[0]);
|
||||
#endif
|
||||
memset(&l->l_addr->u_pcb.pcb_fp, 0, sizeof l->l_addr->u_pcb.pcb_fp);
|
||||
pcb = lwp_getpcb(l);
|
||||
memset(&pcb->pcb_fp, 0, sizeof(pcb->pcb_fp));
|
||||
alpha_pal_wrusp(stack);
|
||||
tfp->tf_regs[FRAME_PS] = ALPHA_PSL_USERSET;
|
||||
tfp->tf_regs[FRAME_PC] = pack->ep_entry & ~3;
|
||||
@ -1629,9 +1631,9 @@ setregs(register struct lwp *l, struct exec_package *pack, u_long stack)
|
||||
l->l_md.md_flags &= ~MDP_FPUSED;
|
||||
if (__predict_true((l->l_md.md_flags & IEEE_INHERIT) == 0)) {
|
||||
l->l_md.md_flags &= ~MDP_FP_C;
|
||||
l->l_addr->u_pcb.pcb_fp.fpr_cr = FPCR_DYN(FP_RN);
|
||||
pcb->pcb_fp.fpr_cr = FPCR_DYN(FP_RN);
|
||||
}
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
}
|
||||
|
||||
@ -1642,6 +1644,7 @@ void
|
||||
fpusave_cpu(struct cpu_info *ci, int save)
|
||||
{
|
||||
struct lwp *l;
|
||||
struct pcb *pcb;
|
||||
#if defined(MULTIPROCESSOR)
|
||||
int s;
|
||||
#endif
|
||||
@ -1657,19 +1660,20 @@ fpusave_cpu(struct cpu_info *ci, int save)
|
||||
if (l == NULL)
|
||||
goto out;
|
||||
|
||||
pcb = lwp_getpcb(l);
|
||||
if (save) {
|
||||
alpha_pal_wrfen(1);
|
||||
savefpstate(&l->l_addr->u_pcb.pcb_fp);
|
||||
savefpstate(&pcb->pcb_fp);
|
||||
}
|
||||
|
||||
alpha_pal_wrfen(0);
|
||||
|
||||
FPCPU_LOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_LOCK(pcb);
|
||||
|
||||
l->l_addr->u_pcb.pcb_fpcpu = NULL;
|
||||
pcb->pcb_fpcpu = NULL;
|
||||
ci->ci_fpcurlwp = NULL;
|
||||
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
|
||||
out:
|
||||
#if defined(MULTIPROCESSOR)
|
||||
@ -1687,21 +1691,23 @@ fpusave_proc(struct lwp *l, int save)
|
||||
{
|
||||
struct cpu_info *ci = curcpu();
|
||||
struct cpu_info *oci;
|
||||
struct pcb *pcb;
|
||||
#if defined(MULTIPROCESSOR)
|
||||
u_long ipi = save ? ALPHA_IPI_SYNCH_FPU : ALPHA_IPI_DISCARD_FPU;
|
||||
int s, spincount;
|
||||
#endif
|
||||
|
||||
KDASSERT(l->l_addr != NULL);
|
||||
pcb = lwp_getpcb(l);
|
||||
KDASSERT(pcb != NULL);
|
||||
|
||||
#if defined(MULTIPROCESSOR)
|
||||
s = splhigh(); /* block IPIs for the duration */
|
||||
#endif
|
||||
FPCPU_LOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_LOCK(pcb);
|
||||
|
||||
oci = l->l_addr->u_pcb.pcb_fpcpu;
|
||||
oci = pcb->pcb_fpcpu;
|
||||
if (oci == NULL) {
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
#if defined(MULTIPROCESSOR)
|
||||
splx(s);
|
||||
#endif
|
||||
@ -1711,7 +1717,7 @@ fpusave_proc(struct lwp *l, int save)
|
||||
#if defined(MULTIPROCESSOR)
|
||||
if (oci == ci) {
|
||||
KASSERT(ci->ci_fpcurlwp == l);
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
splx(s);
|
||||
fpusave_cpu(ci, save);
|
||||
return;
|
||||
@ -1719,10 +1725,10 @@ fpusave_proc(struct lwp *l, int save)
|
||||
|
||||
KASSERT(oci->ci_fpcurlwp == l);
|
||||
alpha_send_ipi(oci->ci_cpuid, ipi);
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
|
||||
spincount = 0;
|
||||
while (l->l_addr->u_pcb.pcb_fpcpu != NULL) {
|
||||
while (pcb->pcb_fpcpu != NULL) {
|
||||
spincount++;
|
||||
delay(1000); /* XXX */
|
||||
if (spincount > 10000)
|
||||
@ -1730,7 +1736,7 @@ fpusave_proc(struct lwp *l, int save)
|
||||
}
|
||||
#else
|
||||
KASSERT(ci->ci_fpcurlwp == l);
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
fpusave_cpu(ci, save);
|
||||
#endif /* MULTIPROCESSOR */
|
||||
}
|
||||
@ -1869,6 +1875,7 @@ void
|
||||
cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags)
|
||||
{
|
||||
struct trapframe *frame = l->l_md.md_tf;
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
__greg_t *gr = mcp->__gregs;
|
||||
__greg_t ras_pc;
|
||||
|
||||
@ -1882,8 +1889,8 @@ cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags)
|
||||
gr[_REG_SP] = alpha_pal_rdusp();
|
||||
gr[_REG_UNIQUE] = alpha_pal_rdunique();
|
||||
} else {
|
||||
gr[_REG_SP] = l->l_addr->u_pcb.pcb_hw.apcb_usp;
|
||||
gr[_REG_UNIQUE] = l->l_addr->u_pcb.pcb_hw.apcb_unique;
|
||||
gr[_REG_SP] = pcb->pcb_hw.apcb_usp;
|
||||
gr[_REG_UNIQUE] = pcb->pcb_hw.apcb_unique;
|
||||
}
|
||||
gr[_REG_PC] = frame->tf_regs[FRAME_PC];
|
||||
gr[_REG_PS] = frame->tf_regs[FRAME_PS];
|
||||
@ -1897,7 +1904,7 @@ cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags)
|
||||
/* Save floating point register context, if any, and copy it. */
|
||||
if (l->l_md.md_flags & MDP_FPUSED) {
|
||||
fpusave_proc(l, 1);
|
||||
(void)memcpy(&mcp->__fpregs, &l->l_addr->u_pcb.pcb_fp,
|
||||
(void)memcpy(&mcp->__fpregs, &pcb->pcb_fp,
|
||||
sizeof (mcp->__fpregs));
|
||||
mcp->__fpregs.__fp_fpcr = alpha_read_fp_c(l);
|
||||
*flags |= _UC_FPU;
|
||||
@ -1909,6 +1916,7 @@ int
|
||||
cpu_setmcontext(struct lwp *l, const mcontext_t *mcp, unsigned int flags)
|
||||
{
|
||||
struct trapframe *frame = l->l_md.md_tf;
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
const __greg_t *gr = mcp->__gregs;
|
||||
|
||||
/* Restore register context, if any. */
|
||||
@ -1922,7 +1930,7 @@ cpu_setmcontext(struct lwp *l, const mcontext_t *mcp, unsigned int flags)
|
||||
if (l == curlwp)
|
||||
alpha_pal_wrusp(gr[_REG_SP]);
|
||||
else
|
||||
l->l_addr->u_pcb.pcb_hw.apcb_usp = gr[_REG_SP];
|
||||
pcb->pcb_hw.apcb_usp = gr[_REG_SP];
|
||||
frame->tf_regs[FRAME_PC] = gr[_REG_PC];
|
||||
frame->tf_regs[FRAME_PS] = gr[_REG_PS];
|
||||
}
|
||||
@ -1930,15 +1938,15 @@ cpu_setmcontext(struct lwp *l, const mcontext_t *mcp, unsigned int flags)
|
||||
if (l == curlwp)
|
||||
alpha_pal_wrunique(gr[_REG_UNIQUE]);
|
||||
else
|
||||
l->l_addr->u_pcb.pcb_hw.apcb_unique = gr[_REG_UNIQUE];
|
||||
pcb->pcb_hw.apcb_unique = gr[_REG_UNIQUE];
|
||||
}
|
||||
/* Restore floating point register context, if any. */
|
||||
if (flags & _UC_FPU) {
|
||||
/* If we have an FP register context, get rid of it. */
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
(void)memcpy(&l->l_addr->u_pcb.pcb_fp, &mcp->__fpregs,
|
||||
sizeof (l->l_addr->u_pcb.pcb_fp));
|
||||
(void)memcpy(&pcb->pcb_fp, &mcp->__fpregs,
|
||||
sizeof (pcb->pcb_fp));
|
||||
l->l_md.md_flags = mcp->__fpregs.__fp_fpcr & MDP_FP_C;
|
||||
l->l_md.md_flags |= MDP_FPUSED;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: osf1_syscall.c,v 1.31 2008/10/21 12:16:58 ad Exp $ */
|
||||
/* $NetBSD: osf1_syscall.c,v 1.32 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||
@ -89,12 +89,11 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: osf1_syscall.c,v 1.31 2008/10/21 12:16:58 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: osf1_syscall.c,v 1.32 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/signal.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/syscallvar.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: pmap.c,v 1.250 2009/11/09 04:31:03 mhitch Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.251 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008 The NetBSD Foundation, Inc.
|
||||
@ -140,7 +140,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.250 2009/11/09 04:31:03 mhitch Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.251 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -148,7 +148,6 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.250 2009/11/09 04:31:03 mhitch Exp $");
|
||||
#include <sys/proc.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/pool.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/atomic.h>
|
||||
@ -584,12 +583,12 @@ do { \
|
||||
*/
|
||||
#define PMAP_ACTIVATE(pmap, l, cpu_id) \
|
||||
do { \
|
||||
struct pcb *pcb = lwp_getpcb(l); \
|
||||
PMAP_ACTIVATE_ASN_SANITY(pmap, cpu_id); \
|
||||
\
|
||||
(l)->l_addr->u_pcb.pcb_hw.apcb_ptbr = \
|
||||
pcb->pcb_hw.apcb_ptbr = \
|
||||
ALPHA_K0SEG_TO_PHYS((vaddr_t)(pmap)->pm_lev1map) >> PGSHIFT; \
|
||||
(l)->l_addr->u_pcb.pcb_hw.apcb_asn = \
|
||||
(pmap)->pm_asni[(cpu_id)].pma_asn; \
|
||||
pcb->pcb_hw.apcb_asn = (pmap)->pm_asni[(cpu_id)].pma_asn; \
|
||||
\
|
||||
if ((l) == curlwp) { \
|
||||
/* \
|
||||
@ -749,6 +748,7 @@ pmap_bootstrap(paddr_t ptaddr, u_int maxasn, u_long ncpuids)
|
||||
pt_entry_t *lev2map, *lev3map;
|
||||
pt_entry_t pte;
|
||||
vsize_t bufsz;
|
||||
struct pcb *pcb;
|
||||
int i;
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -949,10 +949,10 @@ pmap_bootstrap(paddr_t ptaddr, u_int maxasn, u_long ncpuids)
|
||||
* Set up proc0's PCB such that the ptbr points to the right place
|
||||
* and has the kernel pmap's (really unused) ASN.
|
||||
*/
|
||||
lwp0.l_addr->u_pcb.pcb_hw.apcb_ptbr =
|
||||
pcb = lwp_getpcb(&lwp0);
|
||||
pcb->pcb_hw.apcb_ptbr =
|
||||
ALPHA_K0SEG_TO_PHYS((vaddr_t)kernel_lev1map) >> PGSHIFT;
|
||||
lwp0.l_addr->u_pcb.pcb_hw.apcb_asn =
|
||||
pmap_kernel()->pm_asni[cpu_number()].pma_asn;
|
||||
pcb->pcb_hw.apcb_asn = pmap_kernel()->pm_asni[cpu_number()].pma_asn;
|
||||
|
||||
/*
|
||||
* Mark the kernel pmap `active' on this processor.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: process_machdep.c,v 1.24 2007/03/04 05:59:10 christos Exp $ */
|
||||
/* $NetBSD: process_machdep.c,v 1.25 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Christopher G. Demetriou
|
||||
@ -54,13 +54,12 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.24 2007/03/04 05:59:10 christos Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.25 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
||||
@ -70,26 +69,26 @@ __KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.24 2007/03/04 05:59:10 christo
|
||||
#include <machine/alpha.h>
|
||||
|
||||
#define lwp_frame(l) ((l)->l_md.md_tf)
|
||||
#define lwp_pcb(l) (&(l)->l_addr->u_pcb)
|
||||
#define lwp_fpframe(l) (&(lwp_pcb(l)->pcb_fp))
|
||||
|
||||
int
|
||||
process_read_regs(struct lwp *l, struct reg *regs)
|
||||
{
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
|
||||
frametoreg(lwp_frame(l), regs);
|
||||
regs->r_regs[R_ZERO] = lwp_frame(l)->tf_regs[FRAME_PC];
|
||||
regs->r_regs[R_SP] = lwp_pcb(l)->pcb_hw.apcb_usp;
|
||||
regs->r_regs[R_SP] = pcb->pcb_hw.apcb_usp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
process_write_regs(struct lwp *l, const struct reg *regs)
|
||||
{
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
|
||||
regtoframe(regs, lwp_frame(l));
|
||||
lwp_frame(l)->tf_regs[FRAME_PC] = regs->r_regs[R_ZERO];
|
||||
lwp_pcb(l)->pcb_hw.apcb_usp = regs->r_regs[R_SP];
|
||||
pcb->pcb_hw.apcb_usp = regs->r_regs[R_SP];
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -115,21 +114,23 @@ process_set_pc(struct lwp *l, void *addr)
|
||||
int
|
||||
process_read_fpregs(struct lwp *l, struct fpreg *regs)
|
||||
{
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 1);
|
||||
|
||||
memcpy(regs, lwp_fpframe(l), sizeof(struct fpreg));
|
||||
memcpy(regs, &pcb->pcb_fp, sizeof(struct fpreg));
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
process_write_fpregs(struct lwp *l, const struct fpreg *regs)
|
||||
{
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
|
||||
memcpy(lwp_fpframe(l), regs, sizeof(struct fpreg));
|
||||
memcpy(&pcb->pcb_fp, regs, sizeof(struct fpreg));
|
||||
return (0);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: prom.c,v 1.45 2008/01/05 00:31:50 ad Exp $ */
|
||||
/* $NetBSD: prom.c,v 1.46 2009/11/21 05:35:40 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1994, 1995, 1996 Carnegie Mellon University
|
||||
@ -27,7 +27,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: prom.c,v 1.45 2008/01/05 00:31:50 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: prom.c,v 1.46 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include "opt_multiprocessor.h"
|
||||
|
||||
@ -35,7 +35,6 @@ __KERNEL_RCSID(0, "$NetBSD: prom.c,v 1.45 2008/01/05 00:31:50 ad Exp $");
|
||||
#include <sys/systm.h>
|
||||
#include <sys/simplelock.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/cpu.h>
|
||||
|
||||
#include <uvm/uvm_extern.h>
|
||||
@ -302,13 +301,14 @@ hwrpb_checksum(void)
|
||||
void
|
||||
hwrpb_primary_init(void)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
struct pcs *p;
|
||||
|
||||
p = LOCATE_PCS(hwrpb, hwrpb->rpb_primary_cpu_id);
|
||||
|
||||
/* Initialize the primary's HWPCB and the Virtual Page Table Base. */
|
||||
memcpy(p->pcs_hwpcb, &lwp0.l_addr->u_pcb.pcb_hw,
|
||||
sizeof lwp0.l_addr->u_pcb.pcb_hw);
|
||||
pcb = lwp_getpcb(&lwp0);
|
||||
memcpy(p->pcs_hwpcb, &pcb->pcb_hw, sizeof(pcb->pcb_hw));
|
||||
hwrpb->rpb_vptb = VPTBASE;
|
||||
|
||||
hwrpb->rpb_checksum = hwrpb_checksum();
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: promcons.c,v 1.34 2007/11/19 18:51:36 ad Exp $ */
|
||||
/* $NetBSD: promcons.c,v 1.35 2009/11/21 05:35:40 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: promcons.c,v 1.34 2007/11/19 18:51:36 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: promcons.c,v 1.35 2009/11/21 05:35:40 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -37,7 +37,6 @@ __KERNEL_RCSID(0, "$NetBSD: promcons.c,v 1.34 2007/11/19 18:51:36 ad Exp $");
|
||||
#include <sys/select.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/kernel.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: syscall.c,v 1.34 2008/10/21 12:16:58 ad Exp $ */
|
||||
/* $NetBSD: syscall.c,v 1.35 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||
@ -89,7 +89,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.34 2008/10/21 12:16:58 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.35 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include "opt_sa.h"
|
||||
|
||||
@ -98,7 +98,6 @@ __KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.34 2008/10/21 12:16:58 ad Exp $");
|
||||
#include <sys/proc.h>
|
||||
#include <sys/sa.h>
|
||||
#include <sys/savar.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/signal.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/syscallvar.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: trap.c,v 1.120 2008/10/15 06:51:17 wrstuden Exp $ */
|
||||
/* $NetBSD: trap.c,v 1.121 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
|
||||
@ -93,14 +93,13 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.120 2008/10/15 06:51:17 wrstuden Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.121 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/sa.h>
|
||||
#include <sys/savar.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/kauth.h>
|
||||
@ -396,6 +395,7 @@ trap(const u_long a0, const u_long a1, const u_long a2, const u_long entry,
|
||||
vaddr_t va;
|
||||
struct vmspace *vm = NULL;
|
||||
struct vm_map *map;
|
||||
struct pcb *pcb;
|
||||
int rv;
|
||||
|
||||
switch (a2) {
|
||||
@ -442,12 +442,12 @@ trap(const u_long a0, const u_long a1, const u_long a2, const u_long entry,
|
||||
* [fs]uswintr, in case another fault happens
|
||||
* when they are running.
|
||||
*/
|
||||
if (l->l_addr->u_pcb.pcb_onfault ==
|
||||
(unsigned long)fswintrberr &&
|
||||
l->l_addr->u_pcb.pcb_accessaddr == a0) {
|
||||
pcb = lwp_getpcb(l);
|
||||
if (pcb->pcb_onfault == (u_long)fswintrberr &&
|
||||
pcb->pcb_accessaddr == a0) {
|
||||
framep->tf_regs[FRAME_PC] =
|
||||
l->l_addr->u_pcb.pcb_onfault;
|
||||
l->l_addr->u_pcb.pcb_onfault = 0;
|
||||
pcb->pcb_onfault;
|
||||
pcb->pcb_onfault = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -468,8 +468,9 @@ trap(const u_long a0, const u_long a1, const u_long a2, const u_long entry,
|
||||
* argument space is lazy-allocated.
|
||||
*/
|
||||
do_fault:
|
||||
pcb = lwp_getpcb(l);
|
||||
if (user == 0 && (a0 >= VM_MIN_KERNEL_ADDRESS ||
|
||||
l->l_addr->u_pcb.pcb_onfault == 0))
|
||||
pcb->pcb_onfault == 0))
|
||||
map = kernel_map;
|
||||
else {
|
||||
vm = l->l_proc->p_vmspace;
|
||||
@ -503,12 +504,15 @@ do_fault:
|
||||
|
||||
if (user == 0) {
|
||||
/* Check for copyin/copyout fault */
|
||||
if (l != NULL &&
|
||||
l->l_addr->u_pcb.pcb_onfault != 0) {
|
||||
if (l == NULL) {
|
||||
goto dopanic;
|
||||
}
|
||||
pcb = lwp_getpcb(l);
|
||||
if (pcb->pcb_onfault != 0) {
|
||||
framep->tf_regs[FRAME_PC] =
|
||||
l->l_addr->u_pcb.pcb_onfault;
|
||||
pcb->pcb_onfault;
|
||||
framep->tf_regs[FRAME_V0] = rv;
|
||||
l->l_addr->u_pcb.pcb_onfault = 0;
|
||||
pcb->pcb_onfault = 0;
|
||||
goto out;
|
||||
}
|
||||
goto dopanic;
|
||||
@ -581,6 +585,7 @@ alpha_enable_fp(struct lwp *l, int check)
|
||||
int s;
|
||||
#endif
|
||||
struct cpu_info *ci = curcpu();
|
||||
struct pcb *pcb;
|
||||
|
||||
if (check && ci->ci_fpcurlwp == l) {
|
||||
alpha_pal_wrfen(1);
|
||||
@ -594,22 +599,23 @@ alpha_enable_fp(struct lwp *l, int check)
|
||||
|
||||
KDASSERT(ci->ci_fpcurlwp == NULL);
|
||||
|
||||
pcb = lwp_getpcb(l);
|
||||
#if defined(MULTIPROCESSOR)
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 1);
|
||||
#else
|
||||
KDASSERT(l->l_addr->u_pcb.pcb_fpcpu == NULL);
|
||||
KDASSERT(pcb->pcb_fpcpu == NULL);
|
||||
#endif
|
||||
|
||||
#if defined(MULTIPROCESSOR)
|
||||
s = splhigh(); /* block IPIs */
|
||||
#endif
|
||||
FPCPU_LOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_LOCK(pcb);
|
||||
|
||||
l->l_addr->u_pcb.pcb_fpcpu = ci;
|
||||
pcb->pcb_fpcpu = ci;
|
||||
ci->ci_fpcurlwp = l;
|
||||
|
||||
FPCPU_UNLOCK(&l->l_addr->u_pcb);
|
||||
FPCPU_UNLOCK(pcb);
|
||||
#if defined(MULTIPROCESSOR)
|
||||
splx(s);
|
||||
#endif
|
||||
@ -629,7 +635,7 @@ alpha_enable_fp(struct lwp *l, int check)
|
||||
atomic_inc_ulong(&fpevent_reuse.ev_count);
|
||||
|
||||
alpha_pal_wrfen(1);
|
||||
restorefpstate(&l->l_addr->u_pcb.pcb_fp);
|
||||
restorefpstate(&pcb->pcb_fp);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -690,10 +696,10 @@ static const int reg_to_framereg[32] = {
|
||||
&(l)->l_md.md_tf->tf_regs[reg_to_framereg[(reg)]])
|
||||
|
||||
#define frp(l, reg) \
|
||||
(&(l)->l_addr->u_pcb.pcb_fp.fpr_regs[(reg)])
|
||||
(&pcb->pcb_fp.fpr_regs[(reg)])
|
||||
|
||||
#define dump_fp_regs() \
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL) \
|
||||
#define dump_fp_regs(pcb) \
|
||||
if (pcb->pcb_fpcpu != NULL) \
|
||||
fpusave_proc(l, 1)
|
||||
|
||||
#define unaligned_load(storage, ptrf, mod) \
|
||||
@ -718,13 +724,17 @@ static const int reg_to_framereg[32] = {
|
||||
#define unaligned_store_integer(storage) \
|
||||
unaligned_store(storage, irp, )
|
||||
|
||||
#define unaligned_load_floating(storage, mod) \
|
||||
dump_fp_regs(); \
|
||||
unaligned_load(storage, frp, mod)
|
||||
#define unaligned_load_floating(storage, mod) do { \
|
||||
struct pcb *pcb = lwp_getpcb(l); \
|
||||
dump_fp_regs(pcb); \
|
||||
unaligned_load(storage, frp, mod) \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define unaligned_store_floating(storage, mod) \
|
||||
dump_fp_regs(); \
|
||||
unaligned_store(storage, frp, mod)
|
||||
#define unaligned_store_floating(storage, mod) do { \
|
||||
struct pcb *pcb = lwp_getpcb(l); \
|
||||
dump_fp_regs(pcb); \
|
||||
unaligned_store(storage, frp, mod) \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
static unsigned long
|
||||
Sfloat_to_reg(u_int s)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: vm_machdep.c,v 1.101 2009/10/21 21:11:58 rmind Exp $ */
|
||||
/* $NetBSD: vm_machdep.c,v 1.102 2009/11/21 05:35:41 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.101 2009/10/21 21:11:58 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.102 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -37,7 +37,6 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.101 2009/10/21 21:11:58 rmind Exp $
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/core.h>
|
||||
#include <sys/exec.h>
|
||||
|
||||
@ -51,8 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.101 2009/10/21 21:11:58 rmind Exp $
|
||||
void
|
||||
cpu_lwp_free(struct lwp *l, int proc)
|
||||
{
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
|
||||
if (l->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l, 0);
|
||||
}
|
||||
|
||||
@ -84,9 +84,12 @@ void
|
||||
cpu_lwp_fork(struct lwp *l1, struct lwp *l2, void *stack, size_t stacksize,
|
||||
void (*func)(void *), void *arg)
|
||||
{
|
||||
struct user *up = l2->l_addr;
|
||||
struct pcb *pcb1, *pcb2;
|
||||
extern void lwp_trampoline(void);
|
||||
|
||||
pcb1 = lwp_getpcb(l1);
|
||||
pcb2 = lwp_getpcb(l2);
|
||||
|
||||
l2->l_md.md_tf = l1->l_md.md_tf;
|
||||
l2->l_md.md_flags = l1->l_md.md_flags & (MDP_FPUSED | MDP_FP_C);
|
||||
l2->l_md.md_astpending = 0;
|
||||
@ -95,25 +98,25 @@ cpu_lwp_fork(struct lwp *l1, struct lwp *l2, void *stack, size_t stacksize,
|
||||
* Cache the physical address of the pcb, so we can
|
||||
* swap to it easily.
|
||||
*/
|
||||
l2->l_md.md_pcbpaddr = (void *)vtophys((vaddr_t)&up->u_pcb);
|
||||
l2->l_md.md_pcbpaddr = (void *)vtophys((vaddr_t)pcb2);
|
||||
|
||||
/*
|
||||
* Copy floating point state from the FP chip to the PCB
|
||||
* if this process has state stored there.
|
||||
*/
|
||||
if (l1->l_addr->u_pcb.pcb_fpcpu != NULL)
|
||||
if (pcb1->pcb_fpcpu != NULL)
|
||||
fpusave_proc(l1, 1);
|
||||
|
||||
/*
|
||||
* Copy pcb and user stack pointer from proc p1 to p2.
|
||||
* If specificed, give the child a different stack.
|
||||
*/
|
||||
l2->l_addr->u_pcb = l1->l_addr->u_pcb;
|
||||
*pcb2 = *pcb1;
|
||||
if (stack != NULL)
|
||||
l2->l_addr->u_pcb.pcb_hw.apcb_usp = (u_long)stack + stacksize;
|
||||
pcb2->pcb_hw.apcb_usp = (u_long)stack + stacksize;
|
||||
else
|
||||
l2->l_addr->u_pcb.pcb_hw.apcb_usp = alpha_pal_rdusp();
|
||||
simple_lock_init(&l2->l_addr->u_pcb.pcb_fpcpu_slock);
|
||||
pcb2->pcb_hw.apcb_usp = alpha_pal_rdusp();
|
||||
simple_lock_init(&pcb2->pcb_fpcpu_slock);
|
||||
|
||||
/*
|
||||
* Arrange for a non-local goto when the new process
|
||||
@ -151,39 +154,38 @@ cpu_lwp_fork(struct lwp *l1, struct lwp *l2, void *stack, size_t stacksize,
|
||||
l2tf->tf_regs[FRAME_A3] = 0; /* no error */
|
||||
l2tf->tf_regs[FRAME_A4] = 1; /* is child */
|
||||
|
||||
up = l2->l_addr;
|
||||
up->u_pcb.pcb_hw.apcb_ksp =
|
||||
(u_int64_t)l2->l_md.md_tf;
|
||||
up->u_pcb.pcb_context[0] =
|
||||
(u_int64_t)func; /* s0: pc */
|
||||
up->u_pcb.pcb_context[1] =
|
||||
(u_int64_t)exception_return; /* s1: ra */
|
||||
up->u_pcb.pcb_context[2] =
|
||||
(u_int64_t)arg; /* s2: arg */
|
||||
up->u_pcb.pcb_context[3] =
|
||||
(u_int64_t)l2; /* s3: lwp */
|
||||
up->u_pcb.pcb_context[7] =
|
||||
(u_int64_t)lwp_trampoline; /* ra: assembly magic */
|
||||
pcb2->pcb_hw.apcb_ksp =
|
||||
(uint64_t)l2->l_md.md_tf;
|
||||
pcb2->pcb_context[0] =
|
||||
(uint64_t)func; /* s0: pc */
|
||||
pcb2->pcb_context[1] =
|
||||
(uint64_t)exception_return; /* s1: ra */
|
||||
pcb2->pcb_context[2] =
|
||||
(uint64_t)arg; /* s2: arg */
|
||||
pcb2->pcb_context[3] =
|
||||
(uint64_t)l2; /* s3: lwp */
|
||||
pcb2->pcb_context[7] =
|
||||
(uint64_t)lwp_trampoline; /* ra: assembly magic */
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cpu_setfunc(struct lwp *l, void (*func)(void *), void *arg)
|
||||
{
|
||||
struct user *up = l->l_addr;
|
||||
struct pcb *pcb = lwp_getpcb(l);
|
||||
extern void setfunc_trampoline(void);
|
||||
|
||||
up->u_pcb.pcb_hw.apcb_ksp =
|
||||
(u_int64_t)l->l_md.md_tf;
|
||||
up->u_pcb.pcb_context[0] =
|
||||
(u_int64_t)func; /* s0: pc */
|
||||
up->u_pcb.pcb_context[1] =
|
||||
(u_int64_t)exception_return; /* s1: ra */
|
||||
up->u_pcb.pcb_context[2] =
|
||||
(u_int64_t)arg; /* s2: arg */
|
||||
up->u_pcb.pcb_context[7] =
|
||||
(u_int64_t)setfunc_trampoline; /* ra: assembly magic */
|
||||
}
|
||||
pcb->pcb_hw.apcb_ksp =
|
||||
(uint64_t)l->l_md.md_tf;
|
||||
pcb->pcb_context[0] =
|
||||
(uint64_t)func; /* s0: pc */
|
||||
pcb->pcb_context[1] =
|
||||
(uint64_t)exception_return; /* s1: ra */
|
||||
pcb->pcb_context[2] =
|
||||
(uint64_t)arg; /* s2: arg */
|
||||
pcb->pcb_context[7] =
|
||||
(uint64_t)setfunc_trampoline; /* ra: assembly magic */
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a user I/O request into kernel virtual address space.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: proc.h,v 1.17 2007/02/09 21:55:01 ad Exp $ */
|
||||
/* $NetBSD: proc.h,v 1.18 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
|
||||
@ -30,6 +30,7 @@
|
||||
#ifndef _ALPHA_PROC_H
|
||||
#define _ALPHA_PROC_H
|
||||
|
||||
#include <sys/user.h> /* for sizeof(struct user) */
|
||||
#include <machine/frame.h>
|
||||
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: com_jensenio.c,v 1.10 2008/04/28 20:23:11 martin Exp $ */
|
||||
/* $NetBSD: com_jensenio.c,v 1.11 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: com_jensenio.c,v 1.10 2008/04/28 20:23:11 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: com_jensenio.c,v 1.11 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -39,7 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: com_jensenio.c,v 1.10 2008/04/28 20:23:11 martin Exp
|
||||
#include <sys/select.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: lpt_jensenio.c,v 1.9 2008/04/28 20:23:11 martin Exp $ */
|
||||
/* $NetBSD: lpt_jensenio.c,v 1.10 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: lpt_jensenio.c,v 1.9 2008/04/28 20:23:11 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: lpt_jensenio.c,v 1.10 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -39,7 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: lpt_jensenio.c,v 1.9 2008/04/28 20:23:11 martin Exp
|
||||
#include <sys/select.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: com_sableio.c,v 1.8 2008/04/28 20:23:12 martin Exp $ */
|
||||
/* $NetBSD: com_sableio.c,v 1.9 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: com_sableio.c,v 1.8 2008/04/28 20:23:12 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: com_sableio.c,v 1.9 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -39,7 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: com_sableio.c,v 1.8 2008/04/28 20:23:12 martin Exp $
|
||||
#include <sys/select.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: lpt_sableio.c,v 1.6 2008/04/28 20:23:12 martin Exp $ */
|
||||
/* $NetBSD: lpt_sableio.c,v 1.7 2009/11/21 05:35:41 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: lpt_sableio.c,v 1.6 2008/04/28 20:23:12 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: lpt_sableio.c,v 1.7 2009/11/21 05:35:41 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -39,7 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: lpt_sableio.c,v 1.6 2008/04/28 20:23:12 martin Exp $
|
||||
#include <sys/select.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/uio.h>
|
||||
|
Loading…
x
Reference in New Issue
Block a user