Switch to using PSL_USEROK_P()

Use new save_fpu_lwp sematics to save or discard the fpu state appropriately.
This commit is contained in:
matt 2004-04-17 08:47:15 +00:00
parent d9fb13565a
commit a6b639c3a5
1 changed files with 21 additions and 21 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_machdep.c,v 1.27 2004/03/26 17:34:18 drochner Exp $ */
/* $NetBSD: linux_machdep.c,v 1.28 2004/04/17 08:47:15 matt Exp $ */
/*-
* Copyright (c) 1995, 2000, 2001 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.27 2004/03/26 17:34:18 drochner Exp $");
__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.28 2004/04/17 08:47:15 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -180,7 +180,7 @@ linux_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
for (i = 0; i < 32; i++)
linux_regs.lgpr[i] = tf->fixreg[i];
linux_regs.lnip = tf->srr0;
linux_regs.lmsr = tf->srr1;
linux_regs.lmsr = tf->srr1 & PSL_USERSRR1;
linux_regs.lorig_gpr3 = tf->fixreg[3]; /* XXX Is that right? */
linux_regs.lctr = tf->ctr;
linux_regs.llink = tf->lr;
@ -195,8 +195,8 @@ linux_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
memset(&frame, 0, sizeof(frame));
memcpy(&frame.lgp_regs, &linux_regs, sizeof(linux_regs));
save_fpu_lwp(curlwp);
memcpy(&frame.lfp_regs, curpcb->pcb_fpu.fpr, sizeof(frame.lfp_regs));
save_fpu_lwp(curlwp, FPU_SAVE);
memcpy(&frame.lfp_regs, curpcb->pcb_fpu.fpreg, sizeof(frame.lfp_regs));
/*
* Copy Linux's signal trampoline on the user stack It should not
@ -299,11 +299,6 @@ linux_sys_rt_sigreturn(l, v, retval)
if (copyin((caddr_t)scp, &sigframe, sizeof(*scp)))
return (EFAULT);
/*
* Make sure, fpu is sync'ed
*/
save_fpu_lwp(curlwp);
/*
* Restore register context.
*/
@ -318,7 +313,7 @@ linux_sys_rt_sigreturn(l, v, retval)
(unsigned long)tf, (unsigned long)scp);
#endif
if ((lregs->lmsr & PSL_USERSTATIC) != (tf->srr1 & PSL_USERSTATIC))
if (!PSL_USEROK_P(lregs->lmsr))
return (EINVAL);
for (i = 0; i < 32; i++)
@ -330,8 +325,13 @@ linux_sys_rt_sigreturn(l, v, retval)
tf->srr0 = lregs->lnip;
tf->srr1 = lregs->lmsr;
memcpy(curpcb->pcb_fpu.fpr, (caddr_t)&sregs.lfp_regs,
sizeof(curpcb->pcb_fpu.fpr));
/*
* Make sure the fpu state is discarded
*/
save_fpu_lwp(curlwp, FPU_DISCARD);
memcpy(curpcb->pcb_fpu.fpreg, (caddr_t)&sregs.lfp_regs,
sizeof(curpcb->pcb_fpu.fpreg));
/*
* Restore signal stack.
@ -389,11 +389,6 @@ linux_sys_sigreturn(l, v, retval)
if (copyin(scp, &context, sizeof(*scp)))
return (EFAULT);
/*
* Make sure, fpu is in sync
*/
save_fpu_lwp(curlwp);
/*
* Restore register context.
*/
@ -407,7 +402,7 @@ linux_sys_sigreturn(l, v, retval)
(unsigned long)tf, (unsigned long)scp);
#endif
if ((lregs->lmsr & PSL_USERSTATIC) != (tf->srr1 & PSL_USERSTATIC))
if (!PSL_USEROK_P(lregs->lmsr))
return (EINVAL);
for (i = 0; i < 32; i++)
@ -419,8 +414,13 @@ linux_sys_sigreturn(l, v, retval)
tf->srr0 = lregs->lnip;
tf->srr1 = lregs->lmsr;
memcpy(curpcb->pcb_fpu.fpr, (caddr_t)&sregs.lfp_regs,
sizeof(curpcb->pcb_fpu.fpr));
/*
* Make sure the fpu state is discarded
*/
save_fpu_lwp(curlwp, FPU_DISCARD);
memcpy(curpcb->pcb_fpu.fpreg, (caddr_t)&sregs.lfp_regs,
sizeof(curpcb->pcb_fpu.fpreg));
/*
* Restore signal stack.