Lines Matching +full:smp +full:- +full:offset
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2001-2012 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
7 * Copyright (c) 2008-2012 Jung-uk Kim <jkim@FreeBSD.org>
38 #include <sys/smp.h>
57 #ifdef SMP
58 #include <machine/smp.h>
70 CTASSERT(sizeof(wakecode) < PAGE_SIZE - 1024);
76 #ifdef SMP
85 #ifdef SMP
92 #define WAKECODE_FIXUP(offset, type, val) do { \
94 addr = (type *)(sc->acpi_wakeaddr + (offset)); \
106 #ifdef SMP
111 int vector = (sc->acpi_wakephys >> 12) & 0xff;
115 pcb = &susppcbs[cpu]->sp_pcb;
117 WAKECODE_FIXUP(wakeup_gdt, uint16_t, pcb->pcb_gdt.rd_limit);
118 WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, pcb->pcb_gdt.rd_base);
148 /* save the current value of the warm-start vector */
155 *((volatile u_short *)WARMBOOT_SEG) = sc->acpi_wakephys >> 4;
157 outb(CMOS_DATA, BIOS_WARM); /* 'warm-start' */
190 if (sc->acpi_wakeaddr == 0ul)
191 return (-1); /* couldn't alloc wake memory */
193 #ifdef SMP
201 AcpiSetFirmwareWakingVector(sc->acpi_wakephys, 0);
208 pcb = &susppcbs[0]->sp_pcb;
210 fpususpend(susppcbs[0]->sp_fpususpend);
211 #ifdef SMP
213 device_printf(sc->acpi_dev, "Failed to suspend APs\n");
222 pc->pc_ibpb_set = 0;
231 WAKECODE_FIXUP(wakeup_gdt, uint16_t, pcb->pcb_gdt.rd_limit);
232 WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, pcb->pcb_gdt.rd_base);
235 if (state == ACPI_STATE_S4 && sc->acpi_s4bios)
240 device_printf(sc->acpi_dev,
241 "AcpiEnterSleepState failed - %s\n",
253 * Re-initialize console hardware as soon as possible.
258 fpuresume(susppcbs[0]->sp_fpususpend);
269 if (sleep_result == -1)
281 #ifdef SMP
287 #ifdef SMP
293 * Re-read cpu_stdext_feature3, which was zeroed-out
317 mem_range_softc.mr_op->reinit != NULL)
318 mem_range_softc.mr_op->reinit(&mem_range_softc);
337 * low 1 MB region, excluding real mode IVT (0-0x3ff), BDA
338 * (0x400-0x4ff), EBDA (less than 128KB, below 0xa0000, must
349 for (i = 0; i < ACPI_WAKEPT_PAGES - (la57 ? 0 : 1); i++) {
362 susppcbs[i]->sp_fpususpend = alloc_fpusave(M_WAITOK);
390 sc->acpi_wakeaddr = (vm_offset_t)wakeaddr;
391 sc->acpi_wakephys = vtophys(wakeaddr);
410 bcopy(wakecode, (void *)sc->acpi_wakeaddr, sizeof(wakecode));
414 sc->acpi_wakephys + bootgdt);
416 sc->acpi_wakephys + wakeup_32);
418 sc->acpi_wakephys + wakeup_64);
426 bcopy(kernel_pmap->pm_pmltop, pt5, PAGE_SIZE);
430 bcopy(kernel_pmap->pm_pmltop, pt4, PAGE_SIZE);
463 device_printf(sc->acpi_dev, "wakeup code va %#jx pa %#jx\n",
464 (uintmax_t)sc->acpi_wakeaddr, (uintmax_t)sc->acpi_wakephys);