The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=16f21c5af35002b8361ffb2e83ff3c92cd899a3a

commit 16f21c5af35002b8361ffb2e83ff3c92cd899a3a
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-05-30 15:57:46 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-06-01 16:35:33 +0000

    amd64: there is no reason to copy ucode around in ucode_load_bsp()
    
    PR:     294630
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differrential revision: https://reviews.freebsd.org/D57368
---
 sys/x86/x86/ucode.c | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/sys/x86/x86/ucode.c b/sys/x86/x86/ucode.c
index 3d7008eb30f2..439b0b83e650 100644
--- a/sys/x86/x86/ucode.c
+++ b/sys/x86/x86/ucode.c
@@ -377,18 +377,20 @@ ucode_load_ap(int cpu)
                (void)ucode_loader->load(ucode_data, UNSAFE, NULL, NULL);
 }
 
-static void *
-map_ucode(uintptr_t free, size_t len)
+static const void *
+map_ucode(const void *match, uintptr_t free, size_t len)
 {
 #ifdef __i386__
        uintptr_t va;
 
        for (va = free; va < free + len; va += PAGE_SIZE)
                pmap_kenter(va, (vm_paddr_t)va);
+       memcpy_early(free, match, len);
+       return ((const void *)free);
 #else
        (void)len;
+       return (match);
 #endif
-       return ((void *)free);
 }
 
 static void
@@ -421,7 +423,7 @@ ucode_load_bsp(uintptr_t free)
                char vendor[13];
        } cpuid;
        const uint8_t *fileaddr, *match;
-       uint8_t *addr;
+       const uint8_t *addr;
        char *type;
        uint64_t nrev, orev;
        caddr_t file;
@@ -456,14 +458,10 @@ ucode_load_bsp(uintptr_t free)
                len = preload_fetch_size(file);
                match = ucode_loader->match(fileaddr, &len);
                if (match != NULL) {
-                       addr = map_ucode(free, len);
-                       /* We can't use memcpy() before ifunc resolution. */
-                       memcpy_early(addr, match, len);
-                       match = addr;
-
-                       error = ucode_loader->load(match, EARLY, &nrev, &orev);
+                       addr = map_ucode(match, free, len);
+                       error = ucode_loader->load(addr, EARLY, &nrev, &orev);
                        if (error == 0) {
-                               ucode_data = early_ucode_data = match;
+                               ucode_data = early_ucode_data = addr;
                                ucode_nrev = nrev;
                                ucode_orev = orev;
                                return (len);

Reply via email to