From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52820) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xmh0B-0002IF-B7 for qemu-devel@nongnu.org; Fri, 07 Nov 2014 05:42:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xmh05-0003et-8R for qemu-devel@nongnu.org; Fri, 07 Nov 2014 05:42:47 -0500 Received: from mailapp01.imgtec.com ([195.59.15.196]:50603) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xmh05-0003eh-3e for qemu-devel@nongnu.org; Fri, 07 Nov 2014 05:42:41 -0500 Message-ID: <545CA21F.2070207@imgtec.com> Date: Fri, 7 Nov 2014 10:42:39 +0000 From: Leon Alrae MIME-Version: 1.0 References: In-Reply-To: Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH RESEND] mips: Ensure PC update with MTC0 single-stepping List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Maciej W. Rozycki" , qemu-devel@nongnu.org Cc: Aurelien Jarno On 06/11/2014 20:38, Maciej W. Rozycki wrote: > Correct the way PC is updated when single-stepping instructions, by > keeping the old PC only for the BS_EXCP (exception condition) state. > > Some MTC0 (and possibly other) instructions switch to the BS_STOP state > to terminate the current translation block, so that the state transition > of the simulated CPU resulting from the CP0 operation takes effect with > the following instruction. This happens with `mtc0 ,c0_config' for > example, typically used to set KSEG0 cacheability. > > While single-stepping this has a side-effect of not advancing the PC > past the instruction just executed; subsequent single-step traps will > stop at the same instruction repeatedly. Example: > > (gdb) stepi > 0x80004d24 in _start () > 5: x/i $pc > => 0x80004d24 <_start+364>: mfc0 t1,c0_config > (gdb) > 0x80004d28 in _start () > 5: x/i $pc > => 0x80004d28 <_start+368>: li at,-8 > (gdb) > 0x80004d2c in _start () > 5: x/i $pc > => 0x80004d2c <_start+372>: and t1,t1,at > (gdb) > 0x80004d30 in _start () > 5: x/i $pc > => 0x80004d30 <_start+376>: ori t1,t1,0x3 > (gdb) > 0x80004d34 in _start () > 5: x/i $pc > => 0x80004d34 <_start+380>: mtc0 t1,c0_config > (gdb) > 0x80004d34 in _start () > 5: x/i $pc > => 0x80004d34 <_start+380>: mtc0 t1,c0_config > (gdb) > 0x80004d34 in _start () > 5: x/i $pc > => 0x80004d34 <_start+380>: mtc0 t1,c0_config > (gdb) > 0x80004d34 in _start () > 5: x/i $pc > => 0x80004d34 <_start+380>: mtc0 t1,c0_config > (gdb) > > -- oops! > > Signed-off-by: Maciej W. Rozycki > --- > It's been lost and waited for too long now, the original submission has > been archived here: > > http://lists.gnu.org/archive/html/qemu-devel/2012-06/msg01227.html > > I have verified with a manual check that the issue is still there and > that the fix still works. Please apply. > > Maciej > > qemu-mips-mtc0-step.diff > Index: qemu-git-trunk/target-mips/translate.c > =================================================================== > --- qemu-git-trunk.orig/target-mips/translate.c 2014-11-02 18:51:10.838947420 +0000 > +++ qemu-git-trunk/target-mips/translate.c 2014-11-02 18:51:14.838939198 +0000 > @@ -17522,7 +17522,7 @@ gen_intermediate_code_internal(MIPSCPU * > gen_io_end(); > } > if (cs->singlestep_enabled && ctx.bstate != BS_BRANCH) { > - save_cpu_state(&ctx, ctx.bstate == BS_NONE); > + save_cpu_state(&ctx, ctx.bstate != BS_EXCP); > gen_helper_0e0i(raise_exception, EXCP_DEBUG); > } else { > switch (ctx.bstate) { > Good fix for 2.2, thanks. Reviewed-by: Leon Alrae Regards, Leon