diff options
Diffstat (limited to 'arch/x86/kernel/cpu/microcode')
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/intel_early.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c index 844c75895160..7bcad1aacce3 100644 --- a/arch/x86/kernel/cpu/microcode/intel_early.c +++ b/arch/x86/kernel/cpu/microcode/intel_early.c | |||
| @@ -66,16 +66,14 @@ load_microcode_early(struct microcode_intel **saved, | |||
| 66 | return UCODE_OK; | 66 | return UCODE_OK; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static void | 69 | static inline void |
| 70 | microcode_pointer(struct microcode_intel **mc_saved, | 70 | copy_initrd_ptrs(struct microcode_intel **mc_saved, unsigned long *initrd, |
| 71 | unsigned long *mc_saved_in_initrd, | 71 | unsigned long off, int num_saved) |
| 72 | unsigned long initrd_start, int mc_saved_count) | ||
| 73 | { | 72 | { |
| 74 | int i; | 73 | int i; |
| 75 | 74 | ||
| 76 | for (i = 0; i < mc_saved_count; i++) | 75 | for (i = 0; i < num_saved; i++) |
| 77 | mc_saved[i] = (struct microcode_intel *) | 76 | mc_saved[i] = (struct microcode_intel *)(initrd[i] + off); |
| 78 | (mc_saved_in_initrd[i] + initrd_start); | ||
| 79 | } | 77 | } |
| 80 | 78 | ||
| 81 | #ifdef CONFIG_X86_32 | 79 | #ifdef CONFIG_X86_32 |
| @@ -99,17 +97,14 @@ microcode_phys(struct microcode_intel **mc_saved_tmp, | |||
| 99 | #endif | 97 | #endif |
| 100 | 98 | ||
| 101 | static enum ucode_state | 99 | static enum ucode_state |
| 102 | load_microcode(struct mc_saved_data *mc_saved_data, | 100 | load_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd, |
| 103 | unsigned long *mc_saved_in_initrd, | 101 | unsigned long initrd_start, struct ucode_cpu_info *uci) |
| 104 | unsigned long initrd_start, | ||
| 105 | struct ucode_cpu_info *uci) | ||
| 106 | { | 102 | { |
| 107 | struct microcode_intel *mc_saved_tmp[MAX_UCODE_COUNT]; | 103 | struct microcode_intel *mc_saved_tmp[MAX_UCODE_COUNT]; |
| 108 | unsigned int count = mc_saved_data->mc_saved_count; | 104 | unsigned int count = mc_saved_data->mc_saved_count; |
| 109 | 105 | ||
| 110 | if (!mc_saved_data->mc_saved) { | 106 | if (!mc_saved_data->mc_saved) { |
| 111 | microcode_pointer(mc_saved_tmp, mc_saved_in_initrd, | 107 | copy_initrd_ptrs(mc_saved_tmp, initrd, initrd_start, count); |
| 112 | initrd_start, count); | ||
| 113 | 108 | ||
| 114 | return load_microcode_early(mc_saved_tmp, count, uci); | 109 | return load_microcode_early(mc_saved_tmp, count, uci); |
| 115 | } else { | 110 | } else { |
| @@ -672,7 +667,7 @@ int __init save_microcode_in_initrd_intel(void) | |||
| 672 | if (count == 0) | 667 | if (count == 0) |
| 673 | return ret; | 668 | return ret; |
| 674 | 669 | ||
| 675 | microcode_pointer(mc_saved, mc_saved_in_initrd, initrd_start, count); | 670 | copy_initrd_ptrs(mc_saved, mc_saved_in_initrd, initrd_start, count); |
| 676 | ret = save_microcode(&mc_saved_data, mc_saved, count); | 671 | ret = save_microcode(&mc_saved_data, mc_saved, count); |
| 677 | if (ret) | 672 | if (ret) |
| 678 | pr_err("Cannot save microcode patches from initrd.\n"); | 673 | pr_err("Cannot save microcode patches from initrd.\n"); |
