| From 370a132bb2227ff76278f98370e0e701d86ff752 Mon Sep 17 00:00:00 2001 |
| From: Prarit Bhargava <prarit@redhat.com> |
| Date: Tue, 31 Jul 2018 07:27:39 -0400 |
| Subject: x86/microcode: Make sure boot_cpu_data.microcode is up-to-date |
| |
| From: Prarit Bhargava <prarit@redhat.com> |
| |
| commit 370a132bb2227ff76278f98370e0e701d86ff752 upstream. |
| |
| When preparing an MCE record for logging, boot_cpu_data.microcode is used |
| to read out the microcode revision on the box. |
| |
| However, on systems where late microcode update has happened, the microcode |
| revision output in a MCE log record is wrong because |
| boot_cpu_data.microcode is not updated when the microcode gets updated. |
| |
| But, the microcode revision saved in boot_cpu_data's microcode member |
| should be kept up-to-date, regardless, for consistency. |
| |
| Make it so. |
| |
| Fixes: fa94d0c6e0f3 ("x86/MCE: Save microcode revision in machine check records") |
| Signed-off-by: Prarit Bhargava <prarit@redhat.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Tony Luck <tony.luck@intel.com> |
| Cc: sironi@amazon.de |
| Cc: stable@vger.kernel.org |
| Link: http://lkml.kernel.org/r/20180731112739.32338-1-prarit@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/cpu/microcode/amd.c | 4 ++++ |
| arch/x86/kernel/cpu/microcode/intel.c | 4 ++++ |
| 2 files changed, 8 insertions(+) |
| |
| --- a/arch/x86/kernel/cpu/microcode/amd.c |
| +++ b/arch/x86/kernel/cpu/microcode/amd.c |
| @@ -537,6 +537,10 @@ static enum ucode_state apply_microcode_ |
| uci->cpu_sig.rev = mc_amd->hdr.patch_id; |
| c->microcode = mc_amd->hdr.patch_id; |
| |
| + /* Update boot_cpu_data's revision too, if we're on the BSP: */ |
| + if (c->cpu_index == boot_cpu_data.cpu_index) |
| + boot_cpu_data.microcode = mc_amd->hdr.patch_id; |
| + |
| return UCODE_UPDATED; |
| } |
| |
| --- a/arch/x86/kernel/cpu/microcode/intel.c |
| +++ b/arch/x86/kernel/cpu/microcode/intel.c |
| @@ -851,6 +851,10 @@ static enum ucode_state apply_microcode_ |
| uci->cpu_sig.rev = rev; |
| c->microcode = rev; |
| |
| + /* Update boot_cpu_data's revision too, if we're on the BSP: */ |
| + if (c->cpu_index == boot_cpu_data.cpu_index) |
| + boot_cpu_data.microcode = rev; |
| + |
| return UCODE_UPDATED; |
| } |
| |