From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1IlzK2-0005gO-4g for qemu-devel@nongnu.org; Sun, 28 Oct 2007 00:00:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1IlzJx-0005f7-9n for qemu-devel@nongnu.org; Sun, 28 Oct 2007 00:00:20 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IlzJw-0005f3-O1 for qemu-devel@nongnu.org; Sun, 28 Oct 2007 00:00:16 -0400 Received: from kuber.nabble.com ([216.139.236.158]) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1IlzJv-0002pb-UM for qemu-devel@nongnu.org; Sun, 28 Oct 2007 00:00:16 -0400 Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1IlzJt-0005Ob-G1 for qemu-devel@nongnu.org; Sat, 27 Oct 2007 21:00:13 -0700 Message-ID: <13449885.post@talk.nabble.com> Date: Sat, 27 Oct 2007 21:00:13 -0700 (PDT) From: TeLeMan Subject: [Qemu-devel] [PATCH]bug fix for softmmu slow_st unaligned access MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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 For example, the memory address 0x10008000 is on an unwritable page.When the instruction "add dword ptr [0x10007FFF],0x12345678" is executed,the OS will set 0x10008000 page be a writable page and re-execute this instruction. But softmmu has modifed the value of 0x10007FFF,so after re-executing this instruction, the final result is wrong(double-added on 0x10007FFF). Reversing the stored byte order can fix this bug. softmmu.patch: *** qemu.orig/softmmu_template.h Sun Oct 28 11:15:52 2007 --- qemu/softmmu_template.h Sun Oct 28 11:22:24 2007 *************** static void glue(glue(slow_st, SUFFIX), *** 282,288 **** } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { do_unaligned_access: /* XXX: not efficient, but simple */ ! for(i = 0;i < DATA_SIZE; i++) { #ifdef TARGET_WORDS_BIGENDIAN glue(slow_stb, MMUSUFFIX)(addr + i, val >> (((DATA_SIZE - 1) * 8) - (i * 8)), mmu_idx, retaddr); --- 282,288 ---- } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { do_unaligned_access: /* XXX: not efficient, but simple */ ! for(i = DATA_SIZE-1;i >= 0; i--) { #ifdef TARGET_WORDS_BIGENDIAN glue(slow_stb, MMUSUFFIX)(addr + i, val >> (((DATA_SIZE - 1) * 8) - (i * 8)), mmu_idx, retaddr); http://www.nabble.com/file/p13449885/softmmu.patch softmmu.patch -- View this message in context: http://www.nabble.com/-PATCH-bug-fix-for-softmmu-slow_st-unaligned-access-tf4705397.html#a13449885 Sent from the QEMU - Dev mailing list archive at Nabble.com.