Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Apr 2009 00:23:56 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r190635 - head/sys/amd64/acpica
Message-ID:  <200904020023.n320Nu0u046562@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Thu Apr  2 00:23:56 2009
New Revision: 190635
URL: http://svn.freebsd.org/changeset/base/190635

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

Modified:
  head/sys/amd64/acpica/acpi_switch.S
  head/sys/amd64/acpica/acpi_wakecode.S
  head/sys/amd64/acpica/acpi_wakeup.c

Modified: head/sys/amd64/acpica/acpi_switch.S
==============================================================================
--- head/sys/amd64/acpica/acpi_switch.S	Wed Apr  1 21:14:01 2009	(r190634)
+++ head/sys/amd64/acpica/acpi_switch.S	Thu Apr  2 00:23:56 2009	(r190635)
@@ -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

Modified: head/sys/amd64/acpica/acpi_wakecode.S
==============================================================================
--- head/sys/amd64/acpica/acpi_wakecode.S	Wed Apr  1 21:14:01 2009	(r190634)
+++ head/sys/amd64/acpica/acpi_wakecode.S	Thu Apr  2 00:23:56 2009	(r190635)
@@ -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:

Modified: head/sys/amd64/acpica/acpi_wakeup.c
==============================================================================
--- head/sys/amd64/acpica/acpi_wakeup.c	Wed Apr  1 21:14:01 2009	(r190634)
+++ head/sys/amd64/acpica/acpi_wakeup.c	Thu Apr  2 00:23:56 2009	(r190635)
@@ -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, in
 	    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, 
 }
 #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
 		    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();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904020023.n320Nu0u046562>