Module Name: src
Committed By: matt
Date: Sun Feb 20 08:08:57 UTC 2011
Modified Files:
src/sys/compat/irix: irix_exec.c irix_prctl.c irix_signal.c
Log Message:
Deal with mips trapframe changes.
To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/compat/irix/irix_exec.c
cvs rdiff -u -r1.51 -r1.52 src/sys/compat/irix/irix_prctl.c
cvs rdiff -u -r1.56 -r1.57 src/sys/compat/irix/irix_signal.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/compat/irix/irix_exec.c
diff -u src/sys/compat/irix/irix_exec.c:1.58 src/sys/compat/irix/irix_exec.c:1.59
--- src/sys/compat/irix/irix_exec.c:1.58 Wed Jul 7 01:30:33 2010
+++ src/sys/compat/irix/irix_exec.c Sun Feb 20 08:08:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: irix_exec.c,v 1.58 2010/07/07 01:30:33 chs Exp $ */
+/* $NetBSD: irix_exec.c,v 1.59 2011/02/20 08:08:57 matt Exp $ */
/*-
* Copyright (c) 2001-2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_exec.c,v 1.58 2010/07/07 01:30:33 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_exec.c,v 1.59 2011/02/20 08:08:57 matt Exp $");
#ifdef _KERNEL_OPT
#include "opt_syscall_debug.h"
@@ -44,7 +44,9 @@
#include <sys/types.h>
#include <sys/malloc.h>
-#include <machine/regnum.h>
+#include <mips/locore.h>
+#include <mips/regnum.h>
+
#include <uvm/uvm_extern.h>
#include <compat/irix/irix_syscall.h>
@@ -123,12 +125,12 @@
void
irix_n32_setregs(struct lwp *l, struct exec_package *pack, vaddr_t stack)
{
- struct frame *f = l->l_md.md_regs;
+ struct trapframe *tf = l->l_md.md_utf;
/* Enable 64 bit instructions (eg: sd) */
- f->f_regs[_R_SR] |= MIPS3_SR_UX | MIPS3_SR_FR;
+ tf->tf_regs[_R_SR] |= MIPS3_SR_UX | MIPS3_SR_FR;
#ifdef _LP64
- f->f_regs[_R_SR] |= MIPS3_SR_KX;
+ tf->tf_regs[_R_SR] |= MIPS3_SR_KX;
#endif
}
Index: src/sys/compat/irix/irix_prctl.c
diff -u src/sys/compat/irix/irix_prctl.c:1.51 src/sys/compat/irix/irix_prctl.c:1.52
--- src/sys/compat/irix/irix_prctl.c:1.51 Thu Jul 1 02:38:28 2010
+++ src/sys/compat/irix/irix_prctl.c Sun Feb 20 08:08:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: irix_prctl.c,v 1.51 2010/07/01 02:38:28 rmind Exp $ */
+/* $NetBSD: irix_prctl.c,v 1.52 2011/02/20 08:08:57 matt Exp $ */
/*-
* Copyright (c) 2001-2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_prctl.c,v 1.51 2010/07/01 02:38:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_prctl.c,v 1.52 2011/02/20 08:08:57 matt Exp $");
#include <sys/errno.h>
#include <sys/types.h>
@@ -50,6 +50,7 @@
#include <uvm/uvm_extern.h>
#include <uvm/uvm_map.h>
+#include <mips/locore.h>
#include <machine/regnum.h>
#include <machine/vmparam.h>
@@ -400,8 +401,8 @@
int inh = isc->isc_inh;
struct lwp *lparent = isc->isc_parent_lwp;
struct proc *parent = lparent->l_proc;
- struct frame *tf = (struct frame *)l2->l_md.md_regs;
- struct frame *ptf = (struct frame *)lparent->l_md.md_regs;
+ struct trapframe *tf = l2->l_md.md_utf;
+ struct trapframe *ptf = lparent->l_md.md_utf;
kauth_cred_t pc;
struct irix_emuldata *ied;
struct irix_emuldata *parent_ied;
@@ -477,21 +478,21 @@
/*
* Setup PC to return to the child entry point
*/
- tf->f_regs[_R_PC] = (unsigned long)isc->isc_entry;
- tf->f_regs[_R_RA] = 0;
+ tf->tf_regs[_R_PC] = (unsigned long)isc->isc_entry;
+ tf->tf_regs[_R_RA] = 0;
/*
* Setup child arguments
*/
- tf->f_regs[_R_A0] = (unsigned long)isc->isc_arg;
- tf->f_regs[_R_A1] = 0;
- tf->f_regs[_R_A2] = 0;
- tf->f_regs[_R_A3] = 0;
- if (ptf->f_regs[_R_S3] == (unsigned long)isc->isc_len) {
- tf->f_regs[_R_S0] = ptf->f_regs[_R_S0];
- tf->f_regs[_R_S1] = ptf->f_regs[_R_S1];
- tf->f_regs[_R_S2] = ptf->f_regs[_R_S2];
- tf->f_regs[_R_S3] = ptf->f_regs[_R_S3];
+ tf->tf_regs[_R_A0] = (unsigned long)isc->isc_arg;
+ tf->tf_regs[_R_A1] = 0;
+ tf->tf_regs[_R_A2] = 0;
+ tf->tf_regs[_R_A3] = 0;
+ if (ptf->tf_regs[_R_S3] == (unsigned long)isc->isc_len) {
+ tf->tf_regs[_R_S0] = ptf->tf_regs[_R_S0];
+ tf->tf_regs[_R_S1] = ptf->tf_regs[_R_S1];
+ tf->tf_regs[_R_S2] = ptf->tf_regs[_R_S2];
+ tf->tf_regs[_R_S3] = ptf->tf_regs[_R_S3];
}
/*
Index: src/sys/compat/irix/irix_signal.c
diff -u src/sys/compat/irix/irix_signal.c:1.56 src/sys/compat/irix/irix_signal.c:1.57
--- src/sys/compat/irix/irix_signal.c:1.56 Thu Feb 3 21:45:31 2011
+++ src/sys/compat/irix/irix_signal.c Sun Feb 20 08:08:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: irix_signal.c,v 1.56 2011/02/03 21:45:31 joerg Exp $ */
+/* $NetBSD: irix_signal.c,v 1.57 2011/02/20 08:08:57 matt Exp $ */
/*-
* Copyright (c) 1994, 2001-2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_signal.c,v 1.56 2011/02/03 21:45:31 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_signal.c,v 1.57 2011/02/20 08:08:57 matt Exp $");
#include <sys/types.h>
#include <sys/signal.h>
@@ -44,9 +44,10 @@
#include <sys/vnode.h>
#include <sys/wait.h>
-#include <machine/regnum.h>
-#include <machine/pcb.h>
-#include <machine/trap.h>
+#include <mips/locore.h>
+#include <mips/regnum.h>
+#include <mips/trap.h>
+#include <mips/pcb.h>
#include <compat/common/compat_util.h>
@@ -245,7 +246,7 @@
struct lwp *l = curlwp;
struct proc *p = l->l_proc;
void *sp;
- struct frame *f = l->l_md.md_regs;
+ struct trapframe *tf = l->l_md.md_utf;
int onstack;
int error;
sig_t catcher = SIGACTION(p, ksi->ksi_signo).sa_handler;
@@ -257,7 +258,7 @@
(void *)catcher, ksi->ksi_signo, ksi->ksi_trap);
printf("irix_sendsig(): starting [PC=0x%#"PRIxREGISTER
" SP=%#"PRIxREGISTER" SR=0x%08lx]\n",
- f->f_regs[_R_PC], f->f_regs[_R_SP], f->f_regs[_R_SR]);
+ tf->tf_regs[_R_PC], tf->tf_regs[_R_SP], tf->tf_regs[_R_SR]);
#endif /* DEBUG_IRIX */
/*
@@ -278,7 +279,7 @@
+ l->l_sigstk.ss_size);
else
/* cast for O64 case */
- sp = (void *)(intptr_t)f->f_regs[_R_SP];
+ sp = (void *)(intptr_t)tf->tf_regs[_R_SP];
/*
* Build the signal frame
@@ -287,7 +288,7 @@
if (SIGACTION(p, ksi->ksi_signo).sa_flags & SA_SIGINFO) {
irix_set_ucontext(&sf.isf_ctx.iss.iuc, mask, ksi->ksi_trap, l);
irix_signal_siginfo(&sf.isf_ctx.iss.iis, ksi->ksi_signo,
- ksi->ksi_trap, (void *)f->f_regs[_R_BADVADDR]);
+ ksi->ksi_trap, (void *)tf->tf_regs[_R_BADVADDR]);
} else {
irix_set_sigcontext(&sf.isf_ctx.isc, mask, ksi->ksi_trap, l);
}
@@ -322,10 +323,10 @@
/*
* Set up signal trampoline arguments.
*/
- f->f_regs[_R_A0] = native_to_svr4_signo[ksi->ksi_signo];/* signo */
- f->f_regs[_R_A1] = 0; /* NULL */
- f->f_regs[_R_A2] = (intptr_t)sp; /* ucontext/sigcontext */
- f->f_regs[_R_A3] = (intptr_t)catcher; /* signal handler address */
+ tf->tf_regs[_R_A0] = native_to_svr4_signo[ksi->ksi_signo];/* signo */
+ tf->tf_regs[_R_A1] = 0; /* NULL */
+ tf->tf_regs[_R_A2] = (intptr_t)sp; /* ucontext/sigcontext */
+ tf->tf_regs[_R_A3] = (intptr_t)catcher; /* signal handler address */
/*
* When siginfo is selected, the higher bit of A0 is set
@@ -334,17 +335,17 @@
* Also, A1 points to struct siginfo instead of being NULL.
*/
if (SIGACTION(p, ksi->ksi_signo).sa_flags & SA_SIGINFO) {
- f->f_regs[_R_A0] |= 0x80000000;
- f->f_regs[_R_A1] = (intptr_t)sp +
+ tf->tf_regs[_R_A0] |= 0x80000000;
+ tf->tf_regs[_R_A1] = (intptr_t)sp +
((intptr_t)&sf.isf_ctx.iss.iis - (intptr_t)&sf);
}
/*
* Set up the new stack pointer
*/
- f->f_regs[_R_SP] = (intptr_t)sp;
+ tf->tf_regs[_R_SP] = (intptr_t)sp;
#ifdef DEBUG_IRIX
- printf("stack pointer at %p, A1 = %p\n", sp, (void *)f->f_regs[_R_A1]);
+ printf("stack pointer at %p, A1 = %p\n", sp, (void *)tf->tf_regs[_R_A1]);
#endif /* DEBUG_IRIX */
/*
@@ -353,7 +354,7 @@
* see irix_sys_sigaction for details about how we get
* the signal trampoline address.
*/
- f->f_regs[_R_PC] = (intptr_t)
+ tf->tf_regs[_R_PC] = (intptr_t)
(((struct irix_emuldata *)(p->p_emuldata))->ied_sigtramp[ksi->ksi_signo]);
/*
@@ -371,42 +372,38 @@
irix_set_sigcontext (struct irix_sigcontext *scp, const sigset_t *mask,
int code, struct lwp *l)
{
- struct frame *f;
- struct pcb *pcb;
- int i;
+ struct trapframe * const tf = l->l_md.md_utf;
+ struct pcb * const pcb = lwp_getpcb(l);
KASSERT(mutex_owned(l->l_proc->p_lock));
#ifdef DEBUG_IRIX
printf("irix_set_sigcontext()\n");
#endif
- f = (struct frame *)l->l_md.md_regs;
/*
* Build stack frame for signal trampoline.
*/
native_to_irix_sigset(mask, &scp->isc_sigset);
- for (i = 1; i < 32; i++) { /* save gpr1 - gpr31 */
- scp->isc_regs[i] = f->f_regs[i];
+ for (u_int i = 1; i < 32; i++) { /* save gpr1 - gpr31 */
+ scp->isc_regs[i] = tf->tf_regs[i];
}
scp->isc_regs[0] = 0;
scp->isc_fp_rounded_result = 0;
scp->isc_regmask = -2;
- scp->isc_mdhi = f->f_regs[_R_MULHI];
- scp->isc_mdlo = f->f_regs[_R_MULLO];
- scp->isc_pc = f->f_regs[_R_PC];
- scp->isc_badvaddr = f->f_regs[_R_BADVADDR];
- scp->isc_cause = f->f_regs[_R_CAUSE];
+ scp->isc_mdhi = tf->tf_regs[_R_MULHI];
+ scp->isc_mdlo = tf->tf_regs[_R_MULLO];
+ scp->isc_pc = tf->tf_regs[_R_PC];
+ scp->isc_badvaddr = tf->tf_regs[_R_BADVADDR];
+ scp->isc_cause = tf->tf_regs[_R_CAUSE];
/*
* Save the floating-point state, if necessary, then copy it.
*/
- pcb = lwp_getpcb(l);
-#ifndef SOFTFLOAT
- scp->isc_ownedfp = l->l_md.md_flags & MDP_FPUSED;
+#if !defined(NOFPU) || defined(FPEMUL)
+ scp->isc_ownedfp = fpu_used_p(l);
if (scp->isc_ownedfp) {
/* if FPU has current state, save it first */
- if (l == fpcurlwp)
- savefpregs(l);
+ fpu_save_lwp(l);
memcpy(&scp->isc_fpregs, &pcb->pcb_fpregs,
sizeof(scp->isc_fpregs));
scp->isc_fpc_csr = pcb->pcb_fpregs.r_regs[32];
@@ -427,8 +424,7 @@
irix_set_ucontext(struct irix_ucontext *ucp, const sigset_t *mask,
int code, struct lwp *l)
{
- struct frame *f;
- struct pcb *pcb;
+ struct trapframe * const tf = l->l_md.md_utf;
KASSERT(mutex_owned(l->l_proc->p_lock));
@@ -436,28 +432,26 @@
printf("irix_set_ucontext()\n");
#endif
- f = (struct frame *)l->l_md.md_regs;
/*
* Save general purpose registers
*/
native_to_irix_sigset(mask, &ucp->iuc_sigmask);
memcpy(&ucp->iuc_mcontext.svr4___gregs,
- &f->f_regs, 32 * sizeof(mips_reg_t));
+ &tf->tf_regs, 32 * sizeof(mips_reg_t));
/* Theses registers have different order on NetBSD and IRIX */
- ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDLO] = f->f_regs[_R_MULLO];
- ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDHI] = f->f_regs[_R_MULHI];
- ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_EPC] = f->f_regs[_R_PC];
- ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_CAUSE] = f->f_regs[_R_CAUSE];
+ ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDLO] = tf->tf_regs[_R_MULLO];
+ ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDHI] = tf->tf_regs[_R_MULHI];
+ ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_EPC] = tf->tf_regs[_R_PC];
+ ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_CAUSE] = tf->tf_regs[_R_CAUSE];
/*
* Save the floating-point state, if necessary, then copy it.
*/
- pcb = lwp_getpcb(l);
-#ifndef SOFTFLOAT
- if (l->l_md.md_flags & MDP_FPUSED) {
- /* if FPU has current state, save it first */
- if (l == fpcurlwp)
- savefpregs(l);
+#if !defined(NOFPU) || defined(FPEMUL)
+ if (fpu_used_p(l)) {
+ struct pcb * const pcb = lwp_getpcb(l);
+ /* FPU has current state, save it first */
+ fpu_save_lwp(l);
memcpy(&ucp->iuc_mcontext.svr4___fpregs,
&pcb->pcb_fpregs, sizeof(ucp->iuc_mcontext.svr4___fpregs));
ucp->iuc_mcontext.svr4___fpregs.svr4___fp_csr =
@@ -539,9 +533,9 @@
#ifdef DEBUG_IRIX
printf("irix_sys_sigreturn(): returning [PC=%p SP=%p SR=0x%08lx]\n",
- (void *)((struct frame *)(l->l_md.md_regs))->f_regs[_R_PC],
- (void *)((struct frame *)(l->l_md.md_regs))->f_regs[_R_SP],
- ((struct frame *)(l->l_md.md_regs))->f_regs[_R_SR]);
+ (void *)l->l_md.md_utf->tf_regs[_R_PC],
+ (void *)(l->l_md.md_utf->tf_regs[_R_SP],
+ l->l_md.md_utf->tf_regs[_R_SR]);
#endif
return EJUSTRETURN;
@@ -550,33 +544,29 @@
static void
irix_get_ucontext(struct irix_ucontext *ucp, struct lwp *l)
{
- struct frame *f;
+ struct trapframe *tf = l->l_md.md_utf;
sigset_t mask;
KASSERT(mutex_owned(l->l_proc->p_lock));
/* Restore the register context. */
- f = (struct frame *)l->l_md.md_regs;
if (ucp->iuc_flags & IRIX_UC_CPU) {
- (void)memcpy(&f->f_regs, &ucp->iuc_mcontext.svr4___gregs,
+ (void)memcpy(&tf->tf_regs, &ucp->iuc_mcontext.svr4___gregs,
32 * sizeof(mips_reg_t));
/* Theses registers have different order on NetBSD and IRIX */
- f->f_regs[_R_MULLO] =
+ tf->tf_regs[_R_MULLO] =
ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDLO];
- f->f_regs[_R_MULHI] =
+ tf->tf_regs[_R_MULHI] =
ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_MDHI];
- f->f_regs[_R_PC] =
+ tf->tf_regs[_R_PC] =
ucp->iuc_mcontext.svr4___gregs[IRIX_CTX_EPC];
}
if (ucp->iuc_flags & IRIX_UC_MAU) {
- struct pcb *pcb = lwp_getpcb(l);
-#ifndef SOFTFLOAT
- /* Disable the FPU to fault in FP registers. */
- f->f_regs[_R_SR] &= ~MIPS_SR_COP_1_BIT;
- if (l == fpcurlwp)
- fpcurlwp = NULL;
+ struct pcb * const pcb = lwp_getpcb(l);
+#if !defined(NOFPU) || defined(FPEMUL)
+ fpu_discard();
memcpy(&pcb->pcb_fpregs, &ucp->iuc_mcontext.svr4___fpregs,
sizeof(pcb->pcb_fpregs));
pcb->pcb_fpregs.r_regs[32] =
@@ -620,29 +610,24 @@
static void
irix_get_sigcontext(struct irix_sigcontext *scp, struct lwp *l)
{
- struct frame *f;
- struct pcb *pcb;
+ struct trapframe * const tf = l->l_md.md_utf;
+ struct pcb * const pcb = lwp_getpcb(l);
sigset_t mask;
int i;
KASSERT(mutex_owned(l->l_proc->p_lock));
/* Restore the register context. */
- f = (struct frame *)l->l_md.md_regs;
for (i = 1; i < 32; i++) /* restore gpr1 to gpr31 */
- f->f_regs[i] = scp->isc_regs[i];
- f->f_regs[_R_MULLO] = scp->isc_mdlo;
- f->f_regs[_R_MULHI] = scp->isc_mdhi;
- f->f_regs[_R_PC] = scp->isc_pc;
+ tf->tf_regs[i] = scp->isc_regs[i];
+ tf->tf_regs[_R_MULLO] = scp->isc_mdlo;
+ tf->tf_regs[_R_MULHI] = scp->isc_mdhi;
+ tf->tf_regs[_R_PC] = scp->isc_pc;
- pcb = lwp_getpcb(l);
-#ifndef SOFTFLOAT
+#if !defined(NOFPU) || defined(FPEMUL)
if (scp->isc_ownedfp) {
- /* Disable the FPU to fault in FP registers. */
- f->f_regs[_R_SR] &= ~MIPS_SR_COP_1_BIT;
- if (l == fpcurlwp)
- fpcurlwp = NULL;
+ fpu_discard();
memcpy(&pcb->pcb_fpregs, &scp->isc_fpregs,
sizeof(scp->isc_fpregs));
pcb->pcb_fpregs.r_regs[32] = scp->isc_fpc_csr;
@@ -701,11 +686,10 @@
syscallarg(struct irix_ucontext *) ucp;
} */
struct proc *p = l->l_proc;
- struct frame *f;
+ struct trapframe *tf = l->l_md.md_utf;
struct irix_ucontext kucp;
int i, error;
- f = (struct frame *)l->l_md.md_regs;
memset(&kucp, 0, sizeof(kucp));
@@ -724,7 +708,7 @@
mutex_exit(p->p_lock);
for (i = 0; i < 36; i++) /* Is order correct? */
- kucp.iuc_mcontext.svr4___gregs[i] = f->f_regs[i];
+ kucp.iuc_mcontext.svr4___gregs[i] = tf->tf_regs[i];
for (i = 0; i < 32; i++)
kucp.iuc_mcontext.svr4___fpregs.svr4___fp_r.svr4___fp_regs[i]
= 0; /* XXX where are FP registers? */
@@ -747,7 +731,7 @@
syscallarg(struct irix_ucontext *) ucp;
} */
struct proc *p = l->l_proc;
- struct frame *f;
+ struct trapframe *tf = l->l_md.md_utf;
struct irix_ucontext kucp;
int i, error;
@@ -755,7 +739,6 @@
if (error)
goto out;
- f = (struct frame *)l->l_md.md_regs;
mutex_enter(p->p_lock);
@@ -778,7 +761,7 @@
if (kucp.iuc_flags & IRIX_UC_CPU)
for (i = 0; i < 36; i++) /* Is register order right? */
- f->f_regs[i] = kucp.iuc_mcontext.svr4___gregs[i];
+ tf->tf_regs[i] = kucp.iuc_mcontext.svr4___gregs[i];
if (kucp.iuc_flags & IRIX_UC_MAU) { /* XXX */
#ifdef DEBUG_IRIX