Patch "x86/microcode: Untangle from BLK_DEV_INITRD" has been added to the 4.5-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
x86/microcode: Untangle from BLK_DEV_INITRD
to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-microcode-untangle-from-blk_dev_initrd.patch
and it can be found in the queue-4.5 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
5f9c01aa7c49a2d74474d6d879a797b8badf29e6Mon Sep 17 00:00:00 2001
From: Borislav Petkov <[email protected]>
Date: Wed, 3 Feb 2016 12:33:29 +0100
Subject: x86/microcode: Untangle from BLK_DEV_INITRD
From: Borislav Petkov <[email protected]>
commit 5f9c01aa7c49a2d74474d6d879a797b8badf29e6 upstream.
Thomas Voegtle reported that doing oldconfig with a .config which has CONFIG_MICROCODE enabled but BLK_DEV_INITRD disabled prevents the microcode loading mechanism from being built.
So untangle it from the BLK_DEV_INITRD dependency so that oldconfig doesn't turn it off and add an explanatory text to its Kconfig help what the supported methods for supplying microcode are.
--- arch/x86/Kconfig | 23 ++++++++++++----------- arch/x86/include/asm/microcode.h | 26 ++++++++++++++++++++++++++ arch/x86/kernel/cpu/microcode/intel.c | 14 ++++---------- 3 files changed, 42 insertions(+), 21 deletions(-)
arch/x86/Kconfig +12 -11
@@ -1160,22 +1160,23 @@ config MICROCODE bool "CPU microcode loading support" default y depends on CPU_SUP_AMD || CPU_SUP_INTEL - depends on BLK_DEV_INITRD select FW_LOADER ---help--- - If you say Y here, you will be able to update the microcode on - certain Intel and AMD processors. The Intel support is for the - IA32 family, e.g. Pentium Pro, Pentium II, Pentium III, Pentium 4, - Xeon etc. The AMD support is for families 0x10 and later. You will - obviously need the actual microcode binary data itself which is not - shipped with the Linux kernel. + Intel and AMD processors. The Intel support is for the IA32 family, + e.g. Pentium Pro, Pentium II, Pentium III, Pentium 4, Xeon etc. The + AMD support is for families 0x10 and later. You will obviously need + the actual microcode binary data itself which is not shipped with + the Linux kernel. - This option selects the general module only, you need to select - at least one vendor specific module as well. + The preferred method to load microcode from a detached initrd is described + in Documentation/x86/early-microcode.txt. For that you need to enable + CONFIG_BLK_DEV_INITRD in order for the loader to be able to scan the + initrd for microcode blobs. - To compile this driver as a module, choose M here: the module - will be called microcode. + In addition, you can build-in the microcode into the kernel. For that you + need to enable FIRMWARE_IN_KERNEL and add the vendor-supplied microcode + to the CONFIG_EXTRA_FIRMWARE config option. config MICROCODE_INTEL bool "Intel microcode loading support"
arch/x86/include/asm/microcode.h +26 -0
@@ -3,6 +3,7 @@#include <asm/cpu.h> #include <linux/earlycpio.h> +#include <linux/initrd.h> #define native_rdmsr (msr, val1, val2) \ do { \
@@ -143,4 +144,29 @@ static inline void reload_early_microcodstatic inline bool get_builtin_firmware (struct cpio_data *cd,const char *name) {return false; }#endif + +static inline unsigned long get_initrd_start (void ) +{ +#ifdef CONFIG_BLK_DEV_INITRD +return initrd_start; +#else +return 0 ; +#endif +} + +static inline unsigned long get_initrd_start_addr (void ) +{ +#ifdef CONFIG_BLK_DEV_INITRD +#ifdef CONFIG_X86_32 +unsigned long *initrd_start_p = (unsigned long *)__pa_nodebug (&initrd_start); + +return (unsigned long )__pa_nodebug (*initrd_start_p); +#else +return get_initrd_start (); +#endif +#else /* CONFIG_BLK_DEV_INITRD */ +return 0 ; +#endif +} +#endif /* _ASM_X86_MICROCODE_H */
arch/x86/kernel/cpu/microcode/intel.c +4 -10
@@ -694,7 +694,7 @@ int __init save_microcode_in_initrd_inteif (count ==0 )return ret; -copy_initrd_ptrs (mc_saved, mc_saved_in_initrd, initrd_start, count); +copy_initrd_ptrs (mc_saved, mc_saved_in_initrd,get_initrd_start (), count); ret =save_microcode (&mc_saved_data, mc_saved, count);if (ret)pr_err ("Cannot save microcode patches from initrd.\n" );
@@ -756,20 +756,14 @@ void load_ucode_intel_ap(void)struct mc_saved_data *mc_saved_data_p;struct ucode_cpu_info uci;unsigned long *mc_saved_in_initrd_p; -unsigned long initrd_start_addr;enum ucode_state ret;#ifdef CONFIG_X86_32 -unsigned long *initrd_start_p; - mc_saved_in_initrd_p = - (unsigned long *)__pa_nodebug (mc_saved_in_initrd); + mc_saved_in_initrd_p = (unsigned long *)__pa_nodebug (mc_saved_in_initrd); mc_saved_data_p = (struct mc_saved_data *)__pa_nodebug (&mc_saved_data); - initrd_start_p = (unsigned long *)__pa_nodebug (&initrd_start); - initrd_start_addr = (unsigned long )__pa_nodebug (*initrd_start_p);#else - mc_saved_data_p = &mc_saved_data; mc_saved_in_initrd_p = mc_saved_in_initrd; - initrd_start_addr = initrd_start; + mc_saved_data_p = &mc_saved_data;#endif /*
@@ -781,7 +775,7 @@ void load_ucode_intel_ap(void)collect_cpu_info_early (&uci); ret =load_microcode (mc_saved_data_p, mc_saved_in_initrd_p, - initrd_start_addr, &uci); +get_initrd_start_addr (), &uci);if (ret !=UCODE_OK )return ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/x86-microcode-intel-make-early-loader-look-for-builtin-microcode-too.patch queue-4.5/edac-amd64_edac-shift-wrapping-issue-in-f1x_get_norm_dct_addr.patch queue-4.5/x86-microcode-untangle-from-blk_dev_initrd.patch