Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/nathanw_sa]: src/sys/arch/i386/i386 Make cpu_getmcontext() get the XMM s...



details:   https://anonhg.NetBSD.org/src/rev/055574344e4e
branches:  nathanw_sa
changeset: 506158:055574344e4e
user:      nathanw <nathanw%NetBSD.org@localhost>
date:      Wed Aug 14 18:29:35 2002 +0000

description:
Make cpu_getmcontext() get the XMM state when possible, and
make cpu_setmcontext() use it when it is provided, converting to and
from s87 format when necessary.

diffstat:

 sys/arch/i386/i386/machdep.c |  43 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 35 insertions(+), 8 deletions(-)

diffs (71 lines):

diff -r d43e57aee454 -r 055574344e4e sys/arch/i386/i386/machdep.c
--- a/sys/arch/i386/i386/machdep.c      Wed Aug 14 18:26:43 2002 +0000
+++ b/sys/arch/i386/i386/machdep.c      Wed Aug 14 18:29:35 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: machdep.c,v 1.429.2.25 2002/08/01 03:30:21 nathanw Exp $       */
+/*     $NetBSD: machdep.c,v 1.429.2.26 2002/08/14 18:29:35 nathanw Exp $       */
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000 The NetBSD Foundation, Inc.
@@ -76,7 +76,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.429.2.25 2002/08/01 03:30:21 nathanw Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.429.2.26 2002/08/14 18:29:35 nathanw Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -3520,9 +3520,16 @@
                        npxsave();
                }
 #endif
-               memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
-                &l->l_addr->u_pcb.pcb_savefpu,
-                sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state));
+               if (i386_use_fxsave) {
+                       memcpy(&mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
+                           &l->l_addr->u_pcb.pcb_savefpu.sv_xmm,
+                           sizeof (mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm));
+                       *flags |= _UC_FXSAVE;
+               } else {
+                       memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+                           &l->l_addr->u_pcb.pcb_savefpu.sv_87,
+                           sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state));
+               }
 #if 0
                /* Apparently nothing ever touches this. */
                ucp->mcp.mc_fp.fp_emcsts = l->l_addr->u_pcb.pcb_saveemc;
@@ -3595,9 +3602,29 @@
                if (l == npxproc)
                        npxdrop();
 #endif
-               (void)memcpy(&l->l_addr->u_pcb.pcb_savefpu,
-                   &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
-                   sizeof (l->l_addr->u_pcb.pcb_savefpu));
+               if (flags & _UC_FXSAVE) {
+                       if (i386_use_fxsave) {
+                               memcpy(
+                                       &l->l_addr->u_pcb.pcb_savefpu.sv_xmm,
+                                       &mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
+                                       sizeof (&l->l_addr->u_pcb.pcb_savefpu.sv_xmm));
+                       } else {
+                               /* This is a weird corner case */
+                               process_xmm_to_s87((struct savexmm *)
+                                   &mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
+                                   &l->l_addr->u_pcb.pcb_savefpu.sv_87);
+                       }
+               } else {
+                       if (i386_use_fxsave) {
+                               process_s87_to_xmm((struct save87 *)
+                                   &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+                                   &l->l_addr->u_pcb.pcb_savefpu.sv_xmm);
+                       } else {
+                               memcpy(&l->l_addr->u_pcb.pcb_savefpu.sv_87,
+                                   &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+                                   sizeof (l->l_addr->u_pcb.pcb_savefpu.sv_87));
+                       }
+               }
                /* If not set already. */
                l->l_md.md_flags |= MDP_USEDFPU;
 #if 0



Home | Main Index | Thread Index | Old Index