forked from microsoft/WSL2-Linux-Kernel
-
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
commit 95c5824 upstream. 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 <[email protected]> Signed-off-by: Borislav Petkov <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Josh Poimboeuf <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
- Loading branch information
Showing
6 changed files
with
174 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 <[email protected]> | ||
*/ | ||
|
||
#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); | ||
} | ||
} |