Module Name: src Committed By: maxv Date: Sat May 14 08:34:01 UTC 2016
Modified Files: src/sys/arch/i386/i386: locore.S mptramp.S Log Message: Fix the secondary CPUs bug in i386. Same as amd64. To generate a diff of this commit: cvs rdiff -u -r1.118 -r1.119 src/sys/arch/i386/i386/locore.S cvs rdiff -u -r1.28 -r1.29 src/sys/arch/i386/i386/mptramp.S 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/i386/i386/locore.S diff -u src/sys/arch/i386/i386/locore.S:1.118 src/sys/arch/i386/i386/locore.S:1.119 --- src/sys/arch/i386/i386/locore.S:1.118 Sat May 14 06:49:34 2016 +++ src/sys/arch/i386/i386/locore.S Sat May 14 08:34:00 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.118 2016/05/14 06:49:34 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.119 2016/05/14 08:34:00 maxv Exp $ */ /* * Copyright-o-rama! @@ -128,7 +128,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.118 2016/05/14 06:49:34 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.119 2016/05/14 08:34:00 maxv Exp $"); #include "opt_compat_oldboot.h" #include "opt_copy_symtab.h" @@ -168,6 +168,9 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 #endif /* XEN */ #define RELOC(x) _RELOC(_C_LABEL(x)) +/* 32bit version of PG_NX */ +#define PG_NX32 0x80000000 + #ifndef PAE #define PROC0_PDIR_OFF 0 #else @@ -234,6 +237,7 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 */ .data + .globl _C_LABEL(nox_flag) .globl _C_LABEL(cputype) .globl _C_LABEL(cpuid_level) .globl _C_LABEL(esym) @@ -279,6 +283,10 @@ LABEL(lapic_tpr) .long 0 END(lapic_tpr) #endif + + .type _C_LABEL(nox_flag), @object +LABEL(nox_flag) .long 0 /* 32bit NOX flag, set if supported */ +END(nox_flag) .type _C_LABEL(cputype), @object LABEL(cputype) .long 0 /* are we 80486, Pentium, or.. */ END(cputype) @@ -550,6 +558,16 @@ try586: /* Use the `cpuid' instruction. */ movl $_RELOC(tmpstk),%esp + /* + * Retrieve the NX/XD flag. We use the 32bit version of PG_NX. + */ + movl $0x80000001,%eax + cpuid + andl $CPUID_NOX,%edx + jz no_NOX + movl $PG_NX32,RELOC(nox_flag) +no_NOX: + /* * There are two different layouts possible, depending on whether PAE is * enabled or not. @@ -737,7 +755,20 @@ try586: /* Use the `cpuid' instruction. movl %eax,%cr3 /* - * 2. Enable paging and the rest of it. + * 2. Set NOX in EFER, if available. + */ + movl RELOC(nox_flag),%ebx + cmpl $0,%ebx + je skip_NOX + movl $MSR_EFER,%ecx + rdmsr + xorl %eax,%eax + orl $(EFER_NXE),%eax + wrmsr +skip_NOX: + + /* + * 3. Enable paging and the rest of it. */ movl %cr0,%eax orl $(CR0_PE|CR0_PG|CR0_NE|CR0_TS|CR0_MP|CR0_WP|CR0_AM),%eax Index: src/sys/arch/i386/i386/mptramp.S diff -u src/sys/arch/i386/i386/mptramp.S:1.28 src/sys/arch/i386/i386/mptramp.S:1.29 --- src/sys/arch/i386/i386/mptramp.S:1.28 Thu May 12 09:40:23 2016 +++ src/sys/arch/i386/i386/mptramp.S Sat May 14 08:34:00 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: mptramp.S,v 1.28 2016/05/12 09:40:23 maxv Exp $ */ +/* $NetBSD: mptramp.S,v 1.29 2016/05/14 08:34:00 maxv Exp $ */ /* * Copyright (c) 2000, 2016 The NetBSD Foundation, Inc. @@ -75,7 +75,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: mptramp.S,v 1.28 2016/05/12 09:40:23 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mptramp.S,v 1.29 2016/05/14 08:34:00 maxv Exp $"); #include "opt_mpbios.h" /* for MPDEBUG */ @@ -177,11 +177,25 @@ no_PSE: movl %eax,%cr4 #endif + /* + * Set NOX in EFER, if available. + */ + movl RELOC(nox_flag),%ebx + cmpl $0,%ebx + je no_NOX + movl $MSR_EFER,%ecx + rdmsr + xorl %eax,%eax + orl $(EFER_NXE),%eax + wrmsr +no_NOX: + + /* Load %cr3. */ movl RELOC(mp_pdirpa),%ecx HALTT(0x5,%ecx) - - /* Load base of page directory and enable mapping. */ movl %ecx,%cr3 /* load PTD addr into MMU */ + + /* Enable paging and the rest of it. */ movl %cr0,%eax orl $(CR0_PE|CR0_PG|CR0_NE|CR0_TS|CR0_MP|CR0_WP|CR0_AM),%eax movl %eax,%cr0 @@ -191,17 +205,6 @@ no_PSE: #endif HALT(0x6) - /* - * If EFER_NXE is not enabled, fetching a page with a NX bit set - * will raise a #GP. Avoid that by setting the NXE feature now. - */ - movl _C_LABEL(cpu_feature)+2*4,%eax /* cpu_feature[2] */ - andl $CPUID_NOX,%eax - jz 1f - movl $MSR_EFER,%ecx - rdmsr - orl $EFER_NXE,%eax /* enable No-Execute feature */ - wrmsr /* * ok, we are now running with paging enabled and sharing page tables