Chase GDT layout changes and unbreak suspend/resume on amd64.

This commit is contained in:
jkim 2009-04-02 00:23:56 +00:00
parent 84cd3385a2
commit 22270c1fb9
3 changed files with 18 additions and 18 deletions

View File

@ -128,9 +128,19 @@ ENTRY(acpi_restorecpu)
/* Restore descriptor tables. */
lidt WAKEUP_XPCB(IDT)
lldt WAKEUP_XPCB(LDT)
#define SDT_SYSTSS 9
#define SDT_SYSBSY 11
/* Reset task busy bit and reload TR. */
movq PCPU(TSS), %rax
andb $(~SDT_SYSBSY | SDT_SYSTSS), 5(%rax)
movw WAKEUP_XPCB(TR), %ax
ltr %ax
#undef SDT_SYSTSS
#undef SDT_SYSBSY
/* Restore other callee saved registers. */
movq WAKEUP_PCB(R15), %r15
movq WAKEUP_PCB(R14), %r14

View File

@ -223,6 +223,12 @@ reset_video:
bootgdt:
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
bootcode64:
.long 0x0000ffff
@ -261,6 +267,8 @@ wakeup_xpcb:
wakeup_gdt:
.word 0
.quad 0
ALIGN_DATA
wakeup_efer:
.quad 0
wakeup_pat:

View File

@ -78,7 +78,6 @@ static struct xpcb *stopxpcbs;
int acpi_restorecpu(struct xpcb *, vm_offset_t);
int acpi_savecpu(struct xpcb *);
static void acpi_reset_tss(int cpu);
static void acpi_alloc_wakeup_handler(void);
static void acpi_stop_beep(void *);
@ -116,8 +115,6 @@ acpi_wakeup_ap(struct acpi_softc *sc, int cpu)
stopxpcbs[cpu].xpcb_gdt.rd_base);
WAKECODE_FIXUP(wakeup_cpu, int, cpu);
acpi_reset_tss(cpu);
/* do an INIT IPI: assert RESET */
lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id);
@ -220,19 +217,6 @@ acpi_wakeup_cpus(struct acpi_softc *sc, cpumask_t wakeup_cpus)
}
#endif
static void
acpi_reset_tss(int cpu)
{
uint32_t *tss;
/*
* We have to clear "task busy" bit in TSS to restore
* task register later. Otherwise, ltr causes GPF.
*/
tss = (uint32_t *)&gdt[NGDT * cpu + GPROC0_SEL] + 1;
*tss &= ~((SDT_SYSBSY ^ SDT_SYSTSS) << 8);
}
int
acpi_sleep_machdep(struct acpi_softc *sc, int state)
{
@ -289,8 +273,6 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
stopxpcbs[0].xpcb_gdt.rd_base);
WAKECODE_FIXUP(wakeup_cpu, int, 0);
acpi_reset_tss(0);
/* Call ACPICA to enter the desired sleep state */
if (state == ACPI_STATE_S4 && sc->acpi_s4bios)
status = AcpiEnterSleepStateS4bios();