aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/microcode
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2016-02-03 06:33:30 -0500
committerIngo Molnar <mingo@kernel.org>2016-02-09 05:41:15 -0500
commit264285ac01673e70557c43ecee338ce97c4c0672 (patch)
tree9ea6f467a23c63611e279caff4f641082ed90e5b /arch/x86/kernel/cpu/microcode
parent5f9c01aa7c49a2d74474d6d879a797b8badf29e6 (diff)
x86/microcode/intel: Make early loader look for builtin microcode too
Set the initrd @start depending on the presence of an initrd. Otherwise, builtin microcode loading doesn't work as the start is wrong and we're using it to compute offset to the microcode blobs. Tested-by: Thomas Voegtle <tv@lio96.de> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: <stable@vger.kernel.org> # 4.4 Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1454499225-21544-3-git-send-email-bp@alien8.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel/cpu/microcode')
-rw-r--r--arch/x86/kernel/cpu/microcode/intel.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index 044bbbbcbaf1..4f4735bd8698 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -551,10 +551,14 @@ scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd,
551 cd.data = NULL; 551 cd.data = NULL;
552 cd.size = 0; 552 cd.size = 0;
553 553
554 cd = find_cpio_data(p, (void *)start, size, &offset); 554 /* try built-in microcode if no initrd */
555 if (!cd.data) { 555 if (!size) {
556 if (!load_builtin_intel_microcode(&cd)) 556 if (!load_builtin_intel_microcode(&cd))
557 return UCODE_ERROR; 557 return UCODE_ERROR;
558 } else {
559 cd = find_cpio_data(p, (void *)start, size, &offset);
560 if (!cd.data)
561 return UCODE_ERROR;
558 } 562 }
559 563
560 return get_matching_model_microcode(0, start, cd.data, cd.size, 564 return get_matching_model_microcode(0, start, cd.data, cd.size,
@@ -728,16 +732,20 @@ void __init load_ucode_intel_bsp(void)
728 struct boot_params *p; 732 struct boot_params *p;
729 733
730 p = (struct boot_params *)__pa_nodebug(&boot_params); 734 p = (struct boot_params *)__pa_nodebug(&boot_params);
731 start = p->hdr.ramdisk_image;
732 size = p->hdr.ramdisk_size; 735 size = p->hdr.ramdisk_size;
733 736
734 _load_ucode_intel_bsp( 737 /*
735 (struct mc_saved_data *)__pa_nodebug(&mc_saved_data), 738 * Set start only if we have an initrd image. We cannot use initrd_start
736 (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), 739 * because it is not set that early yet.
737 start, size); 740 */
741 start = (size ? p->hdr.ramdisk_image : 0);
742
743 _load_ucode_intel_bsp((struct mc_saved_data *)__pa_nodebug(&mc_saved_data),
744 (unsigned long *)__pa_nodebug(&mc_saved_in_initrd),
745 start, size);
738#else 746#else
739 start = boot_params.hdr.ramdisk_image + PAGE_OFFSET;
740 size = boot_params.hdr.ramdisk_size; 747 size = boot_params.hdr.ramdisk_size;
748 start = (size ? boot_params.hdr.ramdisk_image + PAGE_OFFSET : 0);
741 749
742 _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, start, size); 750 _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, start, size);
743#endif 751#endif