Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Revert "Merge convert_xmm_s87.c into fpu.c"
details: https://anonhg.NetBSD.org/src/rev/720af36521dd
branches: trunk
changeset: 1015141:720af36521dd
user: mgorny <mgorny%NetBSD.org@localhost>
date: Thu Oct 15 17:40:13 2020 +0000
description:
Revert "Merge convert_xmm_s87.c into fpu.c"
I am going to add ATF tests for these two functions, and having them
in a separate file will make it more convenient to build and run them
in userspace.
diffstat:
sys/arch/amd64/conf/files.amd64 | 3 +-
sys/arch/i386/conf/files.i386 | 3 +-
sys/arch/x86/include/fpu.h | 5 +-
sys/arch/x86/x86/convert_xmm_s87.c | 156 +++++++++++++++++++++++++++++++++++++
sys/arch/x86/x86/fpu.c | 124 +----------------------------
5 files changed, 166 insertions(+), 125 deletions(-)
diffs (truncated from 358 to 300 lines):
diff -r ecef22e10140 -r 720af36521dd sys/arch/amd64/conf/files.amd64
--- a/sys/arch/amd64/conf/files.amd64 Thu Oct 15 17:38:41 2020 +0000
+++ b/sys/arch/amd64/conf/files.amd64 Thu Oct 15 17:40:13 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.amd64,v 1.116 2020/04/25 15:26:16 bouyer Exp $
+# $NetBSD: files.amd64,v 1.117 2020/10/15 17:40:13 mgorny Exp $
#
# new style config file for amd64 architecture
#
@@ -51,6 +51,7 @@
file arch/amd64/amd64/trap.c machdep
file arch/x86/x86/fpu.c machdep
file arch/x86/x86/dbregs.c machdep
+file arch/x86/x86/convert_xmm_s87.c machdep
file arch/x86/x86/spectre.c machdep & !xenpv
file arch/amd64/amd64/lock_stubs.S machdep
file dev/cons.c machdep
diff -r ecef22e10140 -r 720af36521dd sys/arch/i386/conf/files.i386
--- a/sys/arch/i386/conf/files.i386 Thu Oct 15 17:38:41 2020 +0000
+++ b/sys/arch/i386/conf/files.i386 Thu Oct 15 17:40:13 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.i386,v 1.404 2020/06/29 23:32:24 riastradh Exp $
+# $NetBSD: files.i386,v 1.405 2020/10/15 17:40:14 mgorny Exp $
#
# new style config file for i386 architecture
#
@@ -69,6 +69,7 @@
file arch/i386/i386/longrun.c
file arch/i386/i386/mtrr_k6.c mtrr
file arch/i386/i386/process_machdep.c
+file arch/x86/x86/convert_xmm_s87.c
file arch/i386/i386/trap.c
file dev/cons.c
file arch/x86/x86/fpu.c
diff -r ecef22e10140 -r 720af36521dd sys/arch/x86/include/fpu.h
--- a/sys/arch/x86/include/fpu.h Thu Oct 15 17:38:41 2020 +0000
+++ b/sys/arch/x86/include/fpu.h Thu Oct 15 17:40:13 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.h,v 1.21 2020/06/14 16:12:05 riastradh Exp $ */
+/* $NetBSD: fpu.h,v 1.22 2020/10/15 17:40:14 mgorny Exp $ */
#ifndef _X86_FPU_H_
#define _X86_FPU_H_
@@ -24,6 +24,9 @@
void fputrap(struct trapframe *);
void fpudna(struct trapframe *);
+void process_xmm_to_s87(const struct fxsave *, struct save87 *);
+void process_s87_to_xmm(const struct save87 *, struct fxsave *);
+
void fpu_clear(struct lwp *, unsigned int);
void fpu_sigreset(struct lwp *);
diff -r ecef22e10140 -r 720af36521dd sys/arch/x86/x86/convert_xmm_s87.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/x86/x86/convert_xmm_s87.c Thu Oct 15 17:40:13 2020 +0000
@@ -0,0 +1,156 @@
+/* $NetBSD: convert_xmm_s87.c,v 1.5 2020/10/15 17:42:31 mgorny Exp $ */
+
+/*-
+ * Copyright (c) 1998, 2000, 2001, 2008 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles M. Hannum; by Jason R. Thorpe of Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: convert_xmm_s87.c,v 1.5 2020/10/15 17:42:31 mgorny Exp $");
+
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <x86/fpu.h>
+
+void
+process_xmm_to_s87(const struct fxsave *sxmm, struct save87 *s87)
+{
+ unsigned int tag, ab_tag;
+ const struct fpaccfx *fx_reg;
+ struct fpacc87 *s87_reg;
+ int i;
+
+ /*
+ * For historic reasons core dumps and ptrace all use the old save87
+ * layout. Convert the important parts.
+ * getucontext gets what we give it.
+ * setucontext should return something given by getucontext, but
+ * we are (at the moment) willing to change it.
+ *
+ * It really isn't worth setting the 'tag' bits to 01 (zero) or
+ * 10 (NaN etc) since the processor will set any internal bits
+ * correctly when the value is loaded (the 287 believed them).
+ *
+ * Additionally the s87_tw and s87_tw are 'indexed' by the actual
+ * register numbers, whereas the registers themselves have ST(0)
+ * first. Pairing the values and tags can only be done with
+ * reference to the 'top of stack'.
+ *
+ * If any x87 registers are used, they will typically be from
+ * r7 downwards - so the high bits of the tag register indicate
+ * used registers. The conversions are not optimised for this.
+ *
+ * The ABI we use requires the FP stack to be empty on every
+ * function call. I think this means that the stack isn't expected
+ * to overflow - overflow doesn't drop a core in my testing.
+ *
+ * Note that this code writes to all of the 's87' structure that
+ * actually gets written to userspace.
+ */
+
+ /* FPU control/status */
+ s87->s87_cw = sxmm->fx_cw;
+ s87->s87_sw = sxmm->fx_sw;
+ /* tag word handled below */
+ s87->s87_ip = sxmm->fx_ip;
+ s87->s87_opcode = sxmm->fx_opcode;
+ s87->s87_dp = sxmm->fx_dp;
+
+ /* FP registers (in stack order) */
+ fx_reg = sxmm->fx_87_ac;
+ s87_reg = s87->s87_ac;
+ for (i = 0; i < 8; fx_reg++, s87_reg++, i++)
+ *s87_reg = fx_reg->r;
+
+ /* Tag word and registers. */
+ ab_tag = sxmm->fx_tw & 0xff; /* Bits set if valid */
+ if (ab_tag == 0) {
+ /* none used */
+ s87->s87_tw = 0xffff;
+ return;
+ }
+
+ tag = 0;
+ /* Separate bits of abridged tag word with zeros */
+ for (i = 0x80; i != 0; tag <<= 1, i >>= 1)
+ tag |= ab_tag & i;
+ /* Replicate and invert so that 0 => 0b11 and 1 => 0b00 */
+ s87->s87_tw = (tag | tag >> 1) ^ 0xffff;
+}
+
+void
+process_s87_to_xmm(const struct save87 *s87, struct fxsave *sxmm)
+{
+ unsigned int tag, ab_tag;
+ struct fpaccfx *fx_reg;
+ const struct fpacc87 *s87_reg;
+ int i;
+
+ /*
+ * ptrace gives us registers in the save87 format and
+ * we must convert them to the correct format.
+ *
+ * This code is normally used when overwriting the processes
+ * registers (in the pcb), so it musn't change any other fields.
+ *
+ * There is a lot of pad in 'struct fxsave', if the destination
+ * is written to userspace, it must be zeroed first.
+ */
+
+ /* FPU control/status */
+ sxmm->fx_cw = s87->s87_cw;
+ sxmm->fx_sw = s87->s87_sw;
+ /* tag word handled below */
+ sxmm->fx_ip = s87->s87_ip;
+ sxmm->fx_opcode = s87->s87_opcode;
+ sxmm->fx_dp = s87->s87_dp;
+
+ /* Tag word */
+ tag = s87->s87_tw; /* 0b11 => unused */
+ if (tag == 0xffff) {
+ /* All unused - values don't matter, zero for safety */
+ sxmm->fx_tw = 0;
+ memset(&sxmm->fx_87_ac, 0, sizeof sxmm->fx_87_ac);
+ return;
+ }
+
+ tag ^= 0xffff; /* So 0b00 is unused */
+ tag |= tag >> 1; /* Look at even bits */
+ ab_tag = 0;
+ i = 1;
+ do
+ ab_tag |= tag & i;
+ while ((tag >>= 1) >= (i <<= 1));
+ sxmm->fx_tw = ab_tag;
+
+ /* FP registers (in stack order) */
+ fx_reg = sxmm->fx_87_ac;
+ s87_reg = s87->s87_ac;
+ for (i = 0; i < 8; fx_reg++, s87_reg++, i++)
+ fx_reg->r = *s87_reg;
+}
diff -r ecef22e10140 -r 720af36521dd sys/arch/x86/x86/fpu.c
--- a/sys/arch/x86/x86/fpu.c Thu Oct 15 17:38:41 2020 +0000
+++ b/sys/arch/x86/x86/fpu.c Thu Oct 15 17:40:13 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.c,v 1.74 2020/08/02 18:23:33 riastradh Exp $ */
+/* $NetBSD: fpu.c,v 1.75 2020/10/15 17:40:14 mgorny Exp $ */
/*
* Copyright (c) 2008, 2019 The NetBSD Foundation, Inc. All
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.74 2020/08/02 18:23:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.75 2020/10/15 17:40:14 mgorny Exp $");
#include "opt_multiprocessor.h"
@@ -663,126 +663,6 @@
}
}
-/* -------------------------------------------------------------------------- */
-
-static void
-process_xmm_to_s87(const struct fxsave *sxmm, struct save87 *s87)
-{
- unsigned int tag, ab_tag;
- const struct fpaccfx *fx_reg;
- struct fpacc87 *s87_reg;
- int i;
-
- /*
- * For historic reasons core dumps and ptrace all use the old save87
- * layout. Convert the important parts.
- * getucontext gets what we give it.
- * setucontext should return something given by getucontext, but
- * we are (at the moment) willing to change it.
- *
- * It really isn't worth setting the 'tag' bits to 01 (zero) or
- * 10 (NaN etc) since the processor will set any internal bits
- * correctly when the value is loaded (the 287 believed them).
- *
- * Additionally the s87_tw and s87_tw are 'indexed' by the actual
- * register numbers, whereas the registers themselves have ST(0)
- * first. Pairing the values and tags can only be done with
- * reference to the 'top of stack'.
- *
- * If any x87 registers are used, they will typically be from
- * r7 downwards - so the high bits of the tag register indicate
- * used registers. The conversions are not optimised for this.
- *
- * The ABI we use requires the FP stack to be empty on every
- * function call. I think this means that the stack isn't expected
- * to overflow - overflow doesn't drop a core in my testing.
- *
- * Note that this code writes to all of the 's87' structure that
- * actually gets written to userspace.
- */
-
- /* FPU control/status */
- s87->s87_cw = sxmm->fx_cw;
- s87->s87_sw = sxmm->fx_sw;
- /* tag word handled below */
- s87->s87_ip = sxmm->fx_ip;
- s87->s87_opcode = sxmm->fx_opcode;
- s87->s87_dp = sxmm->fx_dp;
-
- /* FP registers (in stack order) */
- fx_reg = sxmm->fx_87_ac;
- s87_reg = s87->s87_ac;
- for (i = 0; i < 8; fx_reg++, s87_reg++, i++)
- *s87_reg = fx_reg->r;
-
- /* Tag word and registers. */
- ab_tag = sxmm->fx_tw & 0xff; /* Bits set if valid */
- if (ab_tag == 0) {
- /* none used */
- s87->s87_tw = 0xffff;
- return;
- }
-
- tag = 0;
- /* Separate bits of abridged tag word with zeros */
- for (i = 0x80; i != 0; tag <<= 1, i >>= 1)
- tag |= ab_tag & i;
- /* Replicate and invert so that 0 => 0b11 and 1 => 0b00 */
Home |
Main Index |
Thread Index |
Old Index