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__)