* [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX
@ 2010-11-09 22:17 Kees Cook
2010-11-09 22:17 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook
` (3 more replies)
0 siblings, 4 replies; 13+ messages in thread
From: Kees Cook @ 2010-11-09 22:17 UTC (permalink / raw)
To: x86, linux-kernel
Resending with updates to commit messages and Pekka Enberg's Acks.
Intel CPUs have an additional MSR bit to indicate if the BIOS was
configured to disable NX. This bit was traditionally used for operating
systems that did not understand how to handle the NX bit. Since Linux
understands this, this BIOS flag should be ignored by default.
In a review[1] of reported hardware being used by Ubuntu bug reporters,
almost 10% of systems had an incorrectly configured BIOS, leaving their
systems unable to use the NX features of their CPU.
This change will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX
cannot be inappropriately controlled by the BIOS on Intel CPUs. If, under
very strange hardware configurations, NX actually needs to be disabled,
"noexec=off" can be used to restore the prior behavior.
-Kees
[1] http://www.outflux.net/blog/archives/2010/02/18/data-mining-for-nx-bit/
---
Changelog:
v2 - rearranged use of verify_cpu()
v3 - resent, show stats on systems that need it
v4 - expanded commit messages, added acks
--
Kees Cook
Ubuntu Security Team
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 22:17 [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook @ 2010-11-09 22:17 ` Kees Cook 2010-11-09 22:18 ` [PATCH 2/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook ` (2 subsequent siblings) 3 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-11-09 22:17 UTC (permalink / raw) To: x86, linux-kernel The code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> --- arch/x86/boot/compressed/head_64.S | 2 +- arch/x86/kernel/trampoline_64.S | 2 +- arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} (100%) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 52f85a1..35af09d 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -182,7 +182,7 @@ no_longmode: hlt jmp 1b -#include "../../kernel/verify_cpu_64.S" +#include "../../kernel/verify_cpu.S" /* * Be careful here startup_64 needs to be at a predictable diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 3af2dff..075d130 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S @@ -127,7 +127,7 @@ startup_64: no_longmode: hlt jmp no_longmode -#include "verify_cpu_64.S" +#include "verify_cpu.S" # Careful these need to be in the same 64K segment as the above; tidt: diff --git a/arch/x86/kernel/verify_cpu_64.S b/arch/x86/kernel/verify_cpu.S similarity index 100% rename from arch/x86/kernel/verify_cpu_64.S rename to arch/x86/kernel/verify_cpu.S -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/4] x86: clear XD_DISABLED flag on Intel to regain NX 2010-11-09 22:17 [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-09 22:17 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook @ 2010-11-09 22:18 ` Kees Cook 2010-11-09 22:18 ` [PATCH 3/4] x86: call verify_cpu during 32bit CPU startup Kees Cook 2010-11-09 22:19 ` [PATCH 4/4] x86: only CPU features determine NX capabilities Kees Cook 3 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-11-09 22:18 UTC (permalink / raw) To: x86, linux-kernel Intel CPUs have an additional MSR bit to indicate if the BIOS was configured to disable the NX cpu feature. This bit was traditionally used for operating systems that did not understand how to handle the NX bit. Since Linux understands this, this BIOS flag should be ignored by default. In a review[1] of reported hardware being used by Ubuntu bug reporters, almost 10% of systems had an incorrectly configured BIOS, leaving their systems unable to use the NX features of their CPU. This change will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX cannot be inappropriately controlled by the BIOS on Intel CPUs. If, under very strange hardware configurations, NX actually needs to be disabled, "noexec=off" can be used to restore the prior behavior. [1] http://www.outflux.net/blog/archives/2010/02/18/data-mining-for-nx-bit/ Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> --- arch/x86/kernel/verify_cpu.S | 48 +++++++++++++++++++++++++++++++++++------- 1 files changed, 40 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S index 56a8c2a..ccb4136 100644 --- a/arch/x86/kernel/verify_cpu.S +++ b/arch/x86/kernel/verify_cpu.S @@ -7,6 +7,7 @@ * Copyright (c) 2007 Andi Kleen (ak@suse.de) * Copyright (c) 2007 Eric Biederman (ebiederm@xmission.com) * Copyright (c) 2007 Vivek Goyal (vgoyal@in.ibm.com) + * Copyright (c) 2010 Kees Cook (kees.cook@canonical.com) * * This source code is licensed under the GNU General Public License, * Version 2. See the file COPYING for more details. @@ -14,18 +15,16 @@ * This is a common code for verification whether CPU supports * long mode and SSE or not. It is not called directly instead this * file is included at various places and compiled in that context. - * Following are the current usage. + * This file is expected to run in 32bit code. Currently: * - * This file is included by both 16bit and 32bit code. + * arch/x86_64/boot/compressed/head_64.S: Boot cpu verification + * arch/x86_64/kernel/trampoline_64.S: secondary processor verfication * - * arch/x86_64/boot/setup.S : Boot cpu verification (16bit) - * arch/x86_64/boot/compressed/head.S: Boot cpu verification (32bit) - * arch/x86_64/kernel/trampoline.S: secondary processor verfication (16bit) - * arch/x86_64/kernel/acpi/wakeup.S:Verfication at resume (16bit) - * - * verify_cpu, returns the status of cpu check in register %eax. + * verify_cpu, returns the status of longmode and SSE in register %eax. * 0: Success 1: Failure * + * On Intel, the XD_DISABLE flag will be cleared as a side-effect. + * * The caller needs to check for the error code and take the action * appropriately. Either display a message or halt. */ @@ -62,8 +61,41 @@ verify_cpu: cmpl $0x444d4163,%ecx jnz verify_cpu_noamd mov $1,%di # cpu is from AMD + jmp verify_cpu_check verify_cpu_noamd: + cmpl $0x756e6547,%ebx # GenuineIntel? + jnz verify_cpu_check + cmpl $0x49656e69,%edx + jnz verify_cpu_check + cmpl $0x6c65746e,%ecx + jnz verify_cpu_check + + # only call IA32_MISC_ENABLE when: + # family > 6 || (family == 6 && model >= 0xd) + movl $0x1, %eax # check CPU family and model + cpuid + movl %eax, %ecx + + andl $0x0ff00f00, %eax # mask family and extended family + shrl $8, %eax + cmpl $6, %eax + ja verify_cpu_clear_xd # family > 6, ok + jb verify_cpu_check # family < 6, skip + + andl $0x000f00f0, %ecx # mask model and extended model + shrl $4, %ecx + cmpl $0xd, %ecx + jb verify_cpu_check # family == 6, model < 0xd, skip + +verify_cpu_clear_xd: + movl $MSR_IA32_MISC_ENABLE, %ecx + rdmsr + btrl $2, %edx # clear MSR_IA32_MISC_ENABLE_XD_DISABLE + jnc verify_cpu_check # only write MSR if bit was changed + wrmsr + +verify_cpu_check: movl $0x1,%eax # Does the cpu have what it takes cpuid andl $REQUIRED_MASK0,%edx -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/4] x86: call verify_cpu during 32bit CPU startup 2010-11-09 22:17 [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-09 22:17 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 2010-11-09 22:18 ` [PATCH 2/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook @ 2010-11-09 22:18 ` Kees Cook 2010-11-09 22:19 ` [PATCH 4/4] x86: only CPU features determine NX capabilities Kees Cook 3 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-11-09 22:18 UTC (permalink / raw) To: x86, linux-kernel The XD_DISABLE-clearing side-effect needs to happen for both 32bit and 64bit, but the 32bit init routines were not calling verify_cpu() yet. This adds that call to gain the side-effect. The longmode/SSE tests being performed in verify_cpu() need to happen very early for 64bit but not for 32bit. Instead of including it in two places for 32bit, we can just include it once in arch/x86/kernel/head_32.S. Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> --- arch/x86/kernel/head_32.S | 6 ++++++ arch/x86/kernel/verify_cpu.S | 1 + 2 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index bcece91..fdaea52 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -314,6 +314,10 @@ ENTRY(startup_32_smp) subl $0x80000001, %eax cmpl $(0x8000ffff-0x80000001), %eax ja 6f + + /* Clear bogus XD_DISABLE bits */ + call verify_cpu + mov $0x80000001, %eax cpuid /* Execute Disable bit supported? */ @@ -609,6 +613,8 @@ ignore_int: #endif iret +#include "verify_cpu.S" + __REFDATA .align 4 ENTRY(initial_code) diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S index ccb4136..5644b4b 100644 --- a/arch/x86/kernel/verify_cpu.S +++ b/arch/x86/kernel/verify_cpu.S @@ -19,6 +19,7 @@ * * arch/x86_64/boot/compressed/head_64.S: Boot cpu verification * arch/x86_64/kernel/trampoline_64.S: secondary processor verfication + * arch/x86_64/kernel/head_32.S: processor startup * * verify_cpu, returns the status of longmode and SSE in register %eax. * 0: Success 1: Failure -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 4/4] x86: only CPU features determine NX capabilities 2010-11-09 22:17 [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook ` (2 preceding siblings ...) 2010-11-09 22:18 ` [PATCH 3/4] x86: call verify_cpu during 32bit CPU startup Kees Cook @ 2010-11-09 22:19 ` Kees Cook 3 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-11-09 22:19 UTC (permalink / raw) To: x86, linux-kernel Fix the NX feature boot warning when NX is missing to correctly reflect that BIOSes cannot disable NX now. Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> --- arch/x86/mm/setup_nx.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/x86/mm/setup_nx.c b/arch/x86/mm/setup_nx.c index a3250aa..410531d 100644 --- a/arch/x86/mm/setup_nx.c +++ b/arch/x86/mm/setup_nx.c @@ -41,7 +41,7 @@ void __init x86_report_nx(void) { if (!cpu_has_nx) { printk(KERN_NOTICE "Notice: NX (Execute Disable) protection " - "missing in CPU or disabled in BIOS!\n"); + "missing in CPU!\n"); } else { #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) if (disable_nx) { -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Security] [PATCH v5 0/4] x86: clear XD_DISABLED flag on Intel to regain NX @ 2010-11-10 18:35 Kees Cook 2010-11-10 18:35 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 0 siblings, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-11-10 18:35 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Pekka Enberg, Alan Cox, Ingo Molnar Resending with Alan Cox's Acks, at Ingo's request. Intel CPUs have an additional MSR bit to indicate if the BIOS was configured to disable NX. This bit was traditionally used for operating systems that did not understand how to handle the NX bit. Since Linux understands this, this BIOS flag should be ignored by default. In a review[1] of reported hardware being used by Ubuntu bug reporters, almost 10% of systems had an incorrectly configured BIOS, leaving their systems unable to use the NX features of their CPU. This change will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX cannot be inappropriately controlled by the BIOS on Intel CPUs. If, under very strange hardware configurations, NX actually needs to be disabled, "noexec=off" can be used to restore the prior behavior. -Kees [1] http://www.outflux.net/blog/archives/2010/02/18/data-mining-for-nx-bit/ --- Changelog: v2 - rearranged use of verify_cpu() v3 - resent, show stats on systems that need it v4 - expanded commit messages, added acks v5 - added acks ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-10 18:35 [Security] [PATCH v5 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook @ 2010-11-10 18:35 ` Kees Cook 0 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-11-10 18:35 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Pekka Enberg, Alan Cox, Ingo Molnar The code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk> --- arch/x86/boot/compressed/head_64.S | 2 +- arch/x86/kernel/trampoline_64.S | 2 +- arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} (100%) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 52f85a1..35af09d 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -182,7 +182,7 @@ no_longmode: hlt jmp 1b -#include "../../kernel/verify_cpu_64.S" +#include "../../kernel/verify_cpu.S" /* * Be careful here startup_64 needs to be at a predictable diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 3af2dff..075d130 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S @@ -127,7 +127,7 @@ startup_64: no_longmode: hlt jmp no_longmode -#include "verify_cpu_64.S" +#include "verify_cpu.S" # Careful these need to be in the same 64K segment as the above; tidt: diff --git a/arch/x86/kernel/verify_cpu_64.S b/arch/x86/kernel/verify_cpu.S similarity index 100% rename from arch/x86/kernel/verify_cpu_64.S rename to arch/x86/kernel/verify_cpu.S -- 1.7.2.3 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Security] [PATCH v3 0/4] x86: clear XD_DISABLED flag on Intel to regain NX @ 2010-11-09 18:11 Kees Cook 2010-11-09 18:14 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 0 siblings, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-11-09 18:11 UTC (permalink / raw) To: x86, linux-kernel Hi, This is a re-send of an earlier patch series that got side-tracked. I'd like to get this into the kernel in some form, so I'd like to try submission again, as I think it is important. Intel CPUs have an additional MSR bit to indicate if the BIOS was configured to disable NX. This bit was traditionally used for operating systems that did not understand how to handle the NX bit. Since Linux understands this, this BIOS flag should be ignored by default. In a review[1] of reported hardware being used by Ubuntu bug reporters, almost 10% of systems had an incorrectly configured BIOS, leaving their systems unable to use the NX features of their CPU. This change will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX cannot be inappropriately controlled by the BIOS on Intel CPUs. If, under very strange hardware configurations, NX actually needs to be disabled, "noexec=off" can be used to restore the prior behavior. Based on feedback from HPA, this was reworked to extend the existing "verify_cpu" routines, and to more tightly confine which CPUs will call MSR_IA32_MISC_ENABLE. Since it includes some re-arrangements of files, I tried to break the patches up into their logical steps. -Kees [1] http://www.outflux.net/blog/archives/2010/02/18/data-mining-for-nx-bit/ -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 18:11 [Security] [PATCH v3 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook @ 2010-11-09 18:14 ` Kees Cook 2010-11-09 18:46 ` Pekka Enberg 0 siblings, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-11-09 18:14 UTC (permalink / raw) To: x86, linux-kernel This file does not need the _64 extension since the code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook <kees.cook@canonical.com> --- arch/x86/boot/compressed/head_64.S | 2 +- arch/x86/kernel/trampoline_64.S | 2 +- arch/x86/kernel/verify_cpu.S | 106 ++++++++++++++++++++++++++++++++++++ arch/x86/kernel/verify_cpu_64.S | 106 ------------------------------------ 4 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 arch/x86/kernel/verify_cpu.S delete mode 100644 arch/x86/kernel/verify_cpu_64.S diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 52f85a1..35af09d 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -182,7 +182,7 @@ no_longmode: hlt jmp 1b -#include "../../kernel/verify_cpu_64.S" +#include "../../kernel/verify_cpu.S" /* * Be careful here startup_64 needs to be at a predictable diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 3af2dff..075d130 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S @@ -127,7 +127,7 @@ startup_64: no_longmode: hlt jmp no_longmode -#include "verify_cpu_64.S" +#include "verify_cpu.S" # Careful these need to be in the same 64K segment as the above; tidt: diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S new file mode 100644 index 0000000..56a8c2a --- /dev/null +++ b/arch/x86/kernel/verify_cpu.S @@ -0,0 +1,106 @@ +/* + * + * verify_cpu.S - Code for cpu long mode and SSE verification. This + * code has been borrowed from boot/setup.S and was introduced by + * Andi Kleen. + * + * Copyright (c) 2007 Andi Kleen (ak@suse.de) + * Copyright (c) 2007 Eric Biederman (ebiederm@xmission.com) + * Copyright (c) 2007 Vivek Goyal (vgoyal@in.ibm.com) + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + * + * This is a common code for verification whether CPU supports + * long mode and SSE or not. It is not called directly instead this + * file is included at various places and compiled in that context. + * Following are the current usage. + * + * This file is included by both 16bit and 32bit code. + * + * arch/x86_64/boot/setup.S : Boot cpu verification (16bit) + * arch/x86_64/boot/compressed/head.S: Boot cpu verification (32bit) + * arch/x86_64/kernel/trampoline.S: secondary processor verfication (16bit) + * arch/x86_64/kernel/acpi/wakeup.S:Verfication at resume (16bit) + * + * verify_cpu, returns the status of cpu check in register %eax. + * 0: Success 1: Failure + * + * The caller needs to check for the error code and take the action + * appropriately. Either display a message or halt. + */ + +#include <asm/cpufeature.h> +#include <asm/msr-index.h> + +verify_cpu: + pushfl # Save caller passed flags + pushl $0 # Kill any dangerous flags + popfl + + pushfl # standard way to check for cpuid + popl %eax + movl %eax,%ebx + xorl $0x200000,%eax + pushl %eax + popfl + pushfl + popl %eax + cmpl %eax,%ebx + jz verify_cpu_no_longmode # cpu has no cpuid + + movl $0x0,%eax # See if cpuid 1 is implemented + cpuid + cmpl $0x1,%eax + jb verify_cpu_no_longmode # no cpuid 1 + + xor %di,%di + cmpl $0x68747541,%ebx # AuthenticAMD + jnz verify_cpu_noamd + cmpl $0x69746e65,%edx + jnz verify_cpu_noamd + cmpl $0x444d4163,%ecx + jnz verify_cpu_noamd + mov $1,%di # cpu is from AMD + +verify_cpu_noamd: + movl $0x1,%eax # Does the cpu have what it takes + cpuid + andl $REQUIRED_MASK0,%edx + xorl $REQUIRED_MASK0,%edx + jnz verify_cpu_no_longmode + + movl $0x80000000,%eax # See if extended cpuid is implemented + cpuid + cmpl $0x80000001,%eax + jb verify_cpu_no_longmode # no extended cpuid + + movl $0x80000001,%eax # Does the cpu have what it takes + cpuid + andl $REQUIRED_MASK1,%edx + xorl $REQUIRED_MASK1,%edx + jnz verify_cpu_no_longmode + +verify_cpu_sse_test: + movl $1,%eax + cpuid + andl $SSE_MASK,%edx + cmpl $SSE_MASK,%edx + je verify_cpu_sse_ok + test %di,%di + jz verify_cpu_no_longmode # only try to force SSE on AMD + movl $MSR_K7_HWCR,%ecx + rdmsr + btr $15,%eax # enable SSE + wrmsr + xor %di,%di # don't loop + jmp verify_cpu_sse_test # try again + +verify_cpu_no_longmode: + popfl # Restore caller passed flags + movl $1,%eax + ret +verify_cpu_sse_ok: + popfl # Restore caller passed flags + xorl %eax, %eax + ret diff --git a/arch/x86/kernel/verify_cpu_64.S b/arch/x86/kernel/verify_cpu_64.S deleted file mode 100644 index 56a8c2a..0000000 --- a/arch/x86/kernel/verify_cpu_64.S +++ /dev/null @@ -1,106 +0,0 @@ -/* - * - * verify_cpu.S - Code for cpu long mode and SSE verification. This - * code has been borrowed from boot/setup.S and was introduced by - * Andi Kleen. - * - * Copyright (c) 2007 Andi Kleen (ak@suse.de) - * Copyright (c) 2007 Eric Biederman (ebiederm@xmission.com) - * Copyright (c) 2007 Vivek Goyal (vgoyal@in.ibm.com) - * - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - * - * This is a common code for verification whether CPU supports - * long mode and SSE or not. It is not called directly instead this - * file is included at various places and compiled in that context. - * Following are the current usage. - * - * This file is included by both 16bit and 32bit code. - * - * arch/x86_64/boot/setup.S : Boot cpu verification (16bit) - * arch/x86_64/boot/compressed/head.S: Boot cpu verification (32bit) - * arch/x86_64/kernel/trampoline.S: secondary processor verfication (16bit) - * arch/x86_64/kernel/acpi/wakeup.S:Verfication at resume (16bit) - * - * verify_cpu, returns the status of cpu check in register %eax. - * 0: Success 1: Failure - * - * The caller needs to check for the error code and take the action - * appropriately. Either display a message or halt. - */ - -#include <asm/cpufeature.h> -#include <asm/msr-index.h> - -verify_cpu: - pushfl # Save caller passed flags - pushl $0 # Kill any dangerous flags - popfl - - pushfl # standard way to check for cpuid - popl %eax - movl %eax,%ebx - xorl $0x200000,%eax - pushl %eax - popfl - pushfl - popl %eax - cmpl %eax,%ebx - jz verify_cpu_no_longmode # cpu has no cpuid - - movl $0x0,%eax # See if cpuid 1 is implemented - cpuid - cmpl $0x1,%eax - jb verify_cpu_no_longmode # no cpuid 1 - - xor %di,%di - cmpl $0x68747541,%ebx # AuthenticAMD - jnz verify_cpu_noamd - cmpl $0x69746e65,%edx - jnz verify_cpu_noamd - cmpl $0x444d4163,%ecx - jnz verify_cpu_noamd - mov $1,%di # cpu is from AMD - -verify_cpu_noamd: - movl $0x1,%eax # Does the cpu have what it takes - cpuid - andl $REQUIRED_MASK0,%edx - xorl $REQUIRED_MASK0,%edx - jnz verify_cpu_no_longmode - - movl $0x80000000,%eax # See if extended cpuid is implemented - cpuid - cmpl $0x80000001,%eax - jb verify_cpu_no_longmode # no extended cpuid - - movl $0x80000001,%eax # Does the cpu have what it takes - cpuid - andl $REQUIRED_MASK1,%edx - xorl $REQUIRED_MASK1,%edx - jnz verify_cpu_no_longmode - -verify_cpu_sse_test: - movl $1,%eax - cpuid - andl $SSE_MASK,%edx - cmpl $SSE_MASK,%edx - je verify_cpu_sse_ok - test %di,%di - jz verify_cpu_no_longmode # only try to force SSE on AMD - movl $MSR_K7_HWCR,%ecx - rdmsr - btr $15,%eax # enable SSE - wrmsr - xor %di,%di # don't loop - jmp verify_cpu_sse_test # try again - -verify_cpu_no_longmode: - popfl # Restore caller passed flags - movl $1,%eax - ret -verify_cpu_sse_ok: - popfl # Restore caller passed flags - xorl %eax, %eax - ret -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 18:14 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook @ 2010-11-09 18:46 ` Pekka Enberg 2010-11-09 19:00 ` Kees Cook 2010-11-09 19:02 ` Kees Cook 0 siblings, 2 replies; 13+ messages in thread From: Pekka Enberg @ 2010-11-09 18:46 UTC (permalink / raw) To: Kees Cook; +Cc: x86, linux-kernel On Tue, Nov 9, 2010 at 8:14 PM, Kees Cook <kees.cook@canonical.com> wrote: > This file does not need the _64 extension since the code is 32bit already, > and can be used in 32bit routines. > > Signed-off-by: Kees Cook <kees.cook@canonical.com> > --- > arch/x86/boot/compressed/head_64.S | 2 +- > arch/x86/kernel/trampoline_64.S | 2 +- > arch/x86/kernel/verify_cpu.S | 106 ++++++++++++++++++++++++++++++++++++ > arch/x86/kernel/verify_cpu_64.S | 106 ------------------------------------ > 4 files changed, 108 insertions(+), 108 deletions(-) > create mode 100644 arch/x86/kernel/verify_cpu.S > delete mode 100644 arch/x86/kernel/verify_cpu_64.S Please use "git format-patch -M" to detect renames when preparing patches. ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 18:46 ` Pekka Enberg @ 2010-11-09 19:00 ` Kees Cook 2010-11-09 19:59 ` Pekka Enberg 2010-11-09 19:02 ` Kees Cook 1 sibling, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-11-09 19:00 UTC (permalink / raw) To: Pekka Enberg; +Cc: x86, linux-kernel The code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook <kees.cook@canonical.com> --- arch/x86/boot/compressed/head_64.S | 2 +- arch/x86/kernel/trampoline_64.S | 2 +- arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename arch/x86/kernel/{verify_cpu_64.S => verify_cpu.S} (100%) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 52f85a1..35af09d 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -182,7 +182,7 @@ no_longmode: hlt jmp 1b -#include "../../kernel/verify_cpu_64.S" +#include "../../kernel/verify_cpu.S" /* * Be careful here startup_64 needs to be at a predictable diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 3af2dff..075d130 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S @@ -127,7 +127,7 @@ startup_64: no_longmode: hlt jmp no_longmode -#include "verify_cpu_64.S" +#include "verify_cpu.S" # Careful these need to be in the same 64K segment as the above; tidt: diff --git a/arch/x86/kernel/verify_cpu_64.S b/arch/x86/kernel/verify_cpu.S similarity index 100% rename from arch/x86/kernel/verify_cpu_64.S rename to arch/x86/kernel/verify_cpu.S -- 1.7.2.3 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 19:00 ` Kees Cook @ 2010-11-09 19:59 ` Pekka Enberg 0 siblings, 0 replies; 13+ messages in thread From: Pekka Enberg @ 2010-11-09 19:59 UTC (permalink / raw) To: Kees Cook; +Cc: x86, linux-kernel On Tue, Nov 9, 2010 at 9:00 PM, Kees Cook <kees.cook@canonical.com> wrote: > The code is 32bit already, and can be used in 32bit routines. > > Signed-off-by: Kees Cook <kees.cook@canonical.com> Acked-by: Pekka Enberg <penberg@kernel.org> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 18:46 ` Pekka Enberg 2010-11-09 19:00 ` Kees Cook @ 2010-11-09 19:02 ` Kees Cook 2010-11-09 19:11 ` Pekka Enberg 1 sibling, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-11-09 19:02 UTC (permalink / raw) To: Pekka Enberg; +Cc: x86, linux-kernel Hi Pekka, On Tue, Nov 09, 2010 at 08:46:42PM +0200, Pekka Enberg wrote: > Please use "git format-patch -M" to detect renames when preparing patches. Thanks, I've resent. The proper use of format-patch should probably be covered in Documentation/SubmittingPatches.txt but I didn't really see a good place to put it. Is there a ~/.gitconfig stanza that can be added to default to using -M always? Thanks, -Kees -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-11-09 19:02 ` Kees Cook @ 2010-11-09 19:11 ` Pekka Enberg 0 siblings, 0 replies; 13+ messages in thread From: Pekka Enberg @ 2010-11-09 19:11 UTC (permalink / raw) To: Kees Cook; +Cc: x86, linux-kernel On Tue, Nov 9, 2010 at 9:02 PM, Kees Cook <kees.cook@canonical.com> wrote: > Is there a ~/.gitconfig stanza that can be added to default to using -M > always? IIRC, setting "diff.renames" to "true" makes format-patch use "-M" by default. ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 0/4] x86: clear XD_DISABLED flag on Intel to regain NX @ 2010-06-19 5:50 Kees Cook 2010-06-19 5:51 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 0 siblings, 1 reply; 13+ messages in thread From: Kees Cook @ 2010-06-19 5:50 UTC (permalink / raw) To: x86 Cc: H. Peter Anvin, Thomas Gleixner, Ingo Molnar, Alexander Potashev, Tim Abbott, Sam Ravnborg, Jan Beulich, Jeremy Fitzhardinge, linux-kernel This will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX cannot be inappropriately controlled by the BIOS on Intel CPUs. If NX actually needs to be disabled, "noexec=off" can be used. Based on feedback from HPA, this was reworked to extend the existing "verify_cpu" routines, and to more tightly confine which CPUs will call MSR_IA32_MISC_ENABLE. Since it includes some re-arrangements of files, I tried to break the patches up into their logical steps. -Kees -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S 2010-06-19 5:50 [PATCH v2 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook @ 2010-06-19 5:51 ` Kees Cook 0 siblings, 0 replies; 13+ messages in thread From: Kees Cook @ 2010-06-19 5:51 UTC (permalink / raw) To: x86 Cc: H. Peter Anvin, Thomas Gleixner, Ingo Molnar, Alexander Potashev, Tim Abbott, Sam Ravnborg, Jan Beulich, Jeremy Fitzhardinge, linux-kernel The code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook <kees.cook@canonical.com> --- arch/x86/boot/compressed/head_64.S | 2 +- arch/x86/kernel/trampoline_64.S | 2 +- arch/x86/kernel/verify_cpu.S | 105 ++++++++++++++++++++++++++++++++++++ arch/x86/kernel/verify_cpu_64.S | 105 ------------------------------------ 4 files changed, 107 insertions(+), 107 deletions(-) create mode 100644 arch/x86/kernel/verify_cpu.S delete mode 100644 arch/x86/kernel/verify_cpu_64.S diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index faff0dc..17f9620 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -182,7 +182,7 @@ no_longmode: hlt jmp 1b -#include "../../kernel/verify_cpu_64.S" +#include "../../kernel/verify_cpu.S" /* * Be careful here startup_64 needs to be at a predictable diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 3af2dff..075d130 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S @@ -127,7 +127,7 @@ startup_64: no_longmode: hlt jmp no_longmode -#include "verify_cpu_64.S" +#include "verify_cpu.S" # Careful these need to be in the same 64K segment as the above; tidt: diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S new file mode 100644 index 0000000..45b6f8a --- /dev/null +++ b/arch/x86/kernel/verify_cpu.S @@ -0,0 +1,105 @@ +/* + * + * verify_cpu.S - Code for cpu long mode and SSE verification. This + * code has been borrowed from boot/setup.S and was introduced by + * Andi Kleen. + * + * Copyright (c) 2007 Andi Kleen (ak@suse.de) + * Copyright (c) 2007 Eric Biederman (ebiederm@xmission.com) + * Copyright (c) 2007 Vivek Goyal (vgoyal@in.ibm.com) + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + * + * This is a common code for verification whether CPU supports + * long mode and SSE or not. It is not called directly instead this + * file is included at various places and compiled in that context. + * Following are the current usage. + * + * This file is included by both 16bit and 32bit code. + * + * arch/x86_64/boot/setup.S : Boot cpu verification (16bit) + * arch/x86_64/boot/compressed/head.S: Boot cpu verification (32bit) + * arch/x86_64/kernel/trampoline.S: secondary processor verfication (16bit) + * arch/x86_64/kernel/acpi/wakeup.S:Verfication at resume (16bit) + * + * verify_cpu, returns the status of cpu check in register %eax. + * 0: Success 1: Failure + * + * The caller needs to check for the error code and take the action + * appropriately. Either display a message or halt. + */ + +#include <asm/cpufeature.h> + +verify_cpu: + pushfl # Save caller passed flags + pushl $0 # Kill any dangerous flags + popfl + + pushfl # standard way to check for cpuid + popl %eax + movl %eax,%ebx + xorl $0x200000,%eax + pushl %eax + popfl + pushfl + popl %eax + cmpl %eax,%ebx + jz verify_cpu_no_longmode # cpu has no cpuid + + movl $0x0,%eax # See if cpuid 1 is implemented + cpuid + cmpl $0x1,%eax + jb verify_cpu_no_longmode # no cpuid 1 + + xor %di,%di + cmpl $0x68747541,%ebx # AuthenticAMD + jnz verify_cpu_noamd + cmpl $0x69746e65,%edx + jnz verify_cpu_noamd + cmpl $0x444d4163,%ecx + jnz verify_cpu_noamd + mov $1,%di # cpu is from AMD + +verify_cpu_noamd: + movl $0x1,%eax # Does the cpu have what it takes + cpuid + andl $REQUIRED_MASK0,%edx + xorl $REQUIRED_MASK0,%edx + jnz verify_cpu_no_longmode + + movl $0x80000000,%eax # See if extended cpuid is implemented + cpuid + cmpl $0x80000001,%eax + jb verify_cpu_no_longmode # no extended cpuid + + movl $0x80000001,%eax # Does the cpu have what it takes + cpuid + andl $REQUIRED_MASK1,%edx + xorl $REQUIRED_MASK1,%edx + jnz verify_cpu_no_longmode + +verify_cpu_sse_test: + movl $1,%eax + cpuid + andl $SSE_MASK,%edx + cmpl $SSE_MASK,%edx + je verify_cpu_sse_ok + test %di,%di + jz verify_cpu_no_longmode # only try to force SSE on AMD + movl $0xc0010015,%ecx # HWCR + rdmsr + btr $15,%eax # enable SSE + wrmsr + xor %di,%di # don't loop + jmp verify_cpu_sse_test # try again + +verify_cpu_no_longmode: + popfl # Restore caller passed flags + movl $1,%eax + ret +verify_cpu_sse_ok: + popfl # Restore caller passed flags + xorl %eax, %eax + ret diff --git a/arch/x86/kernel/verify_cpu_64.S b/arch/x86/kernel/verify_cpu_64.S deleted file mode 100644 index 45b6f8a..0000000 --- a/arch/x86/kernel/verify_cpu_64.S +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * verify_cpu.S - Code for cpu long mode and SSE verification. This - * code has been borrowed from boot/setup.S and was introduced by - * Andi Kleen. - * - * Copyright (c) 2007 Andi Kleen (ak@suse.de) - * Copyright (c) 2007 Eric Biederman (ebiederm@xmission.com) - * Copyright (c) 2007 Vivek Goyal (vgoyal@in.ibm.com) - * - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - * - * This is a common code for verification whether CPU supports - * long mode and SSE or not. It is not called directly instead this - * file is included at various places and compiled in that context. - * Following are the current usage. - * - * This file is included by both 16bit and 32bit code. - * - * arch/x86_64/boot/setup.S : Boot cpu verification (16bit) - * arch/x86_64/boot/compressed/head.S: Boot cpu verification (32bit) - * arch/x86_64/kernel/trampoline.S: secondary processor verfication (16bit) - * arch/x86_64/kernel/acpi/wakeup.S:Verfication at resume (16bit) - * - * verify_cpu, returns the status of cpu check in register %eax. - * 0: Success 1: Failure - * - * The caller needs to check for the error code and take the action - * appropriately. Either display a message or halt. - */ - -#include <asm/cpufeature.h> - -verify_cpu: - pushfl # Save caller passed flags - pushl $0 # Kill any dangerous flags - popfl - - pushfl # standard way to check for cpuid - popl %eax - movl %eax,%ebx - xorl $0x200000,%eax - pushl %eax - popfl - pushfl - popl %eax - cmpl %eax,%ebx - jz verify_cpu_no_longmode # cpu has no cpuid - - movl $0x0,%eax # See if cpuid 1 is implemented - cpuid - cmpl $0x1,%eax - jb verify_cpu_no_longmode # no cpuid 1 - - xor %di,%di - cmpl $0x68747541,%ebx # AuthenticAMD - jnz verify_cpu_noamd - cmpl $0x69746e65,%edx - jnz verify_cpu_noamd - cmpl $0x444d4163,%ecx - jnz verify_cpu_noamd - mov $1,%di # cpu is from AMD - -verify_cpu_noamd: - movl $0x1,%eax # Does the cpu have what it takes - cpuid - andl $REQUIRED_MASK0,%edx - xorl $REQUIRED_MASK0,%edx - jnz verify_cpu_no_longmode - - movl $0x80000000,%eax # See if extended cpuid is implemented - cpuid - cmpl $0x80000001,%eax - jb verify_cpu_no_longmode # no extended cpuid - - movl $0x80000001,%eax # Does the cpu have what it takes - cpuid - andl $REQUIRED_MASK1,%edx - xorl $REQUIRED_MASK1,%edx - jnz verify_cpu_no_longmode - -verify_cpu_sse_test: - movl $1,%eax - cpuid - andl $SSE_MASK,%edx - cmpl $SSE_MASK,%edx - je verify_cpu_sse_ok - test %di,%di - jz verify_cpu_no_longmode # only try to force SSE on AMD - movl $0xc0010015,%ecx # HWCR - rdmsr - btr $15,%eax # enable SSE - wrmsr - xor %di,%di # don't loop - jmp verify_cpu_sse_test # try again - -verify_cpu_no_longmode: - popfl # Restore caller passed flags - movl $1,%eax - ret -verify_cpu_sse_ok: - popfl # Restore caller passed flags - xorl %eax, %eax - ret -- 1.7.1 -- Kees Cook Ubuntu Security Team ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2010-11-10 18:37 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-11-09 22:17 [Security] [PATCH v4 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-09 22:17 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 2010-11-09 22:18 ` [PATCH 2/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-09 22:18 ` [PATCH 3/4] x86: call verify_cpu during 32bit CPU startup Kees Cook 2010-11-09 22:19 ` [PATCH 4/4] x86: only CPU features determine NX capabilities Kees Cook -- strict thread matches above, loose matches on Subject: below -- 2010-11-10 18:35 [Security] [PATCH v5 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-10 18:35 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 2010-11-09 18:11 [Security] [PATCH v3 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-11-09 18:14 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook 2010-11-09 18:46 ` Pekka Enberg 2010-11-09 19:00 ` Kees Cook 2010-11-09 19:59 ` Pekka Enberg 2010-11-09 19:02 ` Kees Cook 2010-11-09 19:11 ` Pekka Enberg 2010-06-19 5:50 [PATCH v2 0/4] x86: clear XD_DISABLED flag on Intel to regain NX Kees Cook 2010-06-19 5:51 ` [PATCH 1/4] x86: rename verify_cpu_64.S to verify_cpu.S Kees Cook
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®