From: Borislav Petkov <bp@alien8.de>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: X86 ML <x86@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
Borislav Petkov <bp@suse.de>
Subject: [PATCH 2/5 -v2.1] x86: Detect CPUID support early at boot
Date: Sun, 10 Feb 2013 00:16:02 +0100 [thread overview]
Message-ID: <1360451762-10175-1-git-send-email-bp@alien8.de> (raw)
In-Reply-To: <20130209231351.GB5556@pd.tnic>
From: Borislav Petkov <bp@suse.de>
We detect CPUID function support on each CPU and save it for later use,
obviating the need to play the toggle EFLAGS.ID game every time. C code
is looking at ->cpuid_level anyway.
Signed-off-by: Borislav Petkov <bp@suse.de>
---
arch/x86/kernel/head_32.S | 48 +++++++++++++++++++++++------------------------
1 file changed, 23 insertions(+), 25 deletions(-)
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index f4d919e2cd2b..534397ba226c 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -318,30 +318,37 @@ default_entry:
movl %eax,%cr0
/*
- * New page tables may be in 4Mbyte page mode and may
- * be using the global pages.
+ * Initialize EFLAGS. Some BIOSes leave bits like NT set. This would confuse the
+ * debugger if this code is traced. Best to initialize before switching to
+ * protected mode. As a side effect, we clear DF too because GCC expects it so.
+ */
+ pushl $0
+ popfl
+
+/*
+ * New page tables may be in 4Mbyte page mode and may be using the global pages.
*
- * NOTE! If we are on a 486 we may have no cr4 at all!
- * Specifically, cr4 exists if and only if CPUID exists
- * and has flags other than the FPU flag set.
+ * NOTE! If we are on a 486 we may have no cr4 at all! Specifically, cr4 exists
+ * if and only if CPUID exists and has flags other than the FPU flag set.
*/
+ movl $-1,pa(X86_CPUID) # preset CPUID level
movl $X86_EFLAGS_ID,%ecx
pushl %ecx
- popfl
- pushfl
- popl %eax
- pushl $0
- popfl
+ popfl # set EFLAGS=ID
pushfl
- popl %edx
- xorl %edx,%eax
- testl %ecx,%eax
- jz 6f # No ID flag = no CPUID = no CR4
+ popl %eax # get EFLAGS
+ testl $X86_EFLAGS_ID,%eax # did EFLAGS.ID remained set?
+ jz 6f # hw disallowed setting of ID bit
+ # which means no CPUID and no CR4
+
+ xorl %eax,%eax
+ cpuid
+ movl %eax,pa(X86_CPUID) # save largest std CPUID function
movl $1,%eax
cpuid
- andl $~1,%edx # Ignore CPUID.FPU
- jz 6f # No flags or only CPUID.FPU = no CR4
+ andl $~1,%edx # Ignore CPUID.FPU
+ jz 6f # No flags or only CPUID.FPU = no CR4
movl pa(mmu_cr4_features),%eax
movl %eax,%cr4
@@ -389,14 +396,6 @@ default_entry:
addl $__PAGE_OFFSET, %esp
/*
- * Initialize eflags. Some BIOS's leave bits like NT set. This would
- * confuse the debugger if this code is traced.
- * XXX - best to initialize before switching to protected mode.
- */
- pushl $0
- popfl
-
-/*
* start system 32-bit setup. We need to re-do some of the things done
* in 16-bit mode for the "real" operations.
*/
@@ -472,7 +471,6 @@ is486: movl $0x50022,%ecx # set AM, WP, NE and MP
xorl %eax,%eax # Clear LDT
lldt %ax
- cld # gcc2 wants the direction flag cleared at all times
pushl $0 # fake return address for unwinder
jmp *(initial_code)
--
1.8.1.3.535.ga923c31
next prev parent reply other threads:[~2013-02-09 23:16 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-09 19:52 [PATCH 0/5] x86, head_32: Some cleanups, -v2 Borislav Petkov
2013-02-09 19:52 ` [PATCH 1/5] x86, head_32: Remove i386 pieces Borislav Petkov
2013-02-09 19:52 ` [PATCH 2/5] x86: Detect CPUID support early at boot Borislav Petkov
2013-02-09 19:52 ` [PATCH 3/5] x86, head_32: Remove second CPUID detection from default_entry Borislav Petkov
2013-02-09 19:52 ` [PATCH 4/5] x86, head_32: Give the 6 label a real name Borislav Petkov
2013-02-09 19:52 ` [PATCH 5/5] x86, head_32: Remove an old gcc2 fix Borislav Petkov
2013-02-09 20:51 ` H. Peter Anvin
2013-02-09 20:52 ` H. Peter Anvin
2013-02-09 21:23 ` Borislav Petkov
2013-02-09 22:08 ` [PATCH 5/5 -v2] x86, head_32: Clear DF much earlier Borislav Petkov
2013-02-09 22:23 ` [PATCH 5/5] x86, head_32: Remove an old gcc2 fix H. Peter Anvin
2013-02-09 23:13 ` Borislav Petkov
2013-02-09 23:16 ` Borislav Petkov [this message]
2013-02-10 4:34 ` [PATCH 2/5 -v2.1] x86: Detect CPUID support early at boot H. Peter Anvin
2013-02-10 8:36 ` Borislav Petkov
2013-02-10 15:10 ` 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=1360451762-10175-1-git-send-email-bp@alien8.de \
--to=bp@alien8.de \
--cc=bp@suse.de \
--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.