From 5e9aed4314645ea59438e92caf79ebe6ba0c59c9 Mon Sep 17 00:00:00 2001 From: dsl Date: Tue, 4 Feb 2014 22:48:26 +0000 Subject: [PATCH] Now that the sv_xmm and sv_87 fields in the pcb are the same size as the hardware ones, and those in the mcontext, ptrace and core files we can really safely cast and copy between the types. Remove a couple of temporary buffers and add CTASSERT()s that the sizes do actually match. --- sys/arch/i386/i386/machdep.c | 38 +++++++++++++++++----------- sys/arch/i386/i386/process_machdep.c | 17 ++++--------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c index 0df972a29c8b..62bccca7914f 100644 --- a/sys/arch/i386/i386/machdep.c +++ b/sys/arch/i386/i386/machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.745 2014/02/02 22:41:20 dsl Exp $ */ +/* $NetBSD: machdep.c,v 1.746 2014/02/04 22:48:26 dsl Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009 @@ -67,7 +67,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.745 2014/02/02 22:41:20 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.746 2014/02/04 22:48:26 dsl Exp $"); #include "opt_beep.h" #include "opt_compat_ibcs2.h" @@ -1644,14 +1644,18 @@ cpu_getmcontext(struct lwp *l, mcontext_t *mcp, unsigned int *flags) if (pcb->pcb_fpcpu) fpusave_lwp(l, true); if (i386_use_fxsave) { - memcpy(&mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm, + __CTASSERT(sizeof pcb->pcb_savefpu.sv_xmm == + sizeof mcp->__fpregs.__fp_reg_set.__fp_xmm_state); + memcpy(&mcp->__fpregs.__fp_reg_set.__fp_xmm_state, &pcb->pcb_savefpu.sv_xmm, - sizeof (mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm)); + sizeof (mcp->__fpregs.__fp_reg_set.__fp_xmm_state)); *flags |= _UC_FXSAVE; } else { - memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state, + __CTASSERT(sizeof pcb->pcb_savefpu.sv_87 == + sizeof mcp->__fpregs.__fp_reg_set.__fpchip_state); + memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state, &pcb->pcb_savefpu.sv_87, - sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state)); + sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state)); } #if 0 /* Apparently nothing ever touches this. */ @@ -1742,26 +1746,30 @@ cpu_setmcontext(struct lwp *l, const mcontext_t *mcp, unsigned int flags) /* Restore floating point register context, if any. */ if ((flags & _UC_FPU) != 0) { + __CTASSERT(sizeof pcb->pcb_savefpu.sv_xmm == + sizeof mcp->__fpregs.__fp_reg_set.__fp_xmm_state); + __CTASSERT(sizeof pcb->pcb_savefpu.sv_87 == + sizeof mcp->__fpregs.__fp_reg_set.__fpchip_state); + if (flags & _UC_FXSAVE) { if (i386_use_fxsave) { - memcpy( - &pcb->pcb_savefpu.sv_xmm, - &mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm, - sizeof (pcb->pcb_savefpu.sv_xmm)); + memcpy(&pcb->pcb_savefpu.sv_xmm, + &mcp->__fpregs.__fp_reg_set.__fp_xmm_state, + sizeof (pcb->pcb_savefpu.sv_xmm)); } else { /* This is a weird corner case */ - process_xmm_to_s87((struct fxsave *) - &mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm, + process_xmm_to_s87((const struct fxsave *) + &mcp->__fpregs.__fp_reg_set.__fp_xmm_state, &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, + process_s87_to_xmm((const struct save87 *) + &mcp->__fpregs.__fp_reg_set.__fpchip_state, &pcb->pcb_savefpu.sv_xmm); } else { memcpy(&pcb->pcb_savefpu.sv_87, - &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state, + &mcp->__fpregs.__fp_reg_set.__fpchip_state, sizeof (pcb->pcb_savefpu.sv_87)); } } diff --git a/sys/arch/i386/i386/process_machdep.c b/sys/arch/i386/i386/process_machdep.c index d8d81ea81b1f..794b67fb65c7 100644 --- a/sys/arch/i386/i386/process_machdep.c +++ b/sys/arch/i386/i386/process_machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: process_machdep.c,v 1.80 2014/01/26 19:16:17 dsl Exp $ */ +/* $NetBSD: process_machdep.c,v 1.81 2014/02/04 22:48:26 dsl Exp $ */ /*- * Copyright (c) 1998, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -52,7 +52,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.80 2014/01/26 19:16:17 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.81 2014/02/04 22:48:26 dsl Exp $"); #include "opt_vm86.h" #include "opt_ptrace.h" @@ -277,12 +277,9 @@ process_read_fpregs(struct lwp *l, struct fpreg *regs, size_t *sz) l->l_md.md_flags |= MDL_USEDFPU; } + __CTASSERT(sizeof *regs == sizeof (struct save87)); if (i386_use_fxsave) { - struct save87 s87; - - /* XXX Yuck */ - process_xmm_to_s87(&frame->sv_xmm, &s87); - memcpy(regs, &s87, sizeof(*regs)); + process_xmm_to_s87(&frame->sv_xmm, (struct save87 *)regs); } else memcpy(regs, &frame->sv_87, sizeof(*regs)); return (0); @@ -356,11 +353,7 @@ process_write_fpregs(struct lwp *l, const struct fpreg *regs, size_t sz) } if (i386_use_fxsave) { - struct save87 s87; - - /* XXX Yuck. */ - memcpy(&s87, regs, sizeof(*regs)); - process_s87_to_xmm(&s87, &frame->sv_xmm); + process_s87_to_xmm((const struct save87 *)regs, &frame->sv_xmm); } else memcpy(&frame->sv_87, regs, sizeof(*regs)); return (0);