From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KyA0I-0004RS-KW for qemu-devel@nongnu.org; Thu, 06 Nov 2008 13:54:50 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KyA0I-0004Qd-1D for qemu-devel@nongnu.org; Thu, 06 Nov 2008 13:54:50 -0500 Received: from [199.232.76.173] (port=33168 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KyA0H-0004QU-Kz for qemu-devel@nongnu.org; Thu, 06 Nov 2008 13:54:49 -0500 Received: from savannah.gnu.org ([199.232.41.3]:50734 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KyA0H-0003JY-Oe for qemu-devel@nongnu.org; Thu, 06 Nov 2008 13:54:49 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KyA0F-0008Q3-Ko for qemu-devel@nongnu.org; Thu, 06 Nov 2008 18:54:47 +0000 Received: from malc by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KyA0F-0008Pv-8v for qemu-devel@nongnu.org; Thu, 06 Nov 2008 18:54:47 +0000 MIME-Version: 1.0 Errors-To: malc Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: malc Message-Id: Date: Thu, 06 Nov 2008 18:54:47 +0000 Subject: [Qemu-devel] [5643] Fix interrupt exclusion via SSTEP_NOIRQ Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 5643 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5643 Author: malc Date: 2008-11-06 18:54:46 +0000 (Thu, 06 Nov 2008) Log Message: ----------- Fix interrupt exclusion via SSTEP_NOIRQ Commit #5620 revealed an issue of the SSTEP_NOIRQ masking that was applied on all interrupt sources (including internal ones) when single stepping through the guest. Due to that commit, we now ended up in an infinite loop when CPU_INTERRUPT_EXIT was pending on SSTEP resume. That was due to #5620 eating all TBs while CPU_INTERRUPT_EXIT is pending, but SSTEP_NOIRQ preventing CPU_INTERRUPT_EXIT to be processed. What SSTEP_NOIRQ should actually do is to block the delivery of all external, guest visible interrupts. With the fix below applied, single stepping now works again. Signed-off-by: Jan Kiszka Modified Paths: -------------- trunk/cpu-exec.c Modified: trunk/cpu-exec.c =================================================================== --- trunk/cpu-exec.c 2008-11-06 16:15:18 UTC (rev 5642) +++ trunk/cpu-exec.c 2008-11-06 18:54:46 UTC (rev 5643) @@ -384,8 +384,14 @@ next_tb = 0; /* force lookup of first TB */ for(;;) { interrupt_request = env->interrupt_request; - if (unlikely(interrupt_request) && - likely(!(env->singlestep_enabled & SSTEP_NOIRQ))) { + if (unlikely(interrupt_request)) { + if (unlikely(env->singlestep_enabled & SSTEP_NOIRQ)) { + /* Mask out external interrupts for this step. */ + interrupt_request &= ~(CPU_INTERRUPT_HARD | + CPU_INTERRUPT_FIQ | + CPU_INTERRUPT_SMI | + CPU_INTERRUPT_NMI); + } if (interrupt_request & CPU_INTERRUPT_DEBUG) { env->interrupt_request &= ~CPU_INTERRUPT_DEBUG; env->exception_index = EXCP_DEBUG;