Module Name: src Committed By: dsl Date: Sun Feb 23 22:35:28 UTC 2014
Modified Files: src/sys/arch/i386/i386: freebsd_machdep.c ibcs2_machdep.c svr4_machdep.c src/sys/arch/x86/include: fpu.h src/sys/arch/x86/x86: fpu.c Log Message: Add fpu_set_default_cw() and use it in the emulations to set the default x87 control word. This means that nothing outside fpu.c cares about the internals of the fpu save area. New kernel modules won't load with the old kernel - but that won't matter. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/arch/i386/i386/freebsd_machdep.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/i386/i386/ibcs2_machdep.c cvs rdiff -u -r1.98 -r1.99 src/sys/arch/i386/i386/svr4_machdep.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/x86/include/fpu.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/x86/x86/fpu.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/i386/i386/freebsd_machdep.c diff -u src/sys/arch/i386/i386/freebsd_machdep.c:1.59 src/sys/arch/i386/i386/freebsd_machdep.c:1.60 --- src/sys/arch/i386/i386/freebsd_machdep.c:1.59 Wed Feb 12 23:24:09 2014 +++ src/sys/arch/i386/i386/freebsd_machdep.c Sun Feb 23 22:35:27 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: freebsd_machdep.c,v 1.59 2014/02/12 23:24:09 dsl Exp $ */ +/* $NetBSD: freebsd_machdep.c,v 1.60 2014/02/23 22:35:27 dsl Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.59 2014/02/12 23:24:09 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.60 2014/02/23 22:35:27 dsl Exp $"); #if defined(_KERNEL_OPT) #include "opt_vm86.h" @@ -60,13 +60,9 @@ __KERNEL_RCSID(0, "$NetBSD: freebsd_mach void freebsd_setregs(struct lwp *l, struct exec_package *epp, vaddr_t stack) { - struct pcb *pcb = lwp_getpcb(l); setregs(l, epp, stack); - if (i386_use_fxsave) - pcb->pcb_savefpu.sv_xmm.fx_cw = __FreeBSD_NPXCW__; - else - pcb->pcb_savefpu.sv_87.s87_cw = __FreeBSD_NPXCW__; + fpu_set_default_cw(l, __FreeBSD_NPXCW__); } /* Index: src/sys/arch/i386/i386/ibcs2_machdep.c diff -u src/sys/arch/i386/i386/ibcs2_machdep.c:1.43 src/sys/arch/i386/i386/ibcs2_machdep.c:1.44 --- src/sys/arch/i386/i386/ibcs2_machdep.c:1.43 Wed Feb 12 23:24:09 2014 +++ src/sys/arch/i386/i386/ibcs2_machdep.c Sun Feb 23 22:35:27 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ibcs2_machdep.c,v 1.43 2014/02/12 23:24:09 dsl Exp $ */ +/* $NetBSD: ibcs2_machdep.c,v 1.44 2014/02/23 22:35:27 dsl Exp $ */ /*- * Copyright (c) 1997, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ibcs2_machdep.c,v 1.43 2014/02/12 23:24:09 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ibcs2_machdep.c,v 1.44 2014/02/23 22:35:27 dsl Exp $"); #if defined(_KERNEL_OPT) #include "opt_vm86.h" @@ -64,14 +64,11 @@ __KERNEL_RCSID(0, "$NetBSD: ibcs2_machde void ibcs2_setregs(struct lwp *l, struct exec_package *epp, vaddr_t stack) { - struct pcb *pcb = lwp_getpcb(l); struct trapframe *tf; setregs(l, epp, stack); - if (i386_use_fxsave) - pcb->pcb_savefpu.sv_xmm.fx_cw = __iBCS2_NPXCW__; - else - pcb->pcb_savefpu.sv_87.s87_cw = __iBCS2_NPXCW__; + fpu_set_default_cw(l, __iBCS2_NPXCW__); + tf = l->l_md.md_regs; tf->tf_eax = 0x2000000; /* XXX base of heap */ tf->tf_cs = GSEL(GUCODEBIG_SEL, SEL_UPL); Index: src/sys/arch/i386/i386/svr4_machdep.c diff -u src/sys/arch/i386/i386/svr4_machdep.c:1.98 src/sys/arch/i386/i386/svr4_machdep.c:1.99 --- src/sys/arch/i386/i386/svr4_machdep.c:1.98 Sun Jan 19 14:30:37 2014 +++ src/sys/arch/i386/i386/svr4_machdep.c Sun Feb 23 22:35:27 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_machdep.c,v 1.98 2014/01/19 14:30:37 dsl Exp $ */ +/* $NetBSD: svr4_machdep.c,v 1.99 2014/02/23 22:35:27 dsl Exp $ */ /*- * Copyright (c) 1994, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: svr4_machdep.c,v 1.98 2014/01/19 14:30:37 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_machdep.c,v 1.99 2014/02/23 22:35:27 dsl Exp $"); #if defined(_KERNEL_OPT) #include "opt_vm86.h" @@ -69,6 +69,8 @@ __KERNEL_RCSID(0, "$NetBSD: svr4_machdep #include <machine/vmparam.h> #include <machine/svr4_machdep.h> +#include <x86/fpu.h> + static void svr4_getsiginfo(union svr4_siginfo *, int, u_long, void *); extern void (*svr4_fasttrap_vec)(void); void svr4_fasttrap(struct trapframe); @@ -111,14 +113,11 @@ svr4_printmcontext(const char *fun, svr4 void svr4_setregs(struct lwp *l, struct exec_package *epp, vaddr_t stack) { - struct pcb *pcb = lwp_getpcb(l); struct trapframe *tf = l->l_md.md_regs; setregs(l, epp, stack); - if (i386_use_fxsave) - pcb->pcb_savefpu.sv_xmm.fx_cw = __SVR4_NPXCW__; - else - pcb->pcb_savefpu.sv_87.s87_cw = __SVR4_NPXCW__; + fpu_set_default_cw(l, __SVR4_NPXCW__); + tf->tf_cs = GSEL(GUCODEBIG_SEL, SEL_UPL); } Index: src/sys/arch/x86/include/fpu.h diff -u src/sys/arch/x86/include/fpu.h:1.4 src/sys/arch/x86/include/fpu.h:1.5 --- src/sys/arch/x86/include/fpu.h:1.4 Sat Feb 15 22:20:42 2014 +++ src/sys/arch/x86/include/fpu.h Sun Feb 23 22:35:27 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu.h,v 1.4 2014/02/15 22:20:42 dsl Exp $ */ +/* $NetBSD: fpu.h,v 1.5 2014/02/23 22:35:27 dsl Exp $ */ #ifndef _X86_FPU_H_ #define _X86_FPU_H_ @@ -15,6 +15,8 @@ void fpuinit(struct cpu_info *); void fpusave_lwp(struct lwp *, bool); void fpusave_cpu(bool); +void fpu_set_default_cw(struct lwp *, unsigned int); + void fputrap(struct trapframe *); void fpudna(struct trapframe *); Index: src/sys/arch/x86/x86/fpu.c diff -u src/sys/arch/x86/x86/fpu.c:1.7 src/sys/arch/x86/x86/fpu.c:1.8 --- src/sys/arch/x86/x86/fpu.c:1.7 Sun Feb 23 12:56:40 2014 +++ src/sys/arch/x86/x86/fpu.c Sun Feb 23 22:35:28 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu.c,v 1.7 2014/02/23 12:56:40 dsl Exp $ */ +/* $NetBSD: fpu.c,v 1.8 2014/02/23 22:35:28 dsl Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. All @@ -100,7 +100,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.7 2014/02/23 12:56:40 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.8 2014/02/23 22:35:28 dsl Exp $"); #include "opt_multiprocessor.h" @@ -249,6 +249,18 @@ fpuinit(struct cpu_info *ci) stts(); } +void +fpu_set_default_cw(struct lwp *lwp, unsigned int x87_cw) +{ + union savefpu *fpu_save = process_fpframe(lwp); + + if (i386_use_fxsave) + fpu_save->sv_xmm.fx_cw = x87_cw; + else + fpu_save->sv_87.s87_cw = x87_cw; + fpu_save->sv_os.fxo_dflt_cw = x87_cw; +} + static void send_sigill(void *rip) {