-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/cpu: Add a "tsx=" cmdline option with TSX disabled by default
Add a kernel cmdline parameter "tsx" to control the Transactional Synchronization Extensions (TSX) feature. On CPUs that support TSX control, use "tsx=on|off" to enable or disable TSX. Not specifying this option is equivalent to "tsx=off". This is because on certain processors TSX may be used as a part of a speculative side channel attack. Carve out the TSX controlling functionality into a separate compilation unit because TSX is a CPU feature while the TSX async abort control machinery will go to cpu/bugs.c. [ bp: - Massage, shorten and clear the arg buffer. - Clarifications of the tsx= possible options - Josh. - Expand on TSX_CTRL availability - Pawan. ] Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
- Loading branch information
Pawan Gupta
authored and
Thomas Gleixner
committed
Oct 28, 2019
1 parent
286836a
commit 95c5824
Showing
6 changed files
with
175 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Intel Transactional Synchronization Extensions (TSX) control. | ||
* | ||
* Copyright (C) 2019 Intel Corporation | ||
* | ||
* Author: | ||
* Pawan Gupta <pawan.kumar.gupta@linux.intel.com> | ||
*/ | ||
|
||
#include <linux/cpufeature.h> | ||
|
||
#include <asm/cmdline.h> | ||
|
||
#include "cpu.h" | ||
|
||
enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED; | ||
|
||
void tsx_disable(void) | ||
{ | ||
u64 tsx; | ||
|
||
rdmsrl(MSR_IA32_TSX_CTRL, tsx); | ||
|
||
/* Force all transactions to immediately abort */ | ||
tsx |= TSX_CTRL_RTM_DISABLE; | ||
|
||
/* | ||
* Ensure TSX support is not enumerated in CPUID. | ||
* This is visible to userspace and will ensure they | ||
* do not waste resources trying TSX transactions that | ||
* will always abort. | ||
*/ | ||
tsx |= TSX_CTRL_CPUID_CLEAR; | ||
|
||
wrmsrl(MSR_IA32_TSX_CTRL, tsx); | ||
} | ||
|
||
void tsx_enable(void) | ||
{ | ||
u64 tsx; | ||
|
||
rdmsrl(MSR_IA32_TSX_CTRL, tsx); | ||
|
||
/* Enable the RTM feature in the cpu */ | ||
tsx &= ~TSX_CTRL_RTM_DISABLE; | ||
|
||
/* | ||
* Ensure TSX support is enumerated in CPUID. | ||
* This is visible to userspace and will ensure they | ||
* can enumerate and use the TSX feature. | ||
*/ | ||
tsx &= ~TSX_CTRL_CPUID_CLEAR; | ||
|
||
wrmsrl(MSR_IA32_TSX_CTRL, tsx); | ||
} | ||
|
||
static bool __init tsx_ctrl_is_supported(void) | ||
{ | ||
u64 ia32_cap = x86_read_arch_cap_msr(); | ||
|
||
/* | ||
* TSX is controlled via MSR_IA32_TSX_CTRL. However, support for this | ||
* MSR is enumerated by ARCH_CAP_TSX_MSR bit in MSR_IA32_ARCH_CAPABILITIES. | ||
* | ||
* TSX control (aka MSR_IA32_TSX_CTRL) is only available after a | ||
* microcode update on CPUs that have their MSR_IA32_ARCH_CAPABILITIES | ||
* bit MDS_NO=1. CPUs with MDS_NO=0 are not planned to get | ||
* MSR_IA32_TSX_CTRL support even after a microcode update. Thus, | ||
* tsx= cmdline requests will do nothing on CPUs without | ||
* MSR_IA32_TSX_CTRL support. | ||
*/ | ||
return !!(ia32_cap & ARCH_CAP_TSX_CTRL_MSR); | ||
} | ||
|
||
void __init tsx_init(void) | ||
{ | ||
char arg[4] = {}; | ||
int ret; | ||
|
||
if (!tsx_ctrl_is_supported()) | ||
return; | ||
|
||
ret = cmdline_find_option(boot_command_line, "tsx", arg, sizeof(arg)); | ||
if (ret >= 0) { | ||
if (!strcmp(arg, "on")) { | ||
tsx_ctrl_state = TSX_CTRL_ENABLE; | ||
} else if (!strcmp(arg, "off")) { | ||
tsx_ctrl_state = TSX_CTRL_DISABLE; | ||
} else { | ||
tsx_ctrl_state = TSX_CTRL_DISABLE; | ||
pr_err("tsx: invalid option, defaulting to off\n"); | ||
} | ||
} else { | ||
/* tsx= not provided, defaulting to off */ | ||
tsx_ctrl_state = TSX_CTRL_DISABLE; | ||
} | ||
|
||
if (tsx_ctrl_state == TSX_CTRL_DISABLE) { | ||
tsx_disable(); | ||
|
||
/* | ||
* tsx_disable() will change the state of the | ||
* RTM CPUID bit. Clear it here since it is now | ||
* expected to be not set. | ||
*/ | ||
setup_clear_cpu_cap(X86_FEATURE_RTM); | ||
} else if (tsx_ctrl_state == TSX_CTRL_ENABLE) { | ||
|
||
/* | ||
* HW defaults TSX to be enabled at bootup. | ||
* We may still need the TSX enable support | ||
* during init for special cases like | ||
* kexec after TSX is disabled. | ||
*/ | ||
tsx_enable(); | ||
|
||
/* | ||
* tsx_enable() will change the state of the | ||
* RTM CPUID bit. Force it here since it is now | ||
* expected to be set. | ||
*/ | ||
setup_force_cpu_cap(X86_FEATURE_RTM); | ||
} | ||
} |