changeset 315:319d2099782e

Update sys/i386
author ray@terran.dlink.ua
date Wed, 01 Feb 2012 11:33:42 +0200
parents b35ed53dbff9
children 2c7e9f76c40e
files head/sys/i386/conf/GENERIC head/sys/i386/conf/NOTES head/sys/i386/i386/initcpu.c head/sys/i386/i386/machdep.c head/sys/i386/include/float.h head/sys/i386/include/npx.h head/sys/i386/include/ptrace.h head/sys/i386/include/signal.h head/sys/i386/include/specialreg.h head/sys/i386/include/sysarch.h head/sys/i386/include/ucontext.h head/sys/i386/isa/npx.c
diffstat 12 files changed, 139 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/head/sys/i386/conf/GENERIC	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/conf/GENERIC	Wed Feb 01 11:33:42 2012 +0200
@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first
 # in NOTES.
 #
-# $FreeBSD: head/sys/i386/conf/GENERIC 229997 2012-01-12 00:34:33Z ken $
+# $FreeBSD: head/sys/i386/conf/GENERIC 230843 2012-01-31 19:38:18Z jimharris $
 
 cpu		I486_CPU
 cpu		I586_CPU
@@ -130,6 +130,7 @@
 device		ncv		# NCR 53C500
 device		nsp		# Workbit Ninja SCSI-3
 device		stg		# TMC 18C30/18C50
+device		isci		# Intel C600 SAS controller
 
 # ATA/SCSI peripherals
 device		scbus		# SCSI bus (required for ATA/SCSI)
--- a/head/sys/i386/conf/NOTES	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/conf/NOTES	Wed Feb 01 11:33:42 2012 +0200
@@ -4,7 +4,7 @@
 # This file contains machine dependent kernel configuration notes.  For
 # machine independent notes, look in /sys/conf/NOTES.
 #
-# $FreeBSD: head/sys/i386/conf/NOTES 228940 2011-12-28 23:26:58Z delphij $
+# $FreeBSD: head/sys/i386/conf/NOTES 230843 2012-01-31 19:38:18Z jimharris $
 #
 
 #
@@ -727,6 +727,11 @@
 device		ips
 
 #
+# Intel C600 (Patsburg) integrated SAS controller
+device		isci
+options		ISCI_LOGGING	# enable debugging in isci HAL
+
+#
 # SafeNet crypto driver: can be moved to the MI NOTES as soon as
 # it's tested on a big-endian machine
 #
--- a/head/sys/i386/i386/initcpu.c	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/i386/initcpu.c	Wed Feb 01 11:33:42 2012 +0200
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/sys/i386/i386/initcpu.c 230767 2012-01-30 07:56:00Z kib $");
 
 #include "opt_cpu.h"
 
@@ -650,6 +650,8 @@
 #endif
 }
 
+extern int elf32_nxstack;
+
 void
 initializecpu(void)
 {
@@ -739,6 +741,7 @@
 			msr = rdmsr(MSR_EFER) | EFER_NXE;
 			wrmsr(MSR_EFER, msr);
 			pg_nx = PG_NX;
+			elf32_nxstack = 1;
 		}
 #endif
 		break;
--- a/head/sys/i386/i386/machdep.c	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/i386/machdep.c	Wed Feb 01 11:33:42 2012 +0200
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/i386/i386/machdep.c 229085 2011-12-31 13:24:53Z gavin $");
+__FBSDID("$FreeBSD: head/sys/i386/i386/machdep.c 230426 2012-01-21 17:45:27Z kib $");
 
 #include "opt_atalk.h"
 #include "opt_compat.h"
@@ -653,8 +653,7 @@
 	sdp = &td->td_pcb->pcb_gsd;
 	sf.sf_uc.uc_mcontext.mc_gsbase = sdp->sd_hibase << 24 |
 	    sdp->sd_lobase;
-	bzero(sf.sf_uc.uc_mcontext.mc_spare1,
-	    sizeof(sf.sf_uc.uc_mcontext.mc_spare1));
+	sf.sf_uc.uc_mcontext.mc_flags = 0;
 	bzero(sf.sf_uc.uc_mcontext.mc_spare2,
 	    sizeof(sf.sf_uc.uc_mcontext.mc_spare2));
 	bzero(sf.sf_uc.__spare__, sizeof(sf.sf_uc.__spare__));
@@ -3382,7 +3381,7 @@
 	mcp->mc_fsbase = sdp->sd_hibase << 24 | sdp->sd_lobase;
 	sdp = &td->td_pcb->pcb_gsd;
 	mcp->mc_gsbase = sdp->sd_hibase << 24 | sdp->sd_lobase;
-	bzero(mcp->mc_spare1, sizeof(mcp->mc_spare1));
+	mcp->mc_flags = 0;
 	bzero(mcp->mc_spare2, sizeof(mcp->mc_spare2));
 	return (0);
 }
--- a/head/sys/i386/include/float.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/float.h	Wed Feb 01 11:33:42 2012 +0200
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)float.h	7.1 (Berkeley) 5/8/90
- * $FreeBSD$
+ * $FreeBSD: head/sys/i386/include/float.h 230475 2012-01-23 06:36:41Z das $
  */
 
 #ifndef _MACHINE_FLOAT_H_
@@ -55,6 +55,11 @@
 #define FLT_MAX_EXP	128		/* emax */
 #define FLT_MAX		3.40282347E+38F	/* (1-b**(-p))*b**emax */
 #define FLT_MAX_10_EXP	38		/* floor(log10((1-b**(-p))*b**emax)) */
+#if __ISO_C_VISIBLE >= 2011
+#define	FLT_TRUE_MIN	1.40129846E-45F	/* b**(emin-p) */
+#define	FLT_DECIMAL_DIG	9		/* ceil(1+p*log10(b)) */
+#define	FLT_HAS_SUBNORM	1
+#endif /* __ISO_C_VISIBLE >= 2011 */
 
 #define DBL_MANT_DIG	53
 #define DBL_EPSILON	2.2204460492503131E-16
@@ -65,6 +70,11 @@
 #define DBL_MAX_EXP	1024
 #define DBL_MAX		1.7976931348623157E+308
 #define DBL_MAX_10_EXP	308
+#if __ISO_C_VISIBLE >= 2011
+#define	DBL_TRUE_MIN	4.9406564584124654E-324
+#define	DBL_DECIMAL_DIG	17
+#define	DBL_HAS_SUBNORM	1
+#endif /* __ISO_C_VISIBLE >= 2011 */
 
 #define LDBL_MANT_DIG	64
 #define LDBL_EPSILON	1.0842021724855044340E-19L
@@ -75,4 +85,10 @@
 #define LDBL_MAX_EXP	16384
 #define LDBL_MAX	1.1897314953572317650E+4932L
 #define LDBL_MAX_10_EXP	4932
+#if __ISO_C_VISIBLE >= 2011
+#define	LDBL_TRUE_MIN	3.6451995318824746025E-4951L
+#define	LDBL_DECIMAL_DIG 21
+#define	LDBL_HAS_SUBNORM 1
+#endif /* __ISO_C_VISIBLE >= 2011 */
+
 #endif /* _MACHINE_FLOAT_H_ */
--- a/head/sys/i386/include/npx.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/npx.h	Wed Feb 01 11:33:42 2012 +0200
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)npx.h	5.3 (Berkeley) 1/18/91
- * $FreeBSD$
+ * $FreeBSD: head/sys/i386/include/npx.h 230426 2012-01-21 17:45:27Z kib $
  */
 
 /*
@@ -101,6 +101,11 @@
 	u_char	xmm_bytes[16];
 };
 
+/* Contents of the upper 16 bytes of each AVX extended accumulator */
+struct  ymmacc {
+	uint8_t  ymm_bytes[16];
+};
+
 struct  savexmm {
 	struct	envxmm	sv_env;
 	struct {
@@ -116,6 +121,28 @@
 	struct	savexmm	sv_xmm;
 };
 
+struct xstate_hdr {
+	uint64_t xstate_bv;
+	uint8_t xstate_rsrv0[16];
+	uint8_t	xstate_rsrv[40];
+};
+
+struct savexmm_xstate {
+	struct xstate_hdr sx_hd;
+	struct ymmacc	sx_ymm[16];
+};
+
+struct savexmm_ymm {
+	struct	envxmm	sv_env;
+	struct {
+		struct fpacc87	fp_acc;
+		int8_t		fp_pad[6];      /* padding */
+	} sv_fp[8];
+	struct xmmacc	sv_xmm[16];
+	uint8_t sv_pad[96];
+	struct savexmm_xstate sv_xstate;
+} __aligned(64);
+
 /*
  * The hardware default control word for i387's and later coprocessors is
  * 0x37F, giving:
@@ -138,13 +165,6 @@
 
 #ifdef _KERNEL
 
-struct fpu_kern_ctx {
-	union savefpu hwstate;
-	union savefpu *prev;
-	uint32_t flags;
-};
-#define	FPU_KERN_CTX_NPXINITDONE 0x01
-
 #define	PCB_USER_FPU(pcb) (((pcb)->pcb_flags & PCB_KERNNPX) == 0)
 
 int	npxdna(void);
@@ -157,6 +177,8 @@
 void	npxsetregs(struct thread *td, union savefpu *addr);
 int	npxtrap(void);
 void	npxuserinited(struct thread *);
+struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int flags);
+void	fpu_kern_free_ctx(struct fpu_kern_ctx *ctx);
 int	fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx,
 	    u_int flags);
 int	fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx);
@@ -167,6 +189,7 @@
  * Flags for fpu_kern_enter() and fpu_kern_thread().
  */
 #define	FPU_KERN_NORMAL	0x0000
+#define	FPU_KERN_NOWAIT	0x0001
 
 #endif
 
--- a/head/sys/i386/include/ptrace.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/ptrace.h	Wed Feb 01 11:33:42 2012 +0200
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)ptrace.h	8.1 (Berkeley) 6/11/93
- * $FreeBSD$
+ * $FreeBSD: head/sys/i386/include/ptrace.h 230426 2012-01-21 17:45:27Z kib $
  */
 
 #ifndef _MACHINE_PTRACE_H_
@@ -37,5 +37,7 @@
 
 #define PT_GETXMMREGS	(PT_FIRSTMACH + 0)
 #define PT_SETXMMREGS	(PT_FIRSTMACH + 1)
+#define PT_GETXSTATE	(PT_FIRSTMACH + 2)
+#define PT_SETXSTATE	(PT_FIRSTMACH + 3)
 
 #endif
--- a/head/sys/i386/include/signal.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/signal.h	Wed Feb 01 11:33:42 2012 +0200
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)signal.h	8.1 (Berkeley) 6/11/93
- * $FreeBSD: head/sys/i386/include/signal.h 227399 2011-11-09 18:25:50Z kib $
+ * $FreeBSD: head/sys/i386/include/signal.h 230765 2012-01-30 07:51:52Z kib $
  */
 
 #ifndef _MACHINE_SIGNAL_H_
@@ -115,13 +115,16 @@
 	 */
 	int	sc_fpformat;
 	int	sc_ownedfp;
-	int	sc_spare1[1];
+	int	sc_flags;
 	int	sc_fpstate[128] __aligned(16);
 
 	int	sc_fsbase;
 	int	sc_gsbase;
 
-	int	sc_spare2[6];
+	int	sc_xfpustate;
+	int	sc_xfpustate_len;
+
+	int	sc_spare2[4];
 };
 
 #define	sc_sp		sc_esp
--- a/head/sys/i386/include/specialreg.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/specialreg.h	Wed Feb 01 11:33:42 2012 +0200
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)specialreg.h	7.1 (Berkeley) 5/9/91
- * $FreeBSD: head/sys/i386/include/specialreg.h 222043 2011-05-17 22:36:16Z jkim $
+ * $FreeBSD: head/sys/i386/include/specialreg.h 230261 2012-01-17 07:23:43Z kib $
  */
 
 #ifndef _MACHINE_SPECIALREG_H_
@@ -66,6 +66,7 @@
 #define	CR4_PCE	0x00000100	/* Performance monitoring counter enable */
 #define	CR4_FXSR 0x00000200	/* Fast FPU save/restore used by OS */
 #define	CR4_XMM	0x00000400	/* enable SIMD/MMX2 to use except 16 */
+#define	CR4_XSAVE 0x00040000	/* XSETBV/XGETBV */
 
 /*
  * Bits in AMD64 special registers.  EFER is 64 bits wide.
--- a/head/sys/i386/include/sysarch.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/sysarch.h	Wed Feb 01 11:33:42 2012 +0200
@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD$
+ * $FreeBSD: head/sys/i386/include/sysarch.h 230426 2012-01-21 17:45:27Z kib $
  */
 
 /*
@@ -47,6 +47,7 @@
 #define I386_SET_FSBASE	8
 #define I386_GET_GSBASE	9
 #define I386_SET_GSBASE	10
+#define	I386_GET_XFPUSTATE 11
 
 /* These four only exist when running an i386 binary on amd64 */
 #define	_AMD64_GET_FSBASE	128
@@ -71,6 +72,11 @@
 	char	*sub_args;		/* args */
 };
 
+struct i386_get_xfpustate {
+	void *addr;
+	int len;
+};
+
 #ifndef _KERNEL
 #include <sys/cdefs.h>
 
--- a/head/sys/i386/include/ucontext.h	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/include/ucontext.h	Wed Feb 01 11:33:42 2012 +0200
@@ -25,12 +25,18 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: head/sys/i386/include/ucontext.h 229104 2011-12-31 14:44:42Z kib $
+ * $FreeBSD: head/sys/i386/include/ucontext.h 230426 2012-01-21 17:45:27Z kib $
  */
 
 #ifndef _MACHINE_UCONTEXT_H_
 #define	_MACHINE_UCONTEXT_H_
 
+/* Keep _MC_* values similar to amd64 */
+#define	_MC_HASSEGS	0x1
+#define	_MC_HASBASES	0x2
+#define	_MC_HASFPXSTATE	0x4
+#define	_MC_FLAG_MASK	(_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE)
+
 typedef struct __mcontext {
 	/*
 	 * The definition of mcontext_t must match the layout of
@@ -68,7 +74,7 @@
 #define	_MC_FPOWNED_FPU		0x20001	/* FP state came from FPU */
 #define	_MC_FPOWNED_PCB		0x20002	/* FP state came from PCB */
 	int	mc_ownedfp;
-	int	mc_spare1[1];		/* align next field to 16 bytes */
+	__register_t mc_flags;
 	/*
 	 * See <machine/npx.h> for the internals of mc_fpstate[].
 	 */
@@ -77,11 +83,13 @@
 	__register_t mc_fsbase;
 	__register_t mc_gsbase;
 
-	int	mc_spare2[6];
+	__register_t mc_xfpustate;
+	__register_t mc_xfpustate_len;
+
+	int	mc_spare2[4];
 } mcontext_t;
 
 #if defined(_KERNEL) && defined(COMPAT_FREEBSD4)
-
 struct mcontext4 {
 	__register_t	mc_onstack;	/* XXX - sigcontext compat. */
 	__register_t	mc_gs;		/* machine state (struct trapframe) */
--- a/head/sys/i386/isa/npx.c	Wed Feb 01 11:33:29 2012 +0200
+++ b/head/sys/i386/isa/npx.c	Wed Feb 01 11:33:42 2012 +0200
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/sys/i386/isa/npx.c 230426 2012-01-21 17:45:27Z kib $");
 
 #include "opt_cpu.h"
 #include "opt_isa.h"
@@ -985,6 +985,50 @@
 #endif
 #endif /* DEV_ISA */
 
+static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx",
+    "Kernel contexts for FPU state");
+
+#define	XSAVE_AREA_ALIGN	64
+
+#define	FPU_KERN_CTX_NPXINITDONE 0x01
+
+struct fpu_kern_ctx {
+	union savefpu *prev;
+	uint32_t flags;
+	char hwstate1[];
+};
+
+struct fpu_kern_ctx *
+fpu_kern_alloc_ctx(u_int flags)
+{
+	struct fpu_kern_ctx *res;
+	size_t sz;
+
+	sz = sizeof(struct fpu_kern_ctx) + XSAVE_AREA_ALIGN +
+	    sizeof(union savefpu);
+	res = malloc(sz, M_FPUKERN_CTX, ((flags & FPU_KERN_NOWAIT) ?
+	    M_NOWAIT : M_WAITOK) | M_ZERO);
+	return (res);
+}
+
+void
+fpu_kern_free_ctx(struct fpu_kern_ctx *ctx)
+{
+
+	/* XXXKIB clear the memory ? */
+	free(ctx, M_FPUKERN_CTX);
+}
+
+static union savefpu *
+fpu_kern_ctx_savefpu(struct fpu_kern_ctx *ctx)
+{
+	vm_offset_t p;
+
+	p = (vm_offset_t)&ctx->hwstate1;
+	p = roundup2(p, XSAVE_AREA_ALIGN);
+	return ((union savefpu *)p);
+}
+
 int
 fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags)
 {
@@ -998,7 +1042,7 @@
 		ctx->flags |= FPU_KERN_CTX_NPXINITDONE;
 	npxexit(td);
 	ctx->prev = pcb->pcb_save;
-	pcb->pcb_save = &ctx->hwstate;
+	pcb->pcb_save = fpu_kern_ctx_savefpu(ctx);
 	pcb->pcb_flags |= PCB_KERNNPX;
 	pcb->pcb_flags &= ~PCB_NPXINITDONE;
 	return (0);