From owner-svn-src-stable@FreeBSD.ORG Wed Apr 11 19:37:09 2012 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6B9F71065670; Wed, 11 Apr 2012 19:37:09 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 561C38FC12; Wed, 11 Apr 2012 19:37:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q3BJb91r092258; Wed, 11 Apr 2012 19:37:09 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q3BJb95Z092255; Wed, 11 Apr 2012 19:37:09 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201204111937.q3BJb95Z092255@svn.freebsd.org> From: John Baldwin Date: Wed, 11 Apr 2012 19:37:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234141 - in stable/9/sys: i386/acpica i386/conf kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Apr 2012 19:37:09 -0000 Author: jhb Date: Wed Apr 11 19:37:08 2012 New Revision: 234141 URL: http://svn.freebsd.org/changeset/base/234141 Log: MFC 232742: MFamd64: - Return failure for a suspend attempt if we have no wake address. - Use intr_disable()/intr_restore() instead of ACPI_DISABLE_IRQS(). - Invoke intr_suspend() earlier and call intr_resume() if suspend fails. - Use pause in the loop waiting for CPU to suspend. - Restore PAT MSR, switchtime, switchticks, and MTRRs on resume. Modified: stable/9/sys/i386/acpica/acpi_wakeup.c Directory Properties: stable/9/sys/ (props changed) stable/9/sys/amd64/include/xen/ (props changed) stable/9/sys/boot/ (props changed) stable/9/sys/boot/i386/efi/ (props changed) stable/9/sys/boot/ia64/efi/ (props changed) stable/9/sys/boot/ia64/ski/ (props changed) stable/9/sys/boot/powerpc/boot1.chrp/ (props changed) stable/9/sys/boot/powerpc/ofw/ (props changed) stable/9/sys/cddl/contrib/opensolaris/ (props changed) stable/9/sys/conf/ (props changed) stable/9/sys/contrib/dev/acpica/ (props changed) stable/9/sys/contrib/octeon-sdk/ (props changed) stable/9/sys/contrib/pf/ (props changed) stable/9/sys/contrib/x86emu/ (props changed) stable/9/sys/fs/ (props changed) stable/9/sys/fs/ntfs/ (props changed) stable/9/sys/i386/conf/XENHVM (props changed) stable/9/sys/kern/subr_witness.c (props changed) Modified: stable/9/sys/i386/acpica/acpi_wakeup.c ============================================================================== --- stable/9/sys/i386/acpica/acpi_wakeup.c Wed Apr 11 16:11:08 2012 (r234140) +++ stable/9/sys/i386/acpica/acpi_wakeup.c Wed Apr 11 19:37:08 2012 (r234141) @@ -33,6 +33,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include @@ -200,13 +202,14 @@ acpi_sleep_machdep(struct acpi_softc *sc uint32_t cr3; u_long ef; - ret = 0; + ret = -1; if (sc->acpi_wakeaddr == 0) - return (0); + return (ret); AcpiSetFirmwareWakingVector(sc->acpi_wakephys); - ef = read_eflags(); + ef = intr_disable(); + intr_suspend(); /* * Temporarily switch to the kernel pmap because it provides an @@ -222,10 +225,8 @@ acpi_sleep_machdep(struct acpi_softc *sc #endif ret_addr = 0; - ACPI_DISABLE_IRQS(); if (acpi_savecpu()) { /* Execute Sleep */ - intr_suspend(); p_gdt = (struct region_descriptor *) (sc->acpi_wakeaddr + physical_gdt); @@ -267,25 +268,31 @@ acpi_sleep_machdep(struct acpi_softc *sc device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n", AcpiFormatException(status)); - ret = -1; goto out; } - for (;;) ; + for (;;) + ia32_pause(); } else { - /* Execute Wakeup */ - mca_resume(); - intr_resume(); - + pmap_init_pat(); + PCPU_SET(switchtime, 0); + PCPU_SET(switchticks, ticks); if (bootverbose) { acpi_savecpu(); acpi_printcpu(); } + ret = 0; } out: load_cr3(cr3); - write_eflags(ef); + mca_resume(); + intr_resume(); + intr_restore(ef); + + if (ret == 0 && mem_range_softc.mr_op != NULL && + mem_range_softc.mr_op->reinit != NULL) + mem_range_softc.mr_op->reinit(&mem_range_softc); /* If we beeped, turn it off after a delay. */ if (acpi_resume_beep)