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(&microcode_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(&microcode_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			= &microcode_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(&microcode_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(&microcode_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(&microcode_mutex);