The branch stable/15 has been updated by kib:

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

commit a6c0d8bf434a22fe81c029606d4241efb4adce5a
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-02-10 01:37:18 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-02-16 06:12:28 +0000

    amd64/acpica/acpi_wakeup.c: do not store to WARMBOOT_OFF in efi_boot case
    
    (cherry picked from commit 5f3192b3fddd974db36af0279403aba1371c68ec)
---
 sys/amd64/acpica/acpi_wakeup.c | 59 ++++++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 23 deletions(-)

diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c
index 99565fbb69ca..54fe1e47a502 100644
--- a/sys/amd64/acpica/acpi_wakeup.c
+++ b/sys/amd64/acpica/acpi_wakeup.c
@@ -76,9 +76,6 @@ static cpuset_t               suspcpus;
 
 static void            acpi_stop_beep(void *);
 
-static int             acpi_wakeup_ap(struct acpi_softc *, int);
-static void            acpi_wakeup_cpus(struct acpi_softc *);
-
 #define        ACPI_WAKEPT_PAGES       7
 
 #define        WAKECODE_FIXUP(offset, type, val)       do {    \
@@ -129,24 +126,22 @@ acpi_wakeup_ap(struct acpi_softc *sc, int cpu)
 #define        BIOS_WARM               (0x0a)
 
 static void
-acpi_wakeup_cpus(struct acpi_softc *sc)
+acpi_wakeup_cpus_bios(struct acpi_softc *sc)
 {
        uint32_t        mpbioswarmvec;
        int             cpu;
        u_char          mpbiosreason;
 
-       if (!efi_boot) {
-               /* save the current value of the warm-start vector */
-               mpbioswarmvec = *((uint32_t *)WARMBOOT_OFF);
-               outb(CMOS_REG, BIOS_RESET);
-               mpbiosreason = inb(CMOS_DATA);
-
-               /* setup a vector to our boot code */
-               *((volatile u_short *)WARMBOOT_OFF) = WARMBOOT_TARGET;
-               *((volatile u_short *)WARMBOOT_SEG) = sc->acpi_wakephys >> 4;
-               outb(CMOS_REG, BIOS_RESET);
-               outb(CMOS_DATA, BIOS_WARM);     /* 'warm-start' */
-       }
+       /* save the current value of the warm-start vector */
+       mpbioswarmvec = *((uint32_t *)WARMBOOT_OFF);
+       outb(CMOS_REG, BIOS_RESET);
+       mpbiosreason = inb(CMOS_DATA);
+
+       /* setup a vector to our boot code */
+       *((volatile u_short *)WARMBOOT_OFF) = WARMBOOT_TARGET;
+       *((volatile u_short *)WARMBOOT_SEG) = sc->acpi_wakephys >> 4;
+       outb(CMOS_REG, BIOS_RESET);
+       outb(CMOS_DATA, BIOS_WARM);     /* 'warm-start' */
 
        /* Wake up each AP. */
        for (cpu = 1; cpu < mp_ncpus; cpu++) {
@@ -160,12 +155,26 @@ acpi_wakeup_cpus(struct acpi_softc *sc)
                }
        }
 
-       if (!efi_boot) {
-               /* restore the warmstart vector */
-               *(uint32_t *)WARMBOOT_OFF = mpbioswarmvec;
+       /* restore the warmstart vector */
+       *(uint32_t *)WARMBOOT_OFF = mpbioswarmvec;
+
+       outb(CMOS_REG, BIOS_RESET);
+       outb(CMOS_DATA, mpbiosreason);
+}
+
+static void
+acpi_wakeup_cpus_efi(struct acpi_softc *sc)
+{
+       int             cpu;
 
-               outb(CMOS_REG, BIOS_RESET);
-               outb(CMOS_DATA, mpbiosreason);
+       /* Wake up each AP. */
+       for (cpu = 1; cpu < mp_ncpus; cpu++) {
+               if (!CPU_ISSET(cpu, &suspcpus))
+                       continue;
+               if (acpi_wakeup_ap(sc, cpu) == 0) {
+                       panic("acpi_wakeup: failed to resume AP #%d (PHY #%d)",
+                           cpu, cpu_apic_ids[cpu]);
+               }
        }
 }
 
@@ -264,8 +273,12 @@ acpi_wakeup_machdep(struct acpi_softc *sc, int state, int 
sleep_result,
                        PCPU_SET(switchtime, 0);
                        PCPU_SET(switchticks, ticks);
                        lapic_xapic_mode();
-                       if (!CPU_EMPTY(&suspcpus))
-                               acpi_wakeup_cpus(sc);
+                       if (!CPU_EMPTY(&suspcpus)) {
+                               if (efi_boot)
+                                       acpi_wakeup_cpus_efi(sc);
+                               else
+                                       acpi_wakeup_cpus_bios(sc);
+                       }
                }
 
                if (!CPU_EMPTY(&suspcpus))

Reply via email to