diff options
author | Borislav Petkov <bp@suse.de> | 2015-02-10 06:45:16 -0500 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2015-03-02 14:32:20 -0500 |
commit | 4f1f605cfe3046c4c9f07920c47d3f801d31c0ba (patch) | |
tree | 85430159355ea3610b39508801c6ee792455af4e | |
parent | 140f74fcedbfc862178c082c50b5f54dd52c1ce4 (diff) |
x86/microcode/intel: Check scan_microcode()'s retval
... and do not attempt to load anything in case of error.
Signed-off-by: Borislav Petkov <bp@suse.de>
-rw-r--r-- | arch/x86/kernel/cpu/microcode/intel_early.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c index 7bcad1aacce3..88a0348f455c 100644 --- a/arch/x86/kernel/cpu/microcode/intel_early.c +++ b/arch/x86/kernel/cpu/microcode/intel_early.c | |||
@@ -514,9 +514,9 @@ EXPORT_SYMBOL_GPL(save_mc_for_early); | |||
514 | 514 | ||
515 | static __initdata char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin"; | 515 | static __initdata char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin"; |
516 | static __init enum ucode_state | 516 | static __init enum ucode_state |
517 | scan_microcode(unsigned long start, unsigned long size, | 517 | scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd, |
518 | struct mc_saved_data *mc_saved_data, | 518 | unsigned long start, unsigned long size, |
519 | unsigned long *mc_saved_in_initrd, struct ucode_cpu_info *uci) | 519 | struct ucode_cpu_info *uci) |
520 | { | 520 | { |
521 | struct cpio_data cd; | 521 | struct cpio_data cd; |
522 | long offset = 0; | 522 | long offset = 0; |
@@ -534,8 +534,7 @@ scan_microcode(unsigned long start, unsigned long size, | |||
534 | return UCODE_ERROR; | 534 | return UCODE_ERROR; |
535 | 535 | ||
536 | return get_matching_model_microcode(0, start, cd.data, cd.size, | 536 | return get_matching_model_microcode(0, start, cd.data, cd.size, |
537 | mc_saved_data, mc_saved_in_initrd, | 537 | mc_saved_data, initrd, uci); |
538 | uci); | ||
539 | } | 538 | } |
540 | 539 | ||
541 | /* | 540 | /* |
@@ -679,16 +678,19 @@ int __init save_microcode_in_initrd_intel(void) | |||
679 | 678 | ||
680 | static void __init | 679 | static void __init |
681 | _load_ucode_intel_bsp(struct mc_saved_data *mc_saved_data, | 680 | _load_ucode_intel_bsp(struct mc_saved_data *mc_saved_data, |
682 | unsigned long *mc_saved_in_initrd, | 681 | unsigned long *initrd, |
683 | unsigned long start, unsigned long size) | 682 | unsigned long start, unsigned long size) |
684 | { | 683 | { |
685 | struct ucode_cpu_info uci; | 684 | struct ucode_cpu_info uci; |
686 | enum ucode_state ret; | 685 | enum ucode_state ret; |
687 | 686 | ||
688 | collect_cpu_info_early(&uci); | 687 | collect_cpu_info_early(&uci); |
689 | scan_microcode(start, size, mc_saved_data, mc_saved_in_initrd, &uci); | ||
690 | 688 | ||
691 | ret = load_microcode(mc_saved_data, mc_saved_in_initrd, start, &uci); | 689 | ret = scan_microcode(mc_saved_data, initrd, start, size, &uci); |
690 | if (ret != UCODE_OK) | ||
691 | return; | ||
692 | |||
693 | ret = load_microcode(mc_saved_data, initrd, start, &uci); | ||
692 | if (ret != UCODE_OK) | 694 | if (ret != UCODE_OK) |
693 | return; | 695 | return; |
694 | 696 | ||