| From 264285ac01673e70557c43ecee338ce97c4c0672 Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@suse.de> |
| Date: Wed, 3 Feb 2016 12:33:30 +0100 |
| Subject: x86/microcode/intel: Make early loader look for builtin microcode too |
| |
| From: Borislav Petkov <bp@suse.de> |
| |
| commit 264285ac01673e70557c43ecee338ce97c4c0672 upstream. |
| |
| 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: 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/cpu/microcode/intel.c | 24 ++++++++++++++++-------- |
| 1 file changed, 16 insertions(+), 8 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/intel.c |
| +++ b/arch/x86/kernel/cpu/microcode/intel.c |
| @@ -555,10 +555,14 @@ scan_microcode(struct mc_saved_data *mc_ |
| cd.data = NULL; |
| cd.size = 0; |
| |
| - cd = find_cpio_data(p, (void *)start, size, &offset); |
| - if (!cd.data) { |
| + /* try built-in microcode if no initrd */ |
| + if (!size) { |
| if (!load_builtin_intel_microcode(&cd)) |
| return UCODE_ERROR; |
| + } else { |
| + cd = find_cpio_data(p, (void *)start, size, &offset); |
| + if (!cd.data) |
| + return UCODE_ERROR; |
| } |
| |
| return get_matching_model_microcode(0, start, cd.data, cd.size, |
| @@ -732,16 +736,20 @@ void __init load_ucode_intel_bsp(void) |
| struct boot_params *p; |
| |
| p = (struct boot_params *)__pa_nodebug(&boot_params); |
| - start = p->hdr.ramdisk_image; |
| size = p->hdr.ramdisk_size; |
| |
| - _load_ucode_intel_bsp( |
| - (struct mc_saved_data *)__pa_nodebug(&mc_saved_data), |
| - (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), |
| - start, size); |
| + /* |
| + * Set start only if we have an initrd image. We cannot use initrd_start |
| + * because it is not set that early yet. |
| + */ |
| + start = (size ? p->hdr.ramdisk_image : 0); |
| + |
| + _load_ucode_intel_bsp((struct mc_saved_data *)__pa_nodebug(&mc_saved_data), |
| + (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), |
| + start, size); |
| #else |
| - start = boot_params.hdr.ramdisk_image + PAGE_OFFSET; |
| size = boot_params.hdr.ramdisk_size; |
| + start = (size ? boot_params.hdr.ramdisk_image + PAGE_OFFSET : 0); |
| |
| _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, start, size); |
| #endif |