Module Name:    src
Committed By:   dsl
Date:           Thu Feb 20 18:19:10 UTC 2014

Modified Files:
        src/sys/arch/amd64/amd64: genassym.cf machdep.c
        src/sys/arch/amd64/include: pcb.h proc.h
        src/sys/arch/i386/i386: locore.S machdep.c
        src/sys/arch/i386/include: pcb.h proc.h
        src/sys/arch/x86/x86: vm_machdep.c
        src/sys/sys: param.h

Log Message:
Move the amd64 and i386 pcb to the bottom of the uarea, and move the
  kernel stack to the top.
Change the pcb layouts so that fpu save area is at the end and is
  64byte aligned ready for xsave (saving the ymm registers).
Welcome to 6.99.32


To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/amd64/amd64/genassym.cf
cvs rdiff -u -r1.205 -r1.206 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amd64/include/pcb.h
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/amd64/include/proc.h
cvs rdiff -u -r1.111 -r1.112 src/sys/arch/i386/i386/locore.S
cvs rdiff -u -r1.749 -r1.750 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.52 -r1.53 src/sys/arch/i386/include/pcb.h
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/i386/include/proc.h
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/x86/x86/vm_machdep.c
cvs rdiff -u -r1.440 -r1.441 src/sys/sys/param.h

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/amd64/genassym.cf
diff -u src/sys/arch/amd64/amd64/genassym.cf:1.55 src/sys/arch/amd64/amd64/genassym.cf:1.56
--- src/sys/arch/amd64/amd64/genassym.cf:1.55	Sat Feb 15 10:11:14 2014
+++ src/sys/arch/amd64/amd64/genassym.cf	Thu Feb 20 18:19:09 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.55 2014/02/15 10:11:14 dsl Exp $
+#	$NetBSD: genassym.cf,v 1.56 2014/02/20 18:19:09 dsl Exp $
 
 #
 # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -181,7 +181,6 @@ define	IP_DST			offsetof(struct ip, ip_d
 define	PCB_CR3			offsetof(struct pcb, pcb_cr3)
 define	PCB_RBP			offsetof(struct pcb, pcb_rbp)
 define	PCB_RSP			offsetof(struct pcb, pcb_rsp)
-define	PCB_USERSP		offsetof(struct pcb, pcb_usersp)
 define	PCB_RSP0		offsetof(struct pcb, pcb_rsp0)
 define	PCB_CR0			offsetof(struct pcb, pcb_cr0)
 define	PCB_ONFAULT		offsetof(struct pcb, pcb_onfault)

Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.205 src/sys/arch/amd64/amd64/machdep.c:1.206
--- src/sys/arch/amd64/amd64/machdep.c:1.205	Sat Feb 15 22:20:41 2014
+++ src/sys/arch/amd64/amd64/machdep.c	Thu Feb 20 18:19:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.205 2014/02/15 22:20:41 dsl Exp $	*/
+/*	$NetBSD: machdep.c,v 1.206 2014/02/20 18:19:09 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -111,7 +111,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.205 2014/02/15 22:20:41 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.206 2014/02/20 18:19:09 dsl Exp $");
 
 /* #define XENDEBUG_LOW  */
 
@@ -467,7 +467,7 @@ x86_64_proc0_tss_ldt_init(void)
 	pcb->pcb_flags = 0;
 	pcb->pcb_fs = 0;
 	pcb->pcb_gs = 0;
-	pcb->pcb_rsp0 = (uvm_lwp_getuarea(l) + KSTACK_SIZE - 16) & ~0xf;
+	pcb->pcb_rsp0 = (uvm_lwp_getuarea(l) + USPACE - 16) & ~0xf;
 	pcb->pcb_iopl = SEL_KPL;
 
 	pmap_kernel()->pm_ldt_sel = GSYSSEL(GLDT_SEL, SEL_KPL);

Index: src/sys/arch/amd64/include/pcb.h
diff -u src/sys/arch/amd64/include/pcb.h:1.24 src/sys/arch/amd64/include/pcb.h:1.25
--- src/sys/arch/amd64/include/pcb.h:1.24	Tue Feb 11 20:17:16 2014
+++ src/sys/arch/amd64/include/pcb.h	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcb.h,v 1.24 2014/02/11 20:17:16 dsl Exp $	*/
+/*	$NetBSD: pcb.h,v 1.25 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -72,12 +72,7 @@
 
 #ifdef __x86_64__
 
-#include <sys/signal.h>
-
-#include <machine/segments.h>
-#include <machine/tss.h>
-#include <x86/fpu.h>
-#include <machine/sysarch.h>
+#include <x86/cpu_extended_state.h>
 
 #define	NIOPORTS	1024		/* # of ports we allow to be mapped */
 
@@ -91,16 +86,18 @@ struct pcb {
 	uint64_t pcb_cr3;
 	uint64_t pcb_rsp;
 	uint64_t pcb_rbp;
-	uint64_t pcb_usersp;
-	uint32_t pcb_unused[2];		/* unused */
-	union	savefpu pcb_savefpu __aligned(16); /* floating point state */
-	uint32_t pcb_unused_1[4];	/* unused */
 	void     *pcb_onfault;		/* copyin/out fault recovery */
-	struct cpu_info *pcb_fpcpu;	/* cpu holding our fp state. */
 	uint64_t  pcb_fs;
 	uint64_t  pcb_gs;
 	int pcb_iopl;
+
+	uint32_t pcb_unused[11];		/* unused */
+
+	struct cpu_info *pcb_fpcpu;	/* cpu holding our fp state. */
+	union savefpu	pcb_savefpu __aligned(64); /* floating point state */
+	/* **** DO NOT ADD ANYTHING HERE **** */
 };
+__CTASSERT(sizeof(struct pcb) - sizeof (union savefpu) ==  128);
 
 #else	/*	__x86_64__	*/
 

Index: src/sys/arch/amd64/include/proc.h
diff -u src/sys/arch/amd64/include/proc.h:1.18 src/sys/arch/amd64/include/proc.h:1.19
--- src/sys/arch/amd64/include/proc.h:1.18	Sat Feb 15 10:11:15 2014
+++ src/sys/arch/amd64/include/proc.h	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.18 2014/02/15 10:11:15 dsl Exp $	*/
+/*	$NetBSD: proc.h,v 1.19 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*
  * Copyright (c) 1991 Regents of the University of California.
@@ -65,11 +65,6 @@ struct mdproc {
 /* md_flags */
 #define MDP_USEDMTRR	0x0008	/* has set volatile MTRRs */
 
-#define	UAREA_PCB_OFFSET	(USPACE - ALIGN(sizeof(struct pcb)))
-#define	KSTACK_LOWEST_ADDR(l)	\
-    ((void *)((vaddr_t)(l)->l_addr - UAREA_PCB_OFFSET))
-#define	KSTACK_SIZE		UAREA_PCB_OFFSET
-
 #else	/*	__x86_64__	*/
 
 #include <i386/proc.h>

Index: src/sys/arch/i386/i386/locore.S
diff -u src/sys/arch/i386/i386/locore.S:1.111 src/sys/arch/i386/i386/locore.S:1.112
--- src/sys/arch/i386/i386/locore.S:1.111	Sun Feb  2 22:41:20 2014
+++ src/sys/arch/i386/i386/locore.S	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.111 2014/02/02 22:41:20 dsl Exp $	*/
+/*	$NetBSD: locore.S,v 1.112 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -129,7 +129,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.111 2014/02/02 22:41:20 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.112 2014/02/20 18:19:10 dsl Exp $");
 
 #include "opt_compat_oldboot.h"
 #include "opt_ddb.h"
@@ -727,8 +727,8 @@ begin:
 	/* Set up bootstrap stack. */
 	leal	(PROC0_STK_OFF+KERNBASE)(%esi),%eax
 	movl	%eax,_C_LABEL(lwp0uarea)
-	leal	(KSTACK_SIZE-FRAMESIZE)(%eax),%esp
-	movl	%esi,(KSTACK_SIZE+PCB_CR3)(%eax)	# pcb->pcb_cr3
+	leal	(USPACE-FRAMESIZE)(%eax),%esp
+	movl	%esi,PCB_CR3(%eax)	# pcb->pcb_cr3
 	xorl	%ebp,%ebp		# mark end of frames
 
 #if defined(MULTIBOOT)
@@ -825,7 +825,7 @@ begin:
 	movl	%esi, _C_LABEL(lwp0uarea)
 
 	/* Set up bootstrap stack. */
-	leal	(KSTACK_SIZE-FRAMESIZE)(%eax),%esp
+	leal	(USPACE-FRAMESIZE)(%eax),%esp
 	xorl	%ebp,%ebp		# mark end of frames
 
 	addl	$USPACE, %esi

Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.749 src/sys/arch/i386/i386/machdep.c:1.750
--- src/sys/arch/i386/i386/machdep.c:1.749	Tue Feb 18 01:00:57 2014
+++ src/sys/arch/i386/i386/machdep.c	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.749 2014/02/18 01:00:57 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.750 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.749 2014/02/18 01:00:57 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.750 2014/02/20 18:19:10 dsl Exp $");
 
 #include "opt_beep.h"
 #include "opt_compat_ibcs2.h"
@@ -142,6 +142,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 
 #include <machine/mtrr.h>
 #include <x86/x86/tsc.h>
 
+#include <x86/fpu.h>
 #include <x86/machdep.h>
 
 #include <machine/multiboot.h>
@@ -500,7 +501,7 @@ i386_proc0_tss_ldt_init(void)
 
 	pmap_kernel()->pm_ldt_sel = GSEL(GLDT_SEL, SEL_KPL);
 	pcb->pcb_cr0 = rcr0() & ~CR0_TS;
-	pcb->pcb_esp0 = uvm_lwp_getuarea(l) + KSTACK_SIZE - 16;
+	pcb->pcb_esp0 = uvm_lwp_getuarea(l) + USPACE - 16;
 	pcb->pcb_iopl = SEL_KPL;
 	l->l_md.md_regs = (struct trapframe *)pcb->pcb_esp0 - 1;
 	memcpy(&pcb->pcb_fsd, &gdt[GUDATA_SEL], sizeof(pcb->pcb_fsd));

Index: src/sys/arch/i386/include/pcb.h
diff -u src/sys/arch/i386/include/pcb.h:1.52 src/sys/arch/i386/include/pcb.h:1.53
--- src/sys/arch/i386/include/pcb.h:1.52	Wed Feb 12 23:24:09 2014
+++ src/sys/arch/i386/include/pcb.h	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcb.h,v 1.52 2014/02/12 23:24:09 dsl Exp $	*/
+/*	$NetBSD: pcb.h,v 1.53 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2009 The NetBSD Foundation, Inc.
@@ -74,34 +74,35 @@
 #include "opt_multiprocessor.h"
 #endif
 
-#include <sys/signal.h>
-
 #include <machine/segments.h>
-#include <machine/tss.h>
-#include <x86/fpu.h>
-#include <i386/sysarch.h>
+#include <x86/cpu_extended_state.h>
 
 struct pcb {
 	int	pcb_esp0;		/* ring0 esp */
 	int	pcb_esp;		/* kernel esp */
 	int	pcb_ebp;		/* kernel ebp */
-	int	pcb_unused;		/* unused */
 	int	pcb_cr0;		/* saved image of CR0 */
 	int	pcb_cr2;		/* page fault address (CR2) */
 	int	pcb_cr3;		/* page directory pointer */
 	int	pcb_iopl;		/* i/o privilege level */
 
-	/* floating point state for FPU */
-	union	savefpu pcb_savefpu __aligned(16);
-
 	struct segment_descriptor pcb_fsd;	/* %fs descriptor */
 	struct segment_descriptor pcb_gsd; 	/* %gs descriptor */
-	void *	pcb_onfault;		/* copyin/out fault recovery */
+	void 	*pcb_onfault;		/* copyin/out fault recovery */
 	int	vm86_eflags;		/* virtual eflags for vm86 mode */
 	int	vm86_flagmask;		/* flag mask for vm86 mode */
 	void	*vm86_userp;		/* XXX performance hack */
-	struct cpu_info *pcb_fpcpu;	/* cpu holding our fp state. */
 	char	*pcb_iomap;		/* I/O permission bitmap */
+
+	int	not_used[15];
+
+	/* floating point state */
+	struct cpu_info	*pcb_fpcpu;	/* cpu holding our fp state. */
+	union savefpu	pcb_savefpu __aligned(64);
+	/* **** DO NOT ADD ANYTHING HERE **** */
+
 };
+/* This doesn't really matter, but there is a lot of implied padding */
+__CTASSERT(sizeof(struct pcb) - sizeof (union savefpu) == 128);
 
 #endif /* _I386_PCB_H_ */

Index: src/sys/arch/i386/include/proc.h
diff -u src/sys/arch/i386/include/proc.h:1.41 src/sys/arch/i386/include/proc.h:1.42
--- src/sys/arch/i386/include/proc.h:1.41	Sat Feb 15 10:11:15 2014
+++ src/sys/arch/i386/include/proc.h	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.41 2014/02/15 10:11:15 dsl Exp $	*/
+/*	$NetBSD: proc.h,v 1.42 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*
  * Copyright (c) 1991 Regents of the University of California.
@@ -63,10 +63,4 @@ struct mdproc {
 /* md_flags */
 #define MDP_USEDMTRR	0x0002	/* has set volatile MTRRs */
 
-/* Kernel stack parameters. */
-#define	UAREA_PCB_OFFSET	(USPACE - ALIGN(sizeof(struct pcb)))
-#define	KSTACK_LOWEST_ADDR(l)	\
-    ((void *)((vaddr_t)(l)->l_addr - UAREA_PCB_OFFSET))
-#define	KSTACK_SIZE		UAREA_PCB_OFFSET
-
 #endif /* _I386_PROC_H_ */

Index: src/sys/arch/x86/x86/vm_machdep.c
diff -u src/sys/arch/x86/x86/vm_machdep.c:1.22 src/sys/arch/x86/x86/vm_machdep.c:1.23
--- src/sys/arch/x86/x86/vm_machdep.c:1.22	Sat Feb 15 10:11:15 2014
+++ src/sys/arch/x86/x86/vm_machdep.c	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.22 2014/02/15 10:11:15 dsl Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.23 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986 The Regents of the University of California.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.22 2014/02/15 10:11:15 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.23 2014/02/20 18:19:10 dsl Exp $");
 
 #include "opt_mtrr.h"
 
@@ -99,10 +99,13 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c
 #include <machine/gdt.h>
 #include <machine/reg.h>
 #include <machine/specialreg.h>
+
 #ifdef MTRR
 #include <machine/mtrr.h>
 #endif
 
+#include <x86/fpu.h>
+
 void
 cpu_proc_fork(struct proc *p1, struct proc *p2)
 {
@@ -169,10 +172,10 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	uv = uvm_lwp_getuarea(l2);
 
 #ifdef __x86_64__
-	pcb2->pcb_rsp0 = (uv + KSTACK_SIZE - 16) & ~0xf;
+	pcb2->pcb_rsp0 = (uv + USPACE - 16) & ~0xf;
 	tf = (struct trapframe *)pcb2->pcb_rsp0 - 1;
 #else
-	pcb2->pcb_esp0 = (uv + KSTACK_SIZE - 16);
+	pcb2->pcb_esp0 = (uv + USPACE - 16);
 	tf = (struct trapframe *)pcb2->pcb_esp0 - 1;
 
 	pcb2->pcb_iomap = NULL;

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.440 src/sys/sys/param.h:1.441
--- src/sys/sys/param.h:1.440	Fri Feb  7 15:29:23 2014
+++ src/sys/sys/param.h	Thu Feb 20 18:19:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.440 2014/02/07 15:29:23 hannken Exp $	*/
+/*	$NetBSD: param.h,v 1.441 2014/02/20 18:19:10 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -63,7 +63,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	699003100	/* NetBSD 6.99.31 */
+#define	__NetBSD_Version__	699003200	/* NetBSD 6.99.32 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Reply via email to