Module Name: src Committed By: jym Date: Tue May 4 23:27:14 UTC 2010
Modified Files: src/sys/arch/amd64/amd64: machdep.c src/sys/arch/i386/i386: machdep.c trap.c src/sys/arch/i386/include: pte.h src/sys/arch/x86/include: specialreg.h src/sys/arch/x86/x86: pmap.c src/sys/arch/xen/x86: cpu.c Log Message: Enable the NX bit feature for Xen i386pae and amd64 kernels. Tested with Xen 3.1 and Xen 3.3, dom0 and domU, by bouyer@ and j...@. Ok bou...@. To generate a diff of this commit: cvs rdiff -u -r1.144 -r1.145 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.686 -r1.687 src/sys/arch/i386/i386/machdep.c cvs rdiff -u -r1.256 -r1.257 src/sys/arch/i386/i386/trap.c cvs rdiff -u -r1.22 -r1.23 src/sys/arch/i386/include/pte.h cvs rdiff -u -r1.40 -r1.41 src/sys/arch/x86/include/specialreg.h cvs rdiff -u -r1.107 -r1.108 src/sys/arch/x86/x86/pmap.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/xen/x86/cpu.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/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.144 src/sys/arch/amd64/amd64/machdep.c:1.145 --- src/sys/arch/amd64/amd64/machdep.c:1.144 Sun Apr 18 23:47:50 2010 +++ src/sys/arch/amd64/amd64/machdep.c Tue May 4 23:27:13 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.144 2010/04/18 23:47:50 jym Exp $ */ +/* $NetBSD: machdep.c,v 1.145 2010/05/04 23:27:13 jym Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008 @@ -107,7 +107,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.144 2010/04/18 23:47:50 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.145 2010/05/04 23:27:13 jym Exp $"); /* #define XENDEBUG_LOW */ @@ -1253,7 +1253,6 @@ #endif /* XEN */ cpu_feature[0] &= ~CPUID_FEAT_BLACKLIST; - cpu_feature[2] &= ~CPUID_EXT_FEAT_BLACKLIST; cpu_init_msrs(&cpu_info_primary, true); Index: src/sys/arch/i386/i386/machdep.c diff -u src/sys/arch/i386/i386/machdep.c:1.686 src/sys/arch/i386/i386/machdep.c:1.687 --- src/sys/arch/i386/i386/machdep.c:1.686 Fri Apr 23 16:07:33 2010 +++ src/sys/arch/i386/i386/machdep.c Tue May 4 23:27:13 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.686 2010/04/23 16:07:33 joerg Exp $ */ +/* $NetBSD: machdep.c,v 1.687 2010/05/04 23:27:13 jym 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.686 2010/04/23 16:07:33 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.687 2010/05/04 23:27:13 jym Exp $"); #include "opt_beep.h" #include "opt_compat_ibcs2.h" @@ -1299,7 +1299,6 @@ pcb = lwp_getpcb(&lwp0); cpu_feature[0] &= ~CPUID_FEAT_BLACKLIST; - cpu_feature[2] &= ~CPUID_EXT_FEAT_BLACKLIST; cpu_init_msrs(&cpu_info_primary, true); Index: src/sys/arch/i386/i386/trap.c diff -u src/sys/arch/i386/i386/trap.c:1.256 src/sys/arch/i386/i386/trap.c:1.257 --- src/sys/arch/i386/i386/trap.c:1.256 Fri Apr 23 19:18:09 2010 +++ src/sys/arch/i386/i386/trap.c Tue May 4 23:27:13 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.256 2010/04/23 19:18:09 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.257 2010/05/04 23:27:13 jym Exp $ */ /*- * Copyright (c) 1998, 2000, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.256 2010/04/23 19:18:09 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.257 2010/05/04 23:27:13 jym Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -671,6 +671,8 @@ map = &vm->vm_map; if (frame->tf_err & PGEX_W) ftype = VM_PROT_WRITE; + else if (frame->tf_err & PGEX_X) + ftype = VM_PROT_EXECUTE; else ftype = VM_PROT_READ; Index: src/sys/arch/i386/include/pte.h diff -u src/sys/arch/i386/include/pte.h:1.22 src/sys/arch/i386/include/pte.h:1.23 --- src/sys/arch/i386/include/pte.h:1.22 Tue Apr 6 20:43:57 2010 +++ src/sys/arch/i386/include/pte.h Tue May 4 23:27:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pte.h,v 1.22 2010/04/06 20:43:57 jld Exp $ */ +/* $NetBSD: pte.h,v 1.23 2010/05/04 23:27:14 jym Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -274,5 +274,6 @@ #define PGEX_P 0x01 /* protection violation (vs. no mapping) */ #define PGEX_W 0x02 /* exception during a write cycle */ #define PGEX_U 0x04 /* exception while in user mode (upl) */ +#define PGEX_X 0x10 /* exception during instruction fetch */ #endif /* _I386_PTE_H_ */ Index: src/sys/arch/x86/include/specialreg.h diff -u src/sys/arch/x86/include/specialreg.h:1.40 src/sys/arch/x86/include/specialreg.h:1.41 --- src/sys/arch/x86/include/specialreg.h:1.40 Sun Apr 18 23:47:51 2010 +++ src/sys/arch/x86/include/specialreg.h Tue May 4 23:27:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: specialreg.h,v 1.40 2010/04/18 23:47:51 jym Exp $ */ +/* $NetBSD: specialreg.h,v 1.41 2010/05/04 23:27:14 jym Exp $ */ /*- * Copyright (c) 1991 The Regents of the University of California. @@ -262,10 +262,8 @@ #ifdef XEN /* Not on Xen */ #define CPUID_FEAT_BLACKLIST (CPUID_PGE|CPUID_PSE|CPUID_MTRR|CPUID_FXSR) -#define CPUID_EXT_FEAT_BLACKLIST (CPUID_NOX) #else #define CPUID_FEAT_BLACKLIST 0 -#define CPUID_EXT_FEAT_BLACKLIST 0 #endif /* XEN */ /* Index: src/sys/arch/x86/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.107 src/sys/arch/x86/x86/pmap.c:1.108 --- src/sys/arch/x86/x86/pmap.c:1.107 Sun Apr 18 23:47:51 2010 +++ src/sys/arch/x86/x86/pmap.c Tue May 4 23:27:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.107 2010/04/18 23:47:51 jym Exp $ */ +/* $NetBSD: pmap.c,v 1.108 2010/05/04 23:27:14 jym Exp $ */ /* * Copyright (c) 2007 Manuel Bouyer. @@ -149,7 +149,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.107 2010/04/18 23:47:51 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.108 2010/05/04 23:27:14 jym Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -1146,10 +1146,9 @@ if (flags & PMAP_NOCACHE) npte |= PG_N; -#ifndef XEN if ((cpu_feature[2] & CPUID_NOX) && !(prot & VM_PROT_EXECUTE)) npte |= PG_NX; -#endif + opte = pmap_pte_testset (pte, npte); /* zap! */ if (pmap_valid_entry(opte)) { @@ -1268,14 +1267,13 @@ struct pcb *pcb; int i; vaddr_t kva; -#ifdef XEN - pt_entry_t pg_nx = 0; -#else +#ifndef XEN unsigned long p1i; vaddr_t kva_end; - pt_entry_t pg_nx = (cpu_feature[2] & CPUID_NOX ? PG_NX : 0); #endif + pt_entry_t pg_nx = (cpu_feature[2] & CPUID_NOX ? PG_NX : 0); + /* * set up our local static global vars that keep track of the * usage of KVM before kernel_map is set up Index: src/sys/arch/xen/x86/cpu.c diff -u src/sys/arch/xen/x86/cpu.c:1.43 src/sys/arch/xen/x86/cpu.c:1.44 --- src/sys/arch/xen/x86/cpu.c:1.43 Sun Apr 18 23:47:52 2010 +++ src/sys/arch/xen/x86/cpu.c Tue May 4 23:27:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.43 2010/04/18 23:47:52 jym Exp $ */ +/* $NetBSD: cpu.c,v 1.44 2010/05/04 23:27:14 jym Exp $ */ /* NetBSD: cpu.c,v 1.18 2004/02/20 17:35:01 yamt Exp */ /*- @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.43 2010/04/18 23:47:52 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.44 2010/05/04 23:27:14 jym Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -1005,6 +1005,9 @@ HYPERVISOR_set_segment_base (SEGBASE_GS_USER, 0); } #endif /* __x86_64__ */ + + if (cpu_feature[2] & CPUID_NOX) + wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NXE); } void