]> xenbits.xensource.com Git - xen.git/commitdiff
x86/ucode: Use bootstrap_unmap() in early_microcode_load()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 25 Oct 2024 19:02:10 +0000 (20:02 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 6 Nov 2024 18:59:41 +0000 (18:59 +0000)
If bootstrap_map() has provided a mapping, we must free it when done.  Failing
to do so may cause a spurious failure for unrelated logic later.

Inserting a bootstrap_unmap() here does not break the use of ucode_{blob,mod}
any more than they already are.

Add a printk noting when we didn't find a microcode patch.  It's at debug
level, because this is the expected case on AMD Client systems, and SDPs, but
for people trying to figure out why microcode loading isn't work, it might be
helpful.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Daniel P. Smith <dpsmith@apertussolutions.com>
xen/arch/x86/cpu/microcode/core.c

index 97ed1f11588aa490eab1cd0fec5a7448fff588ae..a2b03c52e86a260049cf5e51e1f5f526d7402999 100644 (file)
@@ -849,6 +849,7 @@ static int __init early_microcode_load(struct boot_info *bi)
     size_t size;
     struct microcode_patch *patch;
     int idx = opt_mod_idx;
+    int rc;
 
     /*
      * Cmdline parsing ensures this invariant holds, so that we don't end up
@@ -904,15 +905,24 @@ static int __init early_microcode_load(struct boot_info *bi)
     patch = ucode_ops.cpu_request_microcode(data, size, false);
     if ( IS_ERR(patch) )
     {
-        printk(XENLOG_WARNING "Parsing microcode blob error %ld\n",
-               PTR_ERR(patch));
-        return PTR_ERR(patch);
+        rc = PTR_ERR(patch);
+        printk(XENLOG_WARNING "Microcode: Parse error %d\n", rc);
+        goto unmap;
     }
 
     if ( !patch )
-        return -ENOENT;
+    {
+        printk(XENLOG_DEBUG "Microcode: No suitable patch found\n");
+        rc = -ENOENT;
+        goto unmap;
+    }
+
+    rc = microcode_update_cpu(patch, 0);
 
-    return microcode_update_cpu(patch, 0);
+ unmap:
+    bootstrap_unmap();
+
+    return rc;
 }
 
 int __init early_microcode_init(struct boot_info *bi)