untrusted comment: verify with openbsd-72-base.pub
RWQTKNnK3CZZ8BYEkGHbx4TBOWo6v3B6C5Z33VMtgup5DS1QoNr6ixcwlpVaaFW0ZkCtQ2rEOPI8fSlqsmsqADnZd7Au0GgPBQ8=
OpenBSD 7.2 errata 034, July 24, 2023:
Add firmware for AMD cpus, to repair past or potential future bugs.
For i386 and amd64 platforms.
Apply by doing:
signify -Vep /etc/signify/openbsd-72-base.pub -x 034_amdfirmware.patch.sig \
-m - | (cd /usr/src && patch -p0)
And rebuild and install new bootblocks:
cd /usr/src/sys/arch/`machine`/stand/
make obj
make
make install
Also rebuild fw_update:
cd /usr/src/usr.sbin/fw_update
make obj
make
make install
New firmwares can be downloaded using
fw_update
New bootblocks will need to be installed, using a command similar to this:
installboot -v sd0
Index: sys/arch/amd64/stand/boot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/boot/conf.c,v
diff -u -p -u -r1.55 conf.c
--- sys/arch/amd64/stand/boot/conf.c 12 Aug 2022 20:18:58 -0000 1.55
+++ sys/arch/amd64/stand/boot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -41,7 +41,7 @@
#include <biosdev.h>
#include <dev/cons.h>
-const char version[] = "3.55";
+const char version[] = "3.55b";
int debug = 1;
Index: sys/arch/amd64/stand/cdboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/cdboot/conf.c,v
diff -u -p -u -r1.49 conf.c
--- sys/arch/amd64/stand/cdboot/conf.c 12 Aug 2022 20:18:58 -0000 1.49
+++ sys/arch/amd64/stand/cdboot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -42,7 +42,7 @@
#include <biosdev.h>
#include <dev/cons.h>
-const char version[] = "3.55";
+const char version[] = "3.55b";
int debug = 1;
Index: sys/arch/amd64/stand/efi32/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/efi32/Attic/conf.c,v
diff -u -p -u -r1.11 conf.c
--- sys/arch/amd64/stand/efi32/conf.c 12 Aug 2022 20:18:58 -0000 1.11
+++ sys/arch/amd64/stand/efi32/conf.c 23 Jul 2023 02:44:39 -0000
@@ -40,7 +40,7 @@
#include "efidev.h"
#include "efipxe.h"
-const char version[] = "3.54";
+const char version[] = "3.54b";
#ifdef EFI_DEBUG
int debug = 0;
Index: sys/arch/amd64/stand/efi64/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/efi64/Attic/conf.c,v
diff -u -p -u -r1.10 conf.c
--- sys/arch/amd64/stand/efi64/conf.c 12 Aug 2022 20:18:58 -0000 1.10
+++ sys/arch/amd64/stand/efi64/conf.c 23 Jul 2023 02:44:39 -0000
@@ -40,7 +40,7 @@
#include "efidev.h"
#include "efipxe.h"
-const char version[] = "3.54";
+const char version[] = "3.54b";
#ifdef EFI_DEBUG
int debug = 0;
Index: sys/arch/amd64/stand/efiboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/conf.c,v
diff -u -p -u -r1.39 conf.c
--- sys/arch/amd64/stand/efiboot/conf.c 12 Aug 2022 20:18:58 -0000 1.39
+++ sys/arch/amd64/stand/efiboot/conf.c 23 Jul 2023 02:45:03 -0000
@@ -40,7 +40,7 @@
#include "efidev.h"
#include "efipxe.h"
-const char version[] = "3.62";
+const char version[] = "3.62b";
#ifdef EFI_DEBUG
int debug = 0;
Index: sys/arch/amd64/stand/efiboot/exec_i386.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/exec_i386.c,v
diff -u -p -u -r1.9 exec_i386.c
--- sys/arch/amd64/stand/efiboot/exec_i386.c 11 Jul 2022 19:45:02 -0000 1.9
+++ sys/arch/amd64/stand/efiboot/exec_i386.c 23 Jul 2023 02:44:39 -0000
@@ -180,7 +180,8 @@ ucode_load(void)
CPUID(0, dummy, vendor[0], vendor[2], vendor[1]);
vendor[3] = 0; /* NULL-terminate */
- if (strcmp((char *)vendor, "GenuineIntel") != 0)
+ if (strcmp((char *)vendor, "GenuineIntel") != 0 &&
+ strcmp((char *)vendor, "AuthenticAMD") != 0)
return;
CPUID(1, signature, dummy, dummy, dummy);
@@ -192,8 +193,22 @@ ucode_load(void)
}
stepping = (signature >> 0) & 0x0f;
- snprintf(path, sizeof(path), "%s:/etc/firmware/intel/%02x-%02x-%02x",
- cmd.bootdev, family, model, stepping);
+ if (strcmp((char *)vendor, "GenuineIntel") == 0) {
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/intel/%02x-%02x-%02x",
+ cmd.bootdev, family, model, stepping);
+ } else if (strcmp((char *)vendor, "AuthenticAMD") == 0) {
+ if (family < 0x10)
+ return;
+ else if (family <= 0x14)
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd.bin",
+ cmd.bootdev);
+ else
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd_fam%02xh.bin",
+ cmd.bootdev, family);
+ }
fd = open(path, O_RDONLY);
if (fd == -1)
Index: sys/arch/amd64/stand/libsa/exec_i386.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/libsa/exec_i386.c,v
diff -u -p -u -r1.37 exec_i386.c
--- sys/arch/amd64/stand/libsa/exec_i386.c 11 Jul 2022 19:45:02 -0000 1.37
+++ sys/arch/amd64/stand/libsa/exec_i386.c 23 Jul 2023 02:44:39 -0000
@@ -202,7 +202,8 @@ ucode_load(void)
CPUID(0, dummy, vendor[0], vendor[2], vendor[1]);
vendor[3] = 0; /* NULL-terminate */
- if (strcmp((char *)vendor, "GenuineIntel") != 0)
+ if (strcmp((char *)vendor, "GenuineIntel") != 0 &&
+ strcmp((char *)vendor, "AuthenticAMD") != 0)
return;
CPUID(1, signature, dummy, dummy, dummy);
@@ -214,8 +215,22 @@ ucode_load(void)
}
stepping = (signature >> 0) & 0x0f;
- snprintf(path, sizeof(path), "%s:/etc/firmware/intel/%02x-%02x-%02x",
- cmd.bootdev, family, model, stepping);
+ if (strcmp((char *)vendor, "GenuineIntel") == 0) {
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/intel/%02x-%02x-%02x",
+ cmd.bootdev, family, model, stepping);
+ } else if (strcmp((char *)vendor, "AuthenticAMD") == 0) {
+ if (family < 0x10)
+ return;
+ else if (family <= 0x14)
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd.bin",
+ cmd.bootdev);
+ else
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd_fam%02xh.bin",
+ cmd.bootdev, family);
+ }
fd = open(path, O_RDONLY);
if (fd == -1)
Index: sys/arch/amd64/stand/pxeboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/stand/pxeboot/conf.c,v
diff -u -p -u -r1.54 conf.c
--- sys/arch/amd64/stand/pxeboot/conf.c 12 Aug 2022 20:18:58 -0000 1.54
+++ sys/arch/amd64/stand/pxeboot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -44,7 +44,7 @@
#include "pxeboot.h"
#include "pxe_net.h"
-const char version[] = "3.55";
+const char version[] = "3.55b";
int debug = 0;
void (*sa_cleanup)(void) = pxe_shutdown;
Index: sys/arch/i386/stand/boot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/stand/boot/conf.c,v
diff -u -p -u -r1.76 conf.c
--- sys/arch/i386/stand/boot/conf.c 9 Dec 2020 18:10:18 -0000 1.76
+++ sys/arch/i386/stand/boot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -42,7 +42,7 @@
#include <dev/cons.h>
#include "debug.h"
-const char version[] = "3.44";
+const char version[] = "3.44b";
int debug = 1;
Index: sys/arch/i386/stand/cdboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/stand/cdboot/conf.c,v
diff -u -p -u -r1.43 conf.c
--- sys/arch/i386/stand/cdboot/conf.c 9 Dec 2020 18:10:18 -0000 1.43
+++ sys/arch/i386/stand/cdboot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -43,7 +43,7 @@
#include <dev/cons.h>
#include "debug.h"
-const char version[] = "3.44";
+const char version[] = "3.44b";
int debug = 1;
void (*sa_cleanup)(void) = NULL;
Index: sys/arch/i386/stand/libsa/exec_i386.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/stand/libsa/exec_i386.c,v
diff -u -p -u -r1.52 exec_i386.c
--- sys/arch/i386/stand/libsa/exec_i386.c 7 Jul 2022 00:56:47 -0000 1.52
+++ sys/arch/i386/stand/libsa/exec_i386.c 23 Jul 2023 02:44:39 -0000
@@ -190,7 +190,8 @@ ucode_load(void)
CPUID(0, dummy, vendor[0], vendor[2], vendor[1]);
vendor[3] = 0; /* NULL-terminate */
- if (strcmp((char *)vendor, "GenuineIntel") != 0)
+ if (strcmp((char *)vendor, "GenuineIntel") != 0 &&
+ strcmp((char *)vendor, "AuthenticAMD") != 0)
return;
CPUID(1, signature, dummy, dummy, dummy);
@@ -202,8 +203,22 @@ ucode_load(void)
}
stepping = (signature >> 0) & 0x0f;
- snprintf(path, sizeof(path), "%s:/etc/firmware/intel/%02x-%02x-%02x",
- cmd.bootdev, family, model, stepping);
+ if (strcmp((char *)vendor, "GenuineIntel") == 0) {
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/intel/%02x-%02x-%02x",
+ cmd.bootdev, family, model, stepping);
+ } else if (strcmp((char *)vendor, "AuthenticAMD") == 0) {
+ if (family < 0x10)
+ return;
+ else if (family <= 0x14)
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd.bin",
+ cmd.bootdev);
+ else
+ snprintf(path, sizeof(path),
+ "%s:/etc/firmware/amd/microcode_amd_fam%02xh.bin",
+ cmd.bootdev, family);
+ }
fd = open(path, O_RDONLY);
if (fd == -1)
Index: sys/arch/i386/stand/libsa/pciprobe.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/stand/libsa/pciprobe.c,v
diff -u -p -u -r1.10 pciprobe.c
--- sys/arch/i386/stand/libsa/pciprobe.c 29 Mar 2014 18:09:29 -0000 1.10
+++ sys/arch/i386/stand/libsa/pciprobe.c 24 Jul 2023 13:45:53 -0000
@@ -39,12 +39,12 @@ pciprobe(void)
{
bios_pciinfo_t bpi;
u_int32_t hw_chars, rev, rc, sig;
- u_int32_t entry32;
+ u_int32_t entry32, lastbus;
/* PCI BIOS v2.0c+ - Installation Check */
- __asm volatile(DOINT(0x1A) "; shll $8,%2; setc %b2"
- : "=a" (hw_chars), "=b" (rev), "=c" (rc),
- "=d" (sig), "=D" (entry32)
+ __asm volatile(DOINT(0x1A)
+ : "=a" (hw_chars), "=b" (rev), "=c" (lastbus),
+ "=d" (sig), "=D" (entry32), "=@ccc" (rc)
: "0" (0xB101), "4" (0x0)
: "cc");
@@ -62,7 +62,7 @@ pciprobe(void)
bpi.pci_chars = hw_chars & 0xFFFF;
bpi.pci_rev = rev & 0xFFFF;
bpi.pci_entry32 = entry32;
- bpi.pci_lastbus = (rc>>8) & 0xFF;
+ bpi.pci_lastbus = lastbus & 0xFF;
addbootarg(BOOTARG_PCIINFO, sizeof(bios_pciinfo_t), &bpi);
}
Index: sys/arch/i386/stand/pxeboot/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/stand/pxeboot/conf.c,v
diff -u -p -u -r1.48 conf.c
--- sys/arch/i386/stand/pxeboot/conf.c 9 Dec 2020 18:10:18 -0000 1.48
+++ sys/arch/i386/stand/pxeboot/conf.c 23 Jul 2023 02:44:39 -0000
@@ -45,7 +45,7 @@
#include "pxeboot.h"
#include "pxe_net.h"
-const char version[] = "3.44";
+const char version[] = "3.44b";
int debug = 1;
void (*sa_cleanup)(void) = pxe_shutdown;
Index: usr.sbin/fw_update/patterns.c
===================================================================
RCS file: /cvs/src/usr.sbin/fw_update/patterns.c,v
diff -u -p -u -r1.4 patterns.c
--- usr.sbin/fw_update/patterns.c 6 Aug 2022 03:12:19 -0000 1.4
+++ usr.sbin/fw_update/patterns.c 23 Jul 2023 02:44:39 -0000
@@ -88,6 +88,8 @@ int
main(void)
{
printf("%s\n", "acx");
+ printf("%s\n", "amd");
+ printf("%s\n", "amd ^cpu0:* AMD");
printf("%s\n", "amdgpu");
print_devices("amdgpu", amdgpu_devices, nitems(amdgpu_devices));
printf("%s\n", "athn");