From: Borislav Petkov <bp@alien8.de>
To: X86 ML <x86@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH 2/2] x86/microcode: Add a "microcode=" command line option
Date: Mon, 5 Jun 2023 16:13:32 +0200 [thread overview]
Message-ID: <20230605141332.25948-2-bp@alien8.de> (raw)
In-Reply-To: <20230605141332.25948-1-bp@alien8.de>
From: "Borislav Petkov (AMD)" <bp@alien8.de>
It will be used to control microcode loader behavior. Add the first
chicken bit: to control whether the AMD side should load microcode late
on all logical SMT threads.
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
---
.../admin-guide/kernel-parameters.txt | 7 +++
arch/x86/kernel/cpu/microcode/amd.c | 5 ++-
arch/x86/kernel/cpu/microcode/core.c | 44 +++++++++++++++++++
arch/x86/kernel/cpu/microcode/internal.h | 16 +++++++
4 files changed, 71 insertions(+), 1 deletion(-)
create mode 100644 arch/x86/kernel/cpu/microcode/internal.h
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 9e5bab29685f..b88ff022402c 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3228,6 +3228,13 @@
mga= [HW,DRM]
+ microcode= [X86] Control the behavior of the microcode
+ loader. Available options:
+
+ no_late_all - do not load on all SMT threads on
+ AMD. Loading on all logical threads is enabled by
+ default.
+
min_addr=nn[KMG] [KNL,BOOT,IA-64] All physical memory below this
physical address is ignored.
diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c
index 87208e46f7ed..76b530697951 100644
--- a/arch/x86/kernel/cpu/microcode/amd.c
+++ b/arch/x86/kernel/cpu/microcode/amd.c
@@ -36,6 +36,8 @@
#include <asm/cpu.h>
#include <asm/msr.h>
+#include "internal.h"
+
static struct equiv_cpu_table {
unsigned int num_entries;
struct equiv_cpu_entry *entry;
@@ -700,7 +702,8 @@ static enum ucode_state apply_microcode_amd(int cpu)
rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
/* need to apply patch? */
- if (rev > mc_amd->hdr.patch_id) {
+ if ((rev > mc_amd->hdr.patch_id) ||
+ (rev == mc_amd->hdr.patch_id && !(control & LATE_ALL_THREADS))) {
ret = UCODE_OK;
goto out;
}
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index 3afcf3de0dd4..5f3185d2814c 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -40,11 +40,15 @@
#include <asm/cmdline.h>
#include <asm/setup.h>
+#include "internal.h"
+
#define DRIVER_VERSION "2.2"
static struct microcode_ops *microcode_ops;
static bool dis_ucode_ldr = true;
+unsigned long control = LATE_ALL_THREADS;
+
bool initrd_gone;
LIST_HEAD(microcode_cache);
@@ -522,8 +526,32 @@ static ssize_t processor_flags_show(struct device *dev,
return sprintf(buf, "0x%x\n", uci->cpu_sig.pf);
}
+static ssize_t control_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "0x%lx\n", control);
+}
+
+static ssize_t control_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned long val;
+
+ if (kstrtoul(buf, 0, &val) < 0)
+ return -ERANGE;
+
+ if (val & CONTROL_FLAGS_MASK)
+ return -EINVAL;
+
+ control = val;
+
+ return count;
+}
+
static DEVICE_ATTR_RO(version);
static DEVICE_ATTR_RO(processor_flags);
+static DEVICE_ATTR_ADMIN_RW(control);
static struct attribute *mc_default_attrs[] = {
&dev_attr_version.attr,
@@ -622,6 +650,7 @@ static struct attribute *cpu_root_microcode_attrs[] = {
#ifdef CONFIG_MICROCODE_LATE_LOADING
&dev_attr_reload.attr,
#endif
+ &dev_attr_control.attr,
NULL
};
@@ -683,3 +712,18 @@ static int __init microcode_init(void)
}
fs_initcall(save_microcode_in_initrd);
late_initcall(microcode_init);
+
+static int __init parse_cmdline_param(char *str)
+{
+ if (!str)
+ return 0;
+
+ if (*str == '=')
+ str++;
+
+ if (!strcmp(str, "no_late_all"))
+ control &= ~LATE_ALL_THREADS;
+
+ return 1;
+}
+__setup("microcode", parse_cmdline_param);
diff --git a/arch/x86/kernel/cpu/microcode/internal.h b/arch/x86/kernel/cpu/microcode/internal.h
new file mode 100644
index 000000000000..5e3c5fc3851f
--- /dev/null
+++ b/arch/x86/kernel/cpu/microcode/internal.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __X86_MICROCODE_INTERNAL_H__
+#define __X86_MICROCODE_INTERNAL_H__
+
+extern unsigned long control;
+
+/* Loader control flags. */
+enum control_flags {
+ __LATE_ALL_THREADS = 0,
+ __CONTROL_FLAGS_NUM,
+};
+
+#define LATE_ALL_THREADS BIT_ULL(__LATE_ALL_THREADS)
+#define CONTROL_FLAGS_MASK ~(BIT_ULL(__CONTROL_FLAGS_NUM) - 1)
+
+#endif /* __X86_MICROCODE_INTERNAL_H__ */
--
2.35.1
next prev parent reply other threads:[~2023-06-05 14:15 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-05 14:13 [PATCH 1/2] x86/microcode/AMD: Load late on both threads too Borislav Petkov
2023-06-05 14:13 ` Borislav Petkov [this message]
2023-06-08 1:55 ` [PATCH 2/2] x86/microcode: Add a "microcode=" command line option Ashok Raj
2023-06-09 12:28 ` Borislav Petkov
2023-06-09 15:37 ` Ashok Raj
2023-06-12 9:06 ` Borislav Petkov
2023-06-12 9:20 ` [tip: x86/microcode] " tip-bot2 for Borislav Petkov (AMD)
2023-06-12 15:26 ` [PATCH 2/2] " Thomas Gleixner
2023-06-12 15:42 ` Borislav Petkov
2023-06-12 16:04 ` Borislav Petkov
2023-06-12 17:23 ` Thomas Gleixner
2023-06-13 8:32 ` Borislav Petkov
2023-06-07 19:36 ` [PATCH 1/2] x86/microcode/AMD: Load late on both threads too Dave Hansen
2023-06-07 20:03 ` Borislav Petkov
2023-06-07 20:15 ` Dave Hansen
2023-08-16 20:17 ` Jim Mattson
2023-08-16 21:18 ` Borislav Petkov
2023-08-16 21:23 ` Jim Mattson
2023-08-16 21:30 ` Borislav Petkov
2023-08-16 21:36 ` Jim Mattson
2023-08-16 21:58 ` Borislav Petkov
2023-08-16 22:37 ` Jim Mattson
2023-08-17 15:40 ` Borislav Petkov
2023-08-17 18:02 ` Peter Shier
2023-08-18 8:43 ` Borislav Petkov
2023-06-12 9:20 ` [tip: x86/microcode] " tip-bot2 for Borislav Petkov (AMD)
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=20230605141332.25948-2-bp@alien8.de \
--to=bp@alien8.de \
--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.