From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d2xR6-0003qU-Gy for qemu-devel@nongnu.org; Tue, 25 Apr 2017 06:11:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d2xR2-0004Yv-DS for qemu-devel@nongnu.org; Tue, 25 Apr 2017 06:11:08 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:35471) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d2xR2-0004Ym-2i for qemu-devel@nongnu.org; Tue, 25 Apr 2017 06:11:04 -0400 Received: by mail-wr0-x242.google.com with SMTP id g12so6299423wrg.2 for ; Tue, 25 Apr 2017 03:11:04 -0700 (PDT) Sender: Richard Henderson References: <20170423215420.27098-1-shorne@gmail.com> From: Richard Henderson Message-ID: Date: Tue, 25 Apr 2017 12:11:00 +0200 MIME-Version: 1.0 In-Reply-To: <20170423215420.27098-1-shorne@gmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH RFC] target/openrisc: Support non-busy idle state using PMR SPR List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stafford Horne Cc: QEMU Development , Openrisc On 04/23/2017 11:54 PM, Stafford Horne wrote: > The OpenRISC architecture has the Power Management Register (PMR) > special purpose register to manage cpu power states. The interesting > modes are: > > * Doze Mode (DME) - Stop cpu except timer & pic - wake on interrupt > * Sleep Mode (SME) - Stop cpu and all units - wake on interrupt > * Suspend Model (SUME) - Stop cpu and all units - wake on reset > > The linux kernel will set DME when idle. And SUME would be, essentially, poweroff? Perhaps at least for the purposes of QEMU; on real hardware one could press a button to assert reset and reboot. > Also, I don't know if its due to this patch of an issue with the timer > interrupts. After applying this patch the timer interrupts do not trigger > until a keypress is make. i.e. something like this... > > $ sleep 5 > ... > + cpu_restore_state(cs, GETPC() + 4); This isn't correct. You want cpu_restore_state(cs, GETPC()); cs->env.pc += 4; So what's happening is that you're re-executing the MTSPR and going back to sleep again. Which probably explains the hang. r~