From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1HSJHr-0006xD-6x for qemu-devel@nongnu.org; Fri, 16 Mar 2007 16:44:31 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1HSJHp-0006wq-Rb for qemu-devel@nongnu.org; Fri, 16 Mar 2007 16:44:30 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1HSJHp-0006wn-MQ for qemu-devel@nongnu.org; Fri, 16 Mar 2007 15:44:29 -0500 Received: from smtp.nokia.com ([131.228.20.173] helo=mgw-ext14.nokia.com) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1HSJGf-0005d7-DD for qemu-devel@nongnu.org; Fri, 16 Mar 2007 16:43:18 -0400 Received: from esebh108.NOE.Nokia.com (esebh108.ntc.nokia.com [172.21.143.145]) by mgw-ext14.nokia.com (Switch-3.2.5/Switch-3.2.5) with ESMTP id l2GKgmKK029484 for ; Fri, 16 Mar 2007 22:43:11 +0200 Subject: Re: [Qemu-devel] qemu-arm: wrong execution of post-indexed loads when Rm and Rd are the same register From: Lauro Ramos Venancio In-Reply-To: <200703152204.41337.paul@codesourcery.com> References: <1173987324.9939.0.camel@edgy-laptop> <200703152110.39814.paul@codesourcery.com> <45F9C0E2.20708@wanadoo.fr> <200703152204.41337.paul@codesourcery.com> Content-Type: multipart/mixed; boundary="=-Ce4qiQCaixobBJ+Dh2Br" Date: Fri, 16 Mar 2007 17:42:42 -0300 Message-Id: <1174077762.5181.5.camel@edgy-laptop> Mime-Version: 1.0 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 --=-Ce4qiQCaixobBJ+Dh2Br Content-Type: text/plain Content-Transfer-Encoding: 7bit I'm sending a new version of the patch that uses Base Restored data abort model. Lauro --=-Ce4qiQCaixobBJ+Dh2Br Content-Disposition: attachment; filename=00_ldr_writeback.patch Content-Type: text/x-patch; name=00_ldr_writeback.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit diff -ru qemu-0.9.0.orig/target-arm/translate.c qemu-0.9.0/target-arm/translate.c --- qemu-0.9.0.orig/target-arm/translate.c 2007-03-16 11:41:28.000000000 -0300 +++ qemu-0.9.0/target-arm/translate.c 2007-03-16 14:59:40.000000000 -0300 @@ -1556,7 +1556,6 @@ gen_ldst(ldsw, s); break; } - gen_movl_reg_T0(s, rd); } else if (sh & 2) { /* doubleword */ if (sh & 1) { @@ -1572,7 +1571,7 @@ gen_movl_reg_T0(s, rd); gen_op_addl_T1_im(4); gen_ldst(ldl, s); - gen_movl_reg_T0(s, rd + 1); + ++rd; } address_offset = -4; } else { @@ -1588,6 +1587,12 @@ gen_op_addl_T1_im(address_offset); gen_movl_reg_T1(s, rn); } + + if ((insn & (1 << 20)) || + ((!(insn & (1 << 20)))&&((sh & 3) == 2))) { + /* load */ + gen_movl_reg_T0(s, rd); + } } break; case 0x4: @@ -1630,10 +1635,6 @@ gen_op_ldl_kernel(); } #endif - if (rd == 15) - gen_bx(s); - else - gen_movl_reg_T0(s, rd); } else { /* store */ gen_movl_T0_reg(s, rd); @@ -1662,6 +1663,13 @@ } else if (insn & (1 << 21)) gen_movl_reg_T1(s, rn); { } + if (insn & (1 << 20)) { + /* load */ + if (rd == 15) + gen_bx(s); + else + gen_movl_reg_T0(s, rd); + } break; case 0x08: case 0x09: Only in qemu-0.9.0/target-arm: translate.c~ --=-Ce4qiQCaixobBJ+Dh2Br--