All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Bainbridge <chris.bainbridge@gmail.com>
To: x86@kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>, Andreas Mohr <andi@lisas.de>,
	Dennis Mungai <dmngaie@gmail.com>, Dave Jones <davej@redhat.com>,
	linux-kernel@vger.kernel.org, devzero@web.de, bp@alien8.de
Subject: [PATCH] x86: Add forcepae parameter for booting PAE kernels on PAE-disabled Pentium M
Date: Fri, 7 Mar 2014 18:40:42 +0700	[thread overview]
Message-ID: <20140307114040.GA4997@localhost> (raw)
In-Reply-To: <20140304104447.GA4891@pd.tnic>

From: Chris Bainbridge <chris.bainbridge@gmail.com>

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>
---
This patch depends on Dave Jones's TAINT_CPU_OUT_OF_SPEC patch @ 
https://lkml.org/lkml/2014/2/26/394

diff --git a/Documentation/kernel-parameters.txt 
b/Documentation/kernel-parameters.txt
index 580a60c..67755ea 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.
 			parameter will force ia64_sal_cache_flush to call
 			ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
 
+	forcepae [X86-32]
+			Forcefully enable Physical Address Extension (PAE).
+			Many Pentium M systems disable PAE but may have a
+			functionally usable PAE implementation.
+			Warning: use of this parameter will taint the kernel
+			and may cause unknown problems.
+
 	ftrace=[tracer]
 			[FTRACE] will set and start the specified tracer
 			as early as possible in order to facilitate early
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
index 100a9a1..f0d0b20 100644
--- a/arch/x86/boot/cpucheck.c
+++ b/arch/x86/boot/cpucheck.c
@@ -67,6 +67,13 @@ static int is_transmeta(void)
 	       cpu_vendor[2] == A32('M', 'x', '8', '6');
 }
 
+static int is_intel(void)
+{
+	return cpu_vendor[0] == A32('G', 'e', 'n', 'u') &&
+	       cpu_vendor[1] == A32('i', 'n', 'e', 'I') &&
+	       cpu_vendor[2] == A32('n', 't', 'e', 'l');
+}
+
 /* Returns a bitmask of which words we have error bits in */
 static int check_cpuflags(void)
 {
@@ -153,6 +160,19 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
 		asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
 
 		err = check_cpuflags();
+	} else if (err == 0x01 &&
+		   !(err_flags[0] & ~(1 << X86_FEATURE_PAE)) &&
+		   is_intel() && cpu.level == 6 &&
+		   (cpu.model == 9 || cpu.model == 13)) {
+		/* PAE is disabled on this Pentium M but can be forced */
+		if (cmdline_find_option_bool("forcepae")) {
+			puts("WARNING: Forcing PAE in CPU flags\n");
+			set_bit(X86_FEATURE_PAE, cpu.flags);
+			err = check_cpuflags();
+		}
+		else {
+			puts("WARNING: PAE disabled. Use parameter 'forcepae' to enable at your own risk!\n");
+		}
 	}
 
 	if (err_flags_ptr)
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index ea56e7c..053cb59 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -195,6 +195,14 @@ static void intel_smp_check(struct cpuinfo_x86 *c)
 	}
 }
 
+static int forcepae;
+static int __init forcepae_setup(char *__unused)
+{
+	forcepae = 1;
+	return 1;
+}
+__setup("forcepae", forcepae_setup);
+
 static void intel_workarounds(struct cpuinfo_x86 *c)
 {
 	unsigned long lo, hi;
@@ -225,6 +233,17 @@ static void intel_workarounds(struct cpuinfo_x86 *c)
 		clear_cpu_cap(c, X86_FEATURE_SEP);
 
 	/*
+	 * PAE CPUID issue: many Pentium M report no PAE but may have a
+	 * functionally usable PAE implementation.
+	 * Forcefully enable PAE if kernel parameter "forcepae" is present.
+	 */
+	if (forcepae) {
+		printk(KERN_WARNING "PAE forced!\n");
+		set_cpu_cap(c, X86_FEATURE_PAE);
+		add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_NOW_UNRELIABLE);
+	}
+
+	/*
 	 * P4 Xeon errata 037 workaround.
 	 * Hardware prefetcher may cause stale data to be loaded into the cache.
 	 */

  parent reply	other threads:[~2014-03-07 11:40 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-25  6:01 [PATCH] x86: set Pentium M as PAE capable Chris Bainbridge
2014-02-25 10:45 ` H. Peter Anvin
2014-02-25 11:35   ` Borislav Petkov
2014-02-25 12:06   ` Peter Hurley
2014-02-25 12:07   ` One Thousand Gnomes
2014-02-25 16:26   ` Dave Jones
2014-02-25 17:16     ` H. Peter Anvin
2014-02-26 12:12       ` Chris Bainbridge
2014-02-26 13:18         ` Borislav Petkov
2014-02-26 15:49           ` Dave Jones
2014-02-26 17:18             ` Borislav Petkov
2014-02-26 17:20               ` Dave Jones
2014-02-26 17:28                 ` Borislav Petkov
2014-02-28  7:30             ` Chris Bainbridge
     [not found]               ` <CAKKYfmFgVjYwvThpB0FBB+ggOwULWKLpz7ADT1eojno_KtD9yw@mail.gmail.com>
2014-02-28 14:00                 ` Chris Bainbridge
2014-03-02 20:56                   ` Andreas Mohr
2014-03-02 20:59                     ` H. Peter Anvin
2014-03-02 21:02                     ` Dave Jones
2014-03-02 21:04                       ` Borislav Petkov
2014-03-02 21:13                         ` Andreas Mohr
2014-03-02 21:42                       ` Gene Heskett
2014-03-03 12:31                         ` One Thousand Gnomes
2014-03-03  8:04                     ` Chris Bainbridge
2014-03-03 19:29                       ` Borislav Petkov
2014-03-04  5:01                         ` Chris Bainbridge
2014-03-04  5:04                           ` H. Peter Anvin
2014-03-04  6:06                             ` Chris Bainbridge
2014-03-04 10:44                               ` Borislav Petkov
2014-03-05  4:17                                 ` Chris Bainbridge
2014-03-07 11:40                                 ` Chris Bainbridge [this message]
2014-03-10 10:25                                   ` [PATCH] x86: Add forcepae parameter for booting PAE kernels on PAE-disabled Pentium M Borislav Petkov
2014-03-20 23:30                                   ` [tip:x86/cpu] x86, cpu: " tip-bot for Chris Bainbridge
2014-03-20 23:33                                   ` tip-bot for Chris Bainbridge
2014-03-20 23:30             ` [tip:x86/cpu] Rename TAINT_UNSAFE_SMP to TAINT_CPU_OUT_OF_SPEC tip-bot for Dave Jones
2014-02-26 16:46           ` [PATCH] x86: set Pentium M as PAE capable H. Peter Anvin
2014-02-26 16:44         ` Matthew Garrett
2014-02-26 16:45           ` H. Peter Anvin
2014-02-26 17:10             ` Matthew Garrett
2014-02-26 17:57               ` H. Peter Anvin
2014-03-03  0:11                 ` H. Peter Anvin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140307114040.GA4997@localhost \
    --to=chris.bainbridge@gmail.com \
    --cc=andi@lisas.de \
    --cc=bp@alien8.de \
    --cc=davej@redhat.com \
    --cc=devzero@web.de \
    --cc=dmngaie@gmail.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.