aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/boot
diff options
context:
space:
mode:
authorChris Bainbridge <chris.bainbridge@gmail.com>2014-03-07 06:40:42 -0500
committerH. Peter Anvin <hpa@zytor.com>2014-03-20 19:31:54 -0400
commit69f2366c9456d0ce784cf5aba87ee77eeadc1d5e (patch)
tree3e4405ced0145cbcbbf303106965cad9075cb4a4 /arch/x86/boot
parent8c90487cdc64847b4fdd812ab3047f426fec4d13 (diff)
x86, cpu: Add forcepae parameter for booting PAE kernels on PAE-disabled Pentium M
Many Pentium M systems disable PAE but may have a functionally usable PAE implementation. This adds the "forcepae" parameter which bypasses the boot check for PAE, and sets the CPU as being PAE capable. Using this parameter will taint the kernel with TAINT_CPU_OUT_OF_SPEC. Signed-off-by: Chris Bainbridge <chris.bainbridge@gmail.com> Link: http://lkml.kernel.org/r/20140307114040.GA4997@localhost Acked-by: Borislav Petkov <bp@suse.de> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r--arch/x86/boot/cpucheck.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
index 100a9a10076a..f0d0b20fe149 100644
--- a/arch/x86/boot/cpucheck.c
+++ b/arch/x86/boot/cpucheck.c
@@ -67,6 +67,13 @@ static int is_transmeta(void)
67 cpu_vendor[2] == A32('M', 'x', '8', '6'); 67 cpu_vendor[2] == A32('M', 'x', '8', '6');
68} 68}
69 69
70static int is_intel(void)
71{
72 return cpu_vendor[0] == A32('G', 'e', 'n', 'u') &&
73 cpu_vendor[1] == A32('i', 'n', 'e', 'I') &&
74 cpu_vendor[2] == A32('n', 't', 'e', 'l');
75}
76
70/* Returns a bitmask of which words we have error bits in */ 77/* Returns a bitmask of which words we have error bits in */
71static int check_cpuflags(void) 78static int check_cpuflags(void)
72{ 79{
@@ -153,6 +160,19 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
153 asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); 160 asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
154 161
155 err = check_cpuflags(); 162 err = check_cpuflags();
163 } else if (err == 0x01 &&
164 !(err_flags[0] & ~(1 << X86_FEATURE_PAE)) &&
165 is_intel() && cpu.level == 6 &&
166 (cpu.model == 9 || cpu.model == 13)) {
167 /* PAE is disabled on this Pentium M but can be forced */
168 if (cmdline_find_option_bool("forcepae")) {
169 puts("WARNING: Forcing PAE in CPU flags\n");
170 set_bit(X86_FEATURE_PAE, cpu.flags);
171 err = check_cpuflags();
172 }
173 else {
174 puts("WARNING: PAE disabled. Use parameter 'forcepae' to enable at your own risk!\n");
175 }
156 } 176 }
157 177
158 if (err_flags_ptr) 178 if (err_flags_ptr)