diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 7 | ||||
| -rw-r--r-- | arch/x86/boot/cpucheck.c | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 19 |
3 files changed, 46 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 7116fda7077f..06600cc9a26c 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -1011,6 +1011,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 1011 | parameter will force ia64_sal_cache_flush to call | 1011 | parameter will force ia64_sal_cache_flush to call |
| 1012 | ia64_pal_cache_flush instead of SAL_CACHE_FLUSH. | 1012 | ia64_pal_cache_flush instead of SAL_CACHE_FLUSH. |
| 1013 | 1013 | ||
| 1014 | forcepae [X86-32] | ||
| 1015 | Forcefully enable Physical Address Extension (PAE). | ||
| 1016 | Many Pentium M systems disable PAE but may have a | ||
| 1017 | functionally usable PAE implementation. | ||
| 1018 | Warning: use of this parameter will taint the kernel | ||
| 1019 | and may cause unknown problems. | ||
| 1020 | |||
| 1014 | ftrace=[tracer] | 1021 | ftrace=[tracer] |
| 1015 | [FTRACE] will set and start the specified tracer | 1022 | [FTRACE] will set and start the specified tracer |
| 1016 | as early as possible in order to facilitate early | 1023 | as early as possible in order to facilitate early |
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 | ||
| 70 | static 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 */ |
| 71 | static int check_cpuflags(void) | 78 | static 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) |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 34bbb555e269..897d6201ef10 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -186,6 +186,14 @@ static void intel_smp_check(struct cpuinfo_x86 *c) | |||
| 186 | } | 186 | } |
| 187 | } | 187 | } |
| 188 | 188 | ||
| 189 | static int forcepae; | ||
| 190 | static int __init forcepae_setup(char *__unused) | ||
| 191 | { | ||
| 192 | forcepae = 1; | ||
| 193 | return 1; | ||
| 194 | } | ||
| 195 | __setup("forcepae", forcepae_setup); | ||
| 196 | |||
| 189 | static void intel_workarounds(struct cpuinfo_x86 *c) | 197 | static void intel_workarounds(struct cpuinfo_x86 *c) |
| 190 | { | 198 | { |
| 191 | #ifdef CONFIG_X86_F00F_BUG | 199 | #ifdef CONFIG_X86_F00F_BUG |
| @@ -214,6 +222,17 @@ static void intel_workarounds(struct cpuinfo_x86 *c) | |||
| 214 | clear_cpu_cap(c, X86_FEATURE_SEP); | 222 | clear_cpu_cap(c, X86_FEATURE_SEP); |
| 215 | 223 | ||
| 216 | /* | 224 | /* |
| 225 | * PAE CPUID issue: many Pentium M report no PAE but may have a | ||
| 226 | * functionally usable PAE implementation. | ||
| 227 | * Forcefully enable PAE if kernel parameter "forcepae" is present. | ||
| 228 | */ | ||
| 229 | if (forcepae) { | ||
| 230 | printk(KERN_WARNING "PAE forced!\n"); | ||
| 231 | set_cpu_cap(c, X86_FEATURE_PAE); | ||
| 232 | add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_NOW_UNRELIABLE); | ||
| 233 | } | ||
| 234 | |||
| 235 | /* | ||
| 217 | * P4 Xeon errata 037 workaround. | 236 | * P4 Xeon errata 037 workaround. |
| 218 | * Hardware prefetcher may cause stale data to be loaded into the cache. | 237 | * Hardware prefetcher may cause stale data to be loaded into the cache. |
| 219 | */ | 238 | */ |
