Linus,

Please pull the latest x86-microcode-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
x86-microcode-for-linus

   # HEAD: d7f7dc7b88ed7e98f6e503f821b60ace206a35bc x86/microcode: Make a 
couple of symbols static

The main changes are a fix early microcode application for resume-from-RAM, 
plus a 
32-bit initrd placement fix - by Borislav Petkov.

 Thanks,

        Ingo

------------------>
Borislav Petkov (2):
      x86/microcode: Look for the initrd at the correct address on 32-bit
      x86/microcode/intel: Save pointer to ucode patch for early AP loading

Colin Ian King (1):
      x86/microcode: Make a couple of symbols static


 arch/x86/kernel/cpu/microcode/amd.c   |  2 +-
 arch/x86/kernel/cpu/microcode/core.c  | 11 +++++++++++
 arch/x86/kernel/cpu/microcode/intel.c | 27 ++++++++++++++++++++++-----
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/cpu/microcode/amd.c 
b/arch/x86/kernel/cpu/microcode/amd.c
index e9f4d762aa5b..21b185793c80 100644
--- a/arch/x86/kernel/cpu/microcode/amd.c
+++ b/arch/x86/kernel/cpu/microcode/amd.c
@@ -251,7 +251,7 @@ static bool get_builtin_microcode(struct cpio_data *cp, 
unsigned int family)
 #endif
 }
 
-void __load_ucode_amd(unsigned int cpuid_1_eax, struct cpio_data *ret)
+static void __load_ucode_amd(unsigned int cpuid_1_eax, struct cpio_data *ret)
 {
        struct ucode_cpu_info *uci;
        struct cpio_data cp;
diff --git a/arch/x86/kernel/cpu/microcode/core.c 
b/arch/x86/kernel/cpu/microcode/core.c
index e53d3c909840..9cb98ee103db 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -290,6 +290,17 @@ struct cpio_data find_microcode_in_initrd(const char 
*path, bool use_pa)
                        return (struct cpio_data){ NULL, 0, "" };
                if (initrd_start)
                        start = initrd_start;
+       } else {
+               /*
+                * The picture with physical addresses is a bit different: we
+                * need to get the *physical* address to which the ramdisk was
+                * relocated, i.e., relocated_ramdisk (not initrd_start) and
+                * since we're running from physical addresses, we need to 
access
+                * relocated_ramdisk through its *physical* address too.
+                */
+               u64 *rr = (u64 *)__pa_nodebug(&relocated_ramdisk);
+               if (*rr)
+                       start = *rr;
        }
 
        return find_cpio_data(path, (void *)start, size, NULL);
diff --git a/arch/x86/kernel/cpu/microcode/intel.c 
b/arch/x86/kernel/cpu/microcode/intel.c
index f522415bf9e5..59edbe9d4ccb 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -42,7 +42,7 @@
 static const char ucode_path[] = "kernel/x86/microcode/GenuineIntel.bin";
 
 /* Current microcode patch used in early patching on the APs. */
-struct microcode_intel *intel_ucode_patch;
+static struct microcode_intel *intel_ucode_patch;
 
 static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1,
                                        unsigned int s2, unsigned int p2)
@@ -166,7 +166,7 @@ static struct ucode_patch *__alloc_microcode_buf(void 
*data, unsigned int size)
 static void save_microcode_patch(void *data, unsigned int size)
 {
        struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
-       struct ucode_patch *iter, *tmp, *p;
+       struct ucode_patch *iter, *tmp, *p = NULL;
        bool prev_found = false;
        unsigned int sig, pf;
 
@@ -202,6 +202,18 @@ static void save_microcode_patch(void *data, unsigned int 
size)
                else
                        list_add_tail(&p->plist, &microcode_cache);
        }
+
+       /*
+        * Save for early loading. On 32-bit, that needs to be a physical
+        * address as the APs are running from physical addresses, before
+        * paging has been enabled.
+        */
+       if (p) {
+               if (IS_ENABLED(CONFIG_X86_32))
+                       intel_ucode_patch = (struct microcode_intel 
*)__pa_nodebug(p->data);
+               else
+                       intel_ucode_patch = p->data;
+       }
 }
 
 static int microcode_sanity_check(void *mc, int print_err)
@@ -607,6 +619,14 @@ int __init save_microcode_in_initrd_intel(void)
        struct ucode_cpu_info uci;
        struct cpio_data cp;
 
+       /*
+        * initrd is going away, clear patch ptr. We will scan the microcode one
+        * last time before jettisoning and save a patch, if found. Then we will
+        * update that pointer too, with a stable patch address to use when
+        * resuming the cores.
+        */
+       intel_ucode_patch = NULL;
+
        if (!load_builtin_intel_microcode(&cp))
                cp = find_microcode_in_initrd(ucode_path, false);
 
@@ -619,9 +639,6 @@ int __init save_microcode_in_initrd_intel(void)
 
        show_saved_mc();
 
-       /* initrd is going away, clear patch ptr. */
-       intel_ucode_patch = NULL;
-
        return 0;
 }
 

Reply via email to