From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Borislav Petkov <bp@suse.de>
Subject: [PATCH 3.18 45/84] x86, microcode: Reload microcode on resume
Date: Tue, 6 Jan 2015 17:49:48 -0800 [thread overview]
Message-ID: <20150107014030.478163101@linuxfoundation.org> (raw)
In-Reply-To: <20150107014029.012974975@linuxfoundation.org>
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov <bp@suse.de>
commit fbae4ba8c4a387e306adc9c710e5c225cece7678 upstream.
Normally, we do reapply microcode on resume. However, in the cases where
that microcode comes from the early loader and the late loader hasn't
been utilized yet, there's no easy way for us to go and apply the patch
applied during boot by the early loader.
Thus, reuse the patch stashed by the early loader for the BSP.
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/x86/include/asm/microcode.h | 2 +
arch/x86/include/asm/microcode_amd.h | 2 +
arch/x86/include/asm/microcode_intel.h | 2 +
arch/x86/kernel/cpu/microcode/amd_early.c | 18 ++++++++++
arch/x86/kernel/cpu/microcode/core.c | 10 -----
arch/x86/kernel/cpu/microcode/core_early.c | 21 ++++++++++++
arch/x86/kernel/cpu/microcode/intel_early.c | 47 ++++++++++++++++++++++------
7 files changed, 84 insertions(+), 18 deletions(-)
--- a/arch/x86/include/asm/microcode.h
+++ b/arch/x86/include/asm/microcode.h
@@ -78,6 +78,7 @@ static inline void __exit exit_amd_micro
extern void __init load_ucode_bsp(void);
extern void load_ucode_ap(void);
extern int __init save_microcode_in_initrd(void);
+void reload_early_microcode(void);
#else
static inline void __init load_ucode_bsp(void) {}
static inline void load_ucode_ap(void) {}
@@ -85,6 +86,7 @@ static inline int __init save_microcode_
{
return 0;
}
+static inline void reload_early_microcode(void) {}
#endif
#endif /* _ASM_X86_MICROCODE_H */
--- a/arch/x86/include/asm/microcode_amd.h
+++ b/arch/x86/include/asm/microcode_amd.h
@@ -68,10 +68,12 @@ extern u8 amd_ucode_patch[PATCH_MAX_SIZE
extern void __init load_ucode_amd_bsp(void);
extern void load_ucode_amd_ap(void);
extern int __init save_microcode_in_initrd_amd(void);
+void reload_ucode_amd(void);
#else
static inline void __init load_ucode_amd_bsp(void) {}
static inline void load_ucode_amd_ap(void) {}
static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; }
+void reload_ucode_amd(void) {}
#endif
#endif /* _ASM_X86_MICROCODE_AMD_H */
--- a/arch/x86/include/asm/microcode_intel.h
+++ b/arch/x86/include/asm/microcode_intel.h
@@ -68,11 +68,13 @@ extern void __init load_ucode_intel_bsp(
extern void load_ucode_intel_ap(void);
extern void show_ucode_info_early(void);
extern int __init save_microcode_in_initrd_intel(void);
+void reload_ucode_intel(void);
#else
static inline __init void load_ucode_intel_bsp(void) {}
static inline void load_ucode_intel_ap(void) {}
static inline void show_ucode_info_early(void) {}
static inline int __init save_microcode_in_initrd_intel(void) { return -EINVAL; }
+static inline void reload_ucode_intel(void) {}
#endif
#if defined(CONFIG_MICROCODE_INTEL_EARLY) && defined(CONFIG_HOTPLUG_CPU)
--- a/arch/x86/kernel/cpu/microcode/amd_early.c
+++ b/arch/x86/kernel/cpu/microcode/amd_early.c
@@ -402,3 +402,21 @@ int __init save_microcode_in_initrd_amd(
return retval;
}
+
+void reload_ucode_amd(void)
+{
+ struct microcode_amd *mc;
+ u32 rev, eax;
+
+ rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax);
+
+ mc = (struct microcode_amd *)amd_ucode_patch;
+
+ if (mc && rev < mc->hdr.patch_id) {
+ if (!__apply_microcode_amd(mc)) {
+ ucode_new_rev = mc->hdr.patch_id;
+ pr_info("microcode: reload patch_level=0x%08x\n",
+ ucode_new_rev);
+ }
+ }
+}
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -465,16 +465,8 @@ static void mc_bp_resume(void)
if (uci->valid && uci->mc)
microcode_ops->apply_microcode(cpu);
-#ifdef CONFIG_X86_64
else if (!uci->mc)
- /*
- * We might resume and not have applied late microcode but still
- * have a newer patch stashed from the early loader. We don't
- * have it in uci->mc so we have to load it the same way we're
- * applying patches early on the APs.
- */
- load_ucode_ap();
-#endif
+ reload_early_microcode();
}
static struct syscore_ops mc_syscore_ops = {
--- a/arch/x86/kernel/cpu/microcode/core_early.c
+++ b/arch/x86/kernel/cpu/microcode/core_early.c
@@ -176,3 +176,24 @@ int __init save_microcode_in_initrd(void
return 0;
}
+
+void reload_early_microcode(void)
+{
+ int vendor, x86;
+
+ vendor = x86_vendor();
+ x86 = x86_family();
+
+ switch (vendor) {
+ case X86_VENDOR_INTEL:
+ if (x86 >= 6)
+ reload_ucode_intel();
+ break;
+ case X86_VENDOR_AMD:
+ if (x86 >= 0x10)
+ reload_ucode_amd();
+ break;
+ default:
+ break;
+ }
+}
--- a/arch/x86/kernel/cpu/microcode/intel_early.c
+++ b/arch/x86/kernel/cpu/microcode/intel_early.c
@@ -34,6 +34,8 @@ static struct mc_saved_data {
struct microcode_intel **mc_saved;
} mc_saved_data;
+static struct microcode_intel bsp_patch;
+
static enum ucode_state
generic_load_microcode_early(struct microcode_intel **mc_saved_p,
unsigned int mc_saved_count,
@@ -650,7 +652,7 @@ static inline void print_ucode(struct uc
}
#endif
-static int apply_microcode_early(struct ucode_cpu_info *uci)
+static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)
{
struct microcode_intel *mc_intel;
unsigned int val[2];
@@ -679,7 +681,10 @@ static int apply_microcode_early(struct
#endif
uci->cpu_sig.rev = val[1];
- print_ucode(uci);
+ if (early)
+ print_ucode(uci);
+ else
+ print_ucode_info(uci, mc_intel->hdr.date);
return 0;
}
@@ -712,14 +717,22 @@ _load_ucode_intel_bsp(struct mc_saved_da
unsigned long *mc_saved_in_initrd,
unsigned long initrd_start_early,
unsigned long initrd_end_early,
- struct ucode_cpu_info *uci)
+ struct ucode_cpu_info *uci,
+ struct microcode_intel *bsp)
{
+ enum ucode_state ret;
+
collect_cpu_info_early(uci);
scan_microcode(initrd_start_early, initrd_end_early, mc_saved_data,
mc_saved_in_initrd, uci);
- load_microcode(mc_saved_data, mc_saved_in_initrd,
- initrd_start_early, uci);
- apply_microcode_early(uci);
+
+ ret = load_microcode(mc_saved_data, mc_saved_in_initrd,
+ initrd_start_early, uci);
+
+ if (ret == UCODE_OK) {
+ apply_microcode_early(uci, true);
+ memcpy(bsp, uci->mc, sizeof(*bsp));
+ }
}
void __init
@@ -728,10 +741,12 @@ load_ucode_intel_bsp(void)
u64 ramdisk_image, ramdisk_size;
unsigned long initrd_start_early, initrd_end_early;
struct ucode_cpu_info uci;
+ struct microcode_intel *bsp_p;
#ifdef CONFIG_X86_32
struct boot_params *boot_params_p;
boot_params_p = (struct boot_params *)__pa_nodebug(&boot_params);
+ bsp_p = (struct microcode_intel *)__pa_nodebug(&bsp_patch);
ramdisk_image = boot_params_p->hdr.ramdisk_image;
ramdisk_size = boot_params_p->hdr.ramdisk_size;
initrd_start_early = ramdisk_image;
@@ -740,15 +755,17 @@ load_ucode_intel_bsp(void)
_load_ucode_intel_bsp(
(struct mc_saved_data *)__pa_nodebug(&mc_saved_data),
(unsigned long *)__pa_nodebug(&mc_saved_in_initrd),
- initrd_start_early, initrd_end_early, &uci);
+ initrd_start_early, initrd_end_early, &uci, bsp_p);
#else
+ bsp_p = &bsp_patch;
ramdisk_image = boot_params.hdr.ramdisk_image;
ramdisk_size = boot_params.hdr.ramdisk_size;
initrd_start_early = ramdisk_image + PAGE_OFFSET;
initrd_end_early = initrd_start_early + ramdisk_size;
_load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd,
- initrd_start_early, initrd_end_early, &uci);
+ initrd_start_early, initrd_end_early,
+ &uci, bsp_p);
#endif
}
@@ -782,5 +799,17 @@ void load_ucode_intel_ap(void)
collect_cpu_info_early(&uci);
load_microcode(mc_saved_data_p, mc_saved_in_initrd_p,
initrd_start_addr, &uci);
- apply_microcode_early(&uci);
+ apply_microcode_early(&uci, true);
+}
+
+void reload_ucode_intel(void)
+{
+ struct ucode_cpu_info uci;
+
+ if (!bsp_patch.hdr.rev)
+ return;
+
+ uci.mc = &bsp_patch;
+
+ apply_microcode_early(&uci, false);
}
next prev parent reply other threads:[~2015-01-07 1:49 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-07 1:49 [PATCH 3.18 00/84] 3.18.2-stable review Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 01/84] isofs: Fix infinite looping over CE entries Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 02/84] x86/tls: Validate TLS entries to protect espfix Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 03/84] x86/tls: Disallow unusual TLS segments Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 04/84] x86_64, switch_to(): Load TLS descriptors before switching DS and ES Greg Kroah-Hartman
2015-01-07 15:26 ` Jiri Slaby
2015-01-08 1:27 ` Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 05/84] x86, kvm: Clear paravirt_enabled on KVM guests for espfix32s benefit Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 06/84] brcmfmac: Fix bitmap malloc bug in msgbuf Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 07/84] clocksource: arch_timer: Fix code to use physical timers when requested Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 08/84] mfd: twl4030-power: Fix regression with missing compatible flag Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 09/84] mfd: tc6393xb: Fail ohci suspend if full state restore is required Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 10/84] mmc: dw_mmc: avoid write to CDTHRCTL on older versions Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 11/84] mmc: omap_hsmmc: Fix UHS card with DDR50 support Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 12/84] mmc: block: add newline to sysfs display of force_ro Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 13/84] mmc: sdhci-pci-o2micro: Fix Dell E5440 issue Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 14/84] megaraid_sas: corrected return of wait_event from abort frame path Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 15/84] megaraid_sas: dndinaness related bug fixes Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 16/84] regulator: anatop: Set default voltage selector for vddpu Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 17/84] scsi: correct return values for .eh_abort_handler implementations Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 18/84] f2fs: avoid returning uninitialized value to userspace from f2fs_trim_fs() Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 19/84] f2fs: fix possible data corruption in f2fs_write_begin() Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 20/84] nfs41: fix nfs4_proc_layoutget error handling Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 21/84] dcache: fix kmemcheck warning in switch_names Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 22/84] dm bufio: fix memleak when using a dm_buffers inline bio Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 23/84] dm crypt: use memzero_explicit for on-stack buffer Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 24/84] dm cache: only use overwrite optimisation for promotion when in writeback mode Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 25/84] dm cache: dirty flag was mistakenly being cleared when promoting via overwrite Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 26/84] dm cache: fix spurious cell_defer when dealing with partial block at end of device Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 27/84] dm space map metadata: fix sm_bootstrap_get_nr_blocks() Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 28/84] dm thin: fix inability to discard blocks when in out-of-data-space mode Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 29/84] dm thin: fix missing out-of-data-space to write mode transition if blocks are released Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 30/84] dm thin: fix a race in thin_dtr Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 31/84] arm64: Add COMPAT_HWCAP_LPAE Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 32/84] arm64: bpf: lift restriction on last instruction Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 33/84] drm/tegra: gem: dumb: pitch and size are outputs Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 34/84] ARM: tegra: Re-add removed SoC id macro to tegra_resume() Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 35/84] ARM: mvebu: make the coherency_ll.S functions work with no coherency fabric Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 36/84] ARM: mvebu: disable I/O coherency on non-SMP situations on Armada 370/375/38x/XP Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 37/84] ARM: mvebu: remove conflicting muxing on Armada 370 DB Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 39/84] x86/asm/traps: Disable tracing and kprobes in fixup_bad_iret and sync_regs Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 40/84] x86/tls: Dont validate lm in set_thread_area() after all Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 41/84] isofs: Fix unchecked printing of ER records Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 42/84] x86, microcode, AMD: Do not use smp_processor_id() in preemtible context Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 43/84] x86, microcode, intel: Drop unused parameter Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 44/84] x86, microcode: Dont initialize microcode code on paravirt Greg Kroah-Hartman
2015-01-07 1:49 ` Greg Kroah-Hartman [this message]
2015-01-07 1:49 ` [PATCH 3.18 46/84] x86/microcode/intel: Fish out the stashed microcode for the BSP Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 47/84] KEYS: Fix stale key registration at error path Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 48/84] mac80211: copy chandef from AP vif to VLANs Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 49/84] mac80211: avoid using uninitialized stack data Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 51/84] mac80211: free management frame keys when removing station Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 52/84] mnt: Fix a memory stomp in umount Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 53/84] thermal: Fix error path in thermal_init() Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 54/84] mnt: Implicitly add MNT_NODEV on remount when it was implicitly added by mount Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 55/84] mnt: Update unprivileged remount test Greg Kroah-Hartman
2015-01-07 1:49 ` [PATCH 3.18 56/84] umount: Disallow unprivileged mount force Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 57/84] groups: Consolidate the setgroups permission checks Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 58/84] userns: Document what the invariant required for safe unprivileged mappings Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 59/84] userns: Dont allow setgroups until a gid mapping has been setablished Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 60/84] userns: Dont allow unprivileged creation of gid mappings Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 61/84] userns: Check euid no fsuid when establishing an unprivileged uid mapping Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 62/84] userns: Only allow the creator of the userns unprivileged mappings Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 63/84] userns: Rename id_map_mutex to userns_state_mutex Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 64/84] userns: Add a knob to disable setgroups on a per user namespace basis Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 65/84] userns: Allow setting gid_maps without privilege when setgroups is disabled Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 66/84] userns: Unbreak the unprivileged remount tests Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 67/84] audit: use supplied gfp_mask from audit_buffer in kauditd_send_multicast_skb Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 68/84] audit: dont attempt to lookup PIDs when changing PID filtering audit rules Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 69/84] audit: restore AUDIT_LOGINUID unset ABI Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 70/84] crypto: af_alg - fix backlog handling Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 71/84] ncpfs: return proper error from NCP_IOC_SETROOT ioctl Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 72/84] mm/CMA: fix boot regression due to physical address of high_memory Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 73/84] exit: pidns: alloc_pid() leaks pid_namespace if child_reaper is exiting Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 74/84] udf: Check path length when reading symlink Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 75/84] udf: Verify i_size when loading inode Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 76/84] udf: Verify symlink size before loading it Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 77/84] udf: Check component length before reading it Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 78/84] eCryptfs: Force RO mount when encrypted view is enabled Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 79/84] eCryptfs: Remove buggy and unnecessary write in file name decode routine Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 80/84] Btrfs: make sure we wait on logged extents when fsycning two subvols Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 81/84] btrfs: fix wrong accounting of raid1 data profile in statfs Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 82/84] Btrfs: do not move em to modified list when unpinning Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 83/84] Btrfs: make sure logged extents complete in the current transaction V3 Greg Kroah-Hartman
2015-01-07 1:50 ` [PATCH 3.18 84/84] Btrfs: fix fs corruption on transaction abort if device supports discard Greg Kroah-Hartman
2015-01-07 13:47 ` [PATCH 3.18 00/84] 3.18.2-stable review Guenter Roeck
2015-01-07 23:33 ` Shuah Khan
2015-01-07 23:45 ` Greg Kroah-Hartman
2015-01-08 10:20 ` Satoru Takeuchi
2015-01-08 16:33 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150107014030.478163101@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=bp@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).