Hi,
the diff below is necessary to make suspend/resume work when x2apic is
enabled (i.e. on qemu/kvm/...). While I don't expect problems, it would be
nice if I could get some reports that this doesn't break suspend/resume on
real machines, especially older ones (like core 2 duo and older) and ones
with an amd cpu.
Thanks in advance.
Cheers,
Stefan
--- a/sys/arch/amd64/amd64/acpi_wakecode.S
+++ b/sys/arch/amd64/amd64/acpi_wakecode.S
@@ -52,6 +52,7 @@
#include <machine/param.h>
#include <machine/segments.h>
#include <dev/acpi/acpivar.h>
+#include "lapic.h"
#define _ACPI_TRMP_LABEL(a) a = . - _C_LABEL(acpi_real_mode_resume) + \
ACPI_TRAMPOLINE
@@ -245,6 +246,13 @@ _C_LABEL(acpi_long_mode_resume):
movw %ax, %gs
/* Restore registers - start with the MSRs */
+#if NLAPIC > 0
+ movl $MSR_APICBASE, %ecx
+ movl acpi_saved_apicbase, %eax
+ movl acpi_saved_apicbase+4, %edx
+ wrmsr
+#endif
+
movl $MSR_STAR, %ecx
movl acpi_saved_star, %eax
movl acpi_saved_star+4, %edx
@@ -623,6 +631,10 @@ _ACPI_TRMP_DATA_LABEL(acpi_saved_cstar)
.quad 0
_ACPI_TRMP_DATA_LABEL(acpi_saved_sfmask)
.quad 0
+#if NLAPIC > 0
+_ACPI_TRMP_DATA_LABEL(acpi_saved_apicbase)
+ .quad 0
+#endif
.align 4
_ACPI_TRMP_DATA_LABEL(acpi_pdirpa)
@@ -682,6 +694,13 @@ NENTRY(acpi_savecpu)
pushq %rcx
pushq %rdx
+#if NLAPIC > 0
+ movl $MSR_APICBASE, %ecx
+ rdmsr
+ movl %eax, acpi_saved_apicbase
+ movl %edx, acpi_saved_apicbase+4
+#endif
+
movl $MSR_STAR, %ecx
rdmsr
movl %eax, acpi_saved_star