From owner-freebsd-acpi@FreeBSD.ORG Tue Oct 3 00:30:08 2006 Return-Path: X-Original-To: freebsd-acpi@freebsd.org Delivered-To: freebsd-acpi@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2933916A412; Tue, 3 Oct 2006 00:30:08 +0000 (UTC) (envelope-from nate@root.org) Received: from ylpvm01.prodigy.net (ylpvm01-ext.prodigy.net [207.115.57.32]) by mx1.FreeBSD.org (Postfix) with ESMTP id 9E91743D46; Tue, 3 Oct 2006 00:30:07 +0000 (GMT) (envelope-from nate@root.org) X-ORBL: [67.119.74.222] Received: from [10.0.0.44] (adsl-67-119-74-222.dsl.sntc01.pacbell.net [67.119.74.222]) by ylpvm01.prodigy.net (8.13.7 out spool5000 dk/8.13.7) with ESMTP id k930TS1Q015985; Mon, 2 Oct 2006 20:29:29 -0400 Message-ID: <4521AF05.50208@root.org> Date: Mon, 02 Oct 2006 17:29:57 -0700 From: Nate Lawson User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) MIME-Version: 1.0 To: Andrea Bittau References: <20060921000628.GA1832@shorty.sorbonet.org> <200610021424.18562.jhb@freebsd.org> <20061002223055.GA8217@shorty.sorbonet.org> In-Reply-To: <20061002223055.GA8217@shorty.sorbonet.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-acpi@freebsd.org, freebsd-mobile@freebsd.org Subject: Re: hack for getting suspend/resume to half work on an IBM Thinkpad x60s [SMP] X-BeenThere: freebsd-acpi@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: ACPI and power management development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Oct 2006 00:30:08 -0000 Andrea Bittau wrote: > On Mon, Oct 02, 2006 at 02:24:18PM -0400, John Baldwin wrote: >> well as resuming the local APIC. Can you test this w/o SMP and make sure it >> works? > > I'll give it a shot as soon as I get some time. > >> Probably we need to get onto the BSP via sched_bind() during suspend and then >> stop the other CPUs using stop_cpus(). The hard part, however, is properly > > Yea I do that in acpi_SetSleepState(). Essentially I copied the shutdown code. > >> resuming the darn things. Do you know what mode the CPUs come back up in? >> It looks like we need to resend startup IPIs to them from your patch. > > Yea it all comes back in real mode. I've tried using the standard freebsd "boot > code" for waking up the second CPU. There were some issues with the BSP not > using PTD_Idle. I don't know enough about computers and freebsd to know what > exactly that means. Also, when the second CPU came back, if it entered the > scheduler, it would die, so I had to leave it in the idle loop by setting the > cpu_hlt mask. > > Anyway, the correct way to do it I think is to generalize the save state & > wakeup code used by the BSP in acpi_sleep_machdep(). That is, the second core > should save its state and wake up the same way as the BSP does. It should not > use the "come to life mechanism" used at boot-time. The reason is that the > memory is setup properly and the second core should have saved registers which > make sense so less "initialization and setup" needs to be performed. I disagree. Instead of trying to capture all that register state, including MSRs, MTRRs, etc., it seems easier just to reinitialize from scratch. We'll need to do that anyway once suspend-to-disk is implemented since that kind of resume is equivalent to a hard power cycle. -- Nate