|
@@ -18,6 +18,8 @@
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/setup.h>
|
|
#include <asm/setup.h>
|
|
#include <asm/processor-flags.h>
|
|
#include <asm/processor-flags.h>
|
|
|
|
+#include <asm/msr-index.h>
|
|
|
|
+#include <asm/cpufeature.h>
|
|
#include <asm/percpu.h>
|
|
#include <asm/percpu.h>
|
|
|
|
|
|
/* Physical address */
|
|
/* Physical address */
|
|
@@ -297,25 +299,27 @@ ENTRY(startup_32_smp)
|
|
orl %edx,%eax
|
|
orl %edx,%eax
|
|
movl %eax,%cr4
|
|
movl %eax,%cr4
|
|
|
|
|
|
- btl $5, %eax # check if PAE is enabled
|
|
|
|
- jnc 6f
|
|
|
|
|
|
+ testb $X86_CR4_PAE, %al # check if PAE is enabled
|
|
|
|
+ jz 6f
|
|
|
|
|
|
/* Check if extended functions are implemented */
|
|
/* Check if extended functions are implemented */
|
|
movl $0x80000000, %eax
|
|
movl $0x80000000, %eax
|
|
cpuid
|
|
cpuid
|
|
- cmpl $0x80000000, %eax
|
|
|
|
- jbe 6f
|
|
|
|
|
|
+ /* Value must be in the range 0x80000001 to 0x8000ffff */
|
|
|
|
+ subl $0x80000001, %eax
|
|
|
|
+ cmpl $(0x8000ffff-0x80000001), %eax
|
|
|
|
+ ja 6f
|
|
mov $0x80000001, %eax
|
|
mov $0x80000001, %eax
|
|
cpuid
|
|
cpuid
|
|
/* Execute Disable bit supported? */
|
|
/* Execute Disable bit supported? */
|
|
- btl $20, %edx
|
|
|
|
|
|
+ btl $(X86_FEATURE_NX & 31), %edx
|
|
jnc 6f
|
|
jnc 6f
|
|
|
|
|
|
/* Setup EFER (Extended Feature Enable Register) */
|
|
/* Setup EFER (Extended Feature Enable Register) */
|
|
- movl $0xc0000080, %ecx
|
|
|
|
|
|
+ movl $MSR_EFER, %ecx
|
|
rdmsr
|
|
rdmsr
|
|
|
|
|
|
- btsl $11, %eax
|
|
|
|
|
|
+ btsl $_EFER_NX, %eax
|
|
/* Make changes effective */
|
|
/* Make changes effective */
|
|
wrmsr
|
|
wrmsr
|
|
|
|
|