|
Jiri Slaby |
cd8b98 |
From: Borislav Petkov <bp@suse.de>
|
|
Jiri Slaby |
cd8b98 |
Date: Wed, 25 May 2022 18:12:29 +0200
|
|
Jiri Slaby |
cd8b98 |
Subject: x86/microcode: Rip out the OLD_INTERFACE
|
|
Jiri Slaby |
cd8b98 |
Git-commit: 181b6f40e9ea80c76756d4d0cdeed396016c487e
|
|
Jiri Slaby |
cd8b98 |
Patch-mainline: 5.19-rc1
|
|
Jiri Slaby |
cd8b98 |
References: jsc#PED-1072
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
Everything should be using the early initrd loading by now.
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Jiri Slaby |
cd8b98 |
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Jiri Slaby |
cd8b98 |
Link: https://lore.kernel.org/r/20220525161232.14924-2-bp@alien8.de
|
|
Jiri Slaby |
cd8b98 |
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
|
Jiri Slaby |
cd8b98 |
---
|
|
Jiri Slaby |
cd8b98 |
arch/x86/Kconfig | 12 ----
|
|
Jiri Slaby |
cd8b98 |
arch/x86/kernel/cpu/microcode/core.c | 100 -----------------------------------
|
|
Jiri Slaby |
cd8b98 |
2 files changed, 112 deletions(-)
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
--- a/arch/x86/Kconfig
|
|
Jiri Slaby |
cd8b98 |
+++ b/arch/x86/Kconfig
|
|
Jiri Slaby |
cd8b98 |
@@ -1367,18 +1367,6 @@ config MICROCODE_AMD
|
|
Jiri Slaby |
cd8b98 |
If you select this option, microcode patch loading support for AMD
|
|
Jiri Slaby |
cd8b98 |
processors will be enabled.
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
-config MICROCODE_OLD_INTERFACE
|
|
Jiri Slaby |
cd8b98 |
- bool "Ancient loading interface (DEPRECATED)"
|
|
Jiri Slaby |
cd8b98 |
- default n
|
|
Jiri Slaby |
cd8b98 |
- depends on MICROCODE
|
|
Jiri Slaby |
cd8b98 |
- help
|
|
Jiri Slaby |
cd8b98 |
- DO NOT USE THIS! This is the ancient /dev/cpu/microcode interface
|
|
Jiri Slaby |
cd8b98 |
- which was used by userspace tools like iucode_tool and microcode.ctl.
|
|
Jiri Slaby |
cd8b98 |
- It is inadequate because it runs too late to be able to properly
|
|
Jiri Slaby |
cd8b98 |
- load microcode on a machine and it needs special tools. Instead, you
|
|
Jiri Slaby |
cd8b98 |
- should've switched to the early loading method with the initrd or
|
|
Jiri Slaby |
cd8b98 |
- builtin microcode by now: Documentation/x86/microcode.rst
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
config X86_MSR
|
|
Jiri Slaby |
cd8b98 |
tristate "/dev/cpu/*/msr - Model-specific register support"
|
|
Jiri Slaby |
cd8b98 |
help
|
|
Jiri Slaby |
cd8b98 |
--- a/arch/x86/kernel/cpu/microcode/core.c
|
|
Jiri Slaby |
cd8b98 |
+++ b/arch/x86/kernel/cpu/microcode/core.c
|
|
Jiri Slaby |
cd8b98 |
@@ -390,98 +390,6 @@ static int apply_microcode_on_target(int
|
|
Jiri Slaby |
cd8b98 |
return ret;
|
|
Jiri Slaby |
cd8b98 |
}
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
-#ifdef CONFIG_MICROCODE_OLD_INTERFACE
|
|
Jiri Slaby |
cd8b98 |
-static int do_microcode_update(const void __user *buf, size_t size)
|
|
Jiri Slaby |
cd8b98 |
-{
|
|
Jiri Slaby |
cd8b98 |
- int error = 0;
|
|
Jiri Slaby |
cd8b98 |
- int cpu;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- for_each_online_cpu(cpu) {
|
|
Jiri Slaby |
cd8b98 |
- struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
|
|
Jiri Slaby |
cd8b98 |
- enum ucode_state ustate;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- if (!uci->valid)
|
|
Jiri Slaby |
cd8b98 |
- continue;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- ustate = microcode_ops->request_microcode_user(cpu, buf, size);
|
|
Jiri Slaby |
cd8b98 |
- if (ustate == UCODE_ERROR) {
|
|
Jiri Slaby |
cd8b98 |
- error = -1;
|
|
Jiri Slaby |
cd8b98 |
- break;
|
|
Jiri Slaby |
cd8b98 |
- } else if (ustate == UCODE_NEW) {
|
|
Jiri Slaby |
cd8b98 |
- apply_microcode_on_target(cpu);
|
|
Jiri Slaby |
cd8b98 |
- }
|
|
Jiri Slaby |
cd8b98 |
- }
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- return error;
|
|
Jiri Slaby |
cd8b98 |
-}
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static int microcode_open(struct inode *inode, struct file *file)
|
|
Jiri Slaby |
cd8b98 |
-{
|
|
Jiri Slaby |
cd8b98 |
- return capable(CAP_SYS_RAWIO) ? stream_open(inode, file) : -EPERM;
|
|
Jiri Slaby |
cd8b98 |
-}
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static ssize_t microcode_write(struct file *file, const char __user *buf,
|
|
Jiri Slaby |
cd8b98 |
- size_t len, loff_t *ppos)
|
|
Jiri Slaby |
cd8b98 |
-{
|
|
Jiri Slaby |
cd8b98 |
- ssize_t ret = -EINVAL;
|
|
Jiri Slaby |
cd8b98 |
- unsigned long nr_pages = totalram_pages();
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- if ((len >> PAGE_SHIFT) > nr_pages) {
|
|
Jiri Slaby |
cd8b98 |
- pr_err("too much data (max %ld pages)\n", nr_pages);
|
|
Jiri Slaby |
cd8b98 |
- return ret;
|
|
Jiri Slaby |
cd8b98 |
- }
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- cpus_read_lock();
|
|
Jiri Slaby |
cd8b98 |
- mutex_lock(µcode_mutex);
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- if (do_microcode_update(buf, len) == 0)
|
|
Jiri Slaby |
cd8b98 |
- ret = (ssize_t)len;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- if (ret > 0)
|
|
Jiri Slaby |
cd8b98 |
- perf_check_microcode();
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- mutex_unlock(µcode_mutex);
|
|
Jiri Slaby |
cd8b98 |
- cpus_read_unlock();
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- return ret;
|
|
Jiri Slaby |
cd8b98 |
-}
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static const struct file_operations microcode_fops = {
|
|
Jiri Slaby |
cd8b98 |
- .owner = THIS_MODULE,
|
|
Jiri Slaby |
cd8b98 |
- .write = microcode_write,
|
|
Jiri Slaby |
cd8b98 |
- .open = microcode_open,
|
|
Jiri Slaby |
cd8b98 |
- .llseek = no_llseek,
|
|
Jiri Slaby |
cd8b98 |
-};
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static struct miscdevice microcode_dev = {
|
|
Jiri Slaby |
cd8b98 |
- .minor = MICROCODE_MINOR,
|
|
Jiri Slaby |
cd8b98 |
- .name = "microcode",
|
|
Jiri Slaby |
cd8b98 |
- .nodename = "cpu/microcode",
|
|
Jiri Slaby |
cd8b98 |
- .fops = µcode_fops,
|
|
Jiri Slaby |
cd8b98 |
-};
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static int __init microcode_dev_init(void)
|
|
Jiri Slaby |
cd8b98 |
-{
|
|
Jiri Slaby |
cd8b98 |
- int error;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- error = misc_register(µcode_dev);
|
|
Jiri Slaby |
cd8b98 |
- if (error) {
|
|
Jiri Slaby |
cd8b98 |
- pr_err("can't misc_register on minor=%d\n", MICROCODE_MINOR);
|
|
Jiri Slaby |
cd8b98 |
- return error;
|
|
Jiri Slaby |
cd8b98 |
- }
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
- return 0;
|
|
Jiri Slaby |
cd8b98 |
-}
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
-static void __exit microcode_dev_exit(void)
|
|
Jiri Slaby |
cd8b98 |
-{
|
|
Jiri Slaby |
cd8b98 |
- misc_deregister(µcode_dev);
|
|
Jiri Slaby |
cd8b98 |
-}
|
|
Jiri Slaby |
cd8b98 |
-#else
|
|
Jiri Slaby |
cd8b98 |
-#define microcode_dev_init() 0
|
|
Jiri Slaby |
cd8b98 |
-#define microcode_dev_exit() do { } while (0)
|
|
Jiri Slaby |
cd8b98 |
-#endif
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
/* fake device for request_firmware */
|
|
Jiri Slaby |
cd8b98 |
static struct platform_device *microcode_pdev;
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
@@ -873,10 +781,6 @@ static int __init microcode_init(void)
|
|
Jiri Slaby |
cd8b98 |
goto out_driver;
|
|
Jiri Slaby |
cd8b98 |
}
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
- error = microcode_dev_init();
|
|
Jiri Slaby |
cd8b98 |
- if (error)
|
|
Jiri Slaby |
cd8b98 |
- goto out_ucode_group;
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
register_syscore_ops(&mc_syscore_ops);
|
|
Jiri Slaby |
cd8b98 |
cpuhp_setup_state_nocalls(CPUHP_AP_MICROCODE_LOADER, "x86/microcode:starting",
|
|
Jiri Slaby |
cd8b98 |
mc_cpu_starting, NULL);
|
|
Jiri Slaby |
cd8b98 |
@@ -887,10 +791,6 @@ static int __init microcode_init(void)
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
return 0;
|
|
Jiri Slaby |
cd8b98 |
|
|
Jiri Slaby |
cd8b98 |
- out_ucode_group:
|
|
Jiri Slaby |
cd8b98 |
- sysfs_remove_group(&cpu_subsys.dev_root->kobj,
|
|
Jiri Slaby |
cd8b98 |
- &cpu_root_microcode_group);
|
|
Jiri Slaby |
cd8b98 |
-
|
|
Jiri Slaby |
cd8b98 |
out_driver:
|
|
Jiri Slaby |
cd8b98 |
cpus_read_lock();
|
|
Jiri Slaby |
cd8b98 |
mutex_lock(µcode_mutex);
|