Module Name:    src
Committed By:   mgorny
Date:           Thu Oct 15 17:40:14 UTC 2020

Modified Files:
        src/sys/arch/amd64/conf: files.amd64
        src/sys/arch/i386/conf: files.i386
        src/sys/arch/x86/include: fpu.h
        src/sys/arch/x86/x86: fpu.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.116 -r1.117 src/sys/arch/amd64/conf/files.amd64
cvs rdiff -u -r1.404 -r1.405 src/sys/arch/i386/conf/files.i386
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/x86/include/fpu.h
cvs rdiff -u -r1.74 -r1.75 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/amd64/conf/files.amd64
diff -u src/sys/arch/amd64/conf/files.amd64:1.116 src/sys/arch/amd64/conf/files.amd64:1.117
--- src/sys/arch/amd64/conf/files.amd64:1.116	Sat Apr 25 15:26:16 2020
+++ src/sys/arch/amd64/conf/files.amd64	Thu Oct 15 17:40:13 2020
@@ -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/process_machdep.c	
 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

Index: src/sys/arch/i386/conf/files.i386
diff -u src/sys/arch/i386/conf/files.i386:1.404 src/sys/arch/i386/conf/files.i386:1.405
--- src/sys/arch/i386/conf/files.i386:1.404	Mon Jun 29 23:32:24 2020
+++ src/sys/arch/i386/conf/files.i386	Thu Oct 15 17:40:14 2020
@@ -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/machdep.c
 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

Index: src/sys/arch/x86/include/fpu.h
diff -u src/sys/arch/x86/include/fpu.h:1.21 src/sys/arch/x86/include/fpu.h:1.22
--- src/sys/arch/x86/include/fpu.h:1.21	Sun Jun 14 16:12:05 2020
+++ src/sys/arch/x86/include/fpu.h	Thu Oct 15 17:40:14 2020
@@ -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 fpu_set_default_cw(struct lwp *, un
 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 *);
 

Index: src/sys/arch/x86/x86/fpu.c
diff -u src/sys/arch/x86/x86/fpu.c:1.74 src/sys/arch/x86/x86/fpu.c:1.75
--- src/sys/arch/x86/x86/fpu.c:1.74	Sun Aug  2 18:23:33 2020
+++ src/sys/arch/x86/x86/fpu.c	Thu Oct 15 17:40:14 2020
@@ -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 @@ fpu_sigreset(struct lwp *l)
 	}
 }
 
-/* -------------------------------------------------------------------------- */
-
-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 */
-	s87->s87_tw = (tag | tag >> 1) ^ 0xffff;
-}
-
-static 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;
-}
-
 void
 process_write_fpregs_xmm(struct lwp *l, const struct fxsave *fpregs)
 {

Reply via email to