From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53266) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZMsU-0005sK-0O for qemu-devel@nongnu.org; Mon, 06 May 2013 10:59:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UZMsR-0007zP-Ld for qemu-devel@nongnu.org; Mon, 06 May 2013 10:58:57 -0400 Received: from david.siemens.de ([192.35.17.14]:24620) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZMsR-0007xv-AG for qemu-devel@nongnu.org; Mon, 06 May 2013 10:58:55 -0400 Message-ID: <5187C526.9010606@siemens.com> Date: Mon, 06 May 2013 16:58:46 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <5187C473.5070101@redhat.com> In-Reply-To: <5187C473.5070101@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC][PATCH 11/15] memory: Allow unaligned address_space_rw List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: Liu Ping Fan , qemu-devel , =?ISO-8859-15?Q?Andreas_F=E4rbe?= =?ISO-8859-15?Q?r?= On 2013-05-06 16:55, Paolo Bonzini wrote: > Il 06/05/2013 16:26, Jan Kiszka ha scritto: >> This will be needed for some corner cases with para-virtual the I/O >> ports. >> >> Signed-off-by: Jan Kiszka >> --- >> exec.c | 33 ++++++++++++++++++--------------- >> 1 files changed, 18 insertions(+), 15 deletions(-) >> >> diff --git a/exec.c b/exec.c >> index 3ee1f3f..9c582b1 100644 >> --- a/exec.c >> +++ b/exec.c >> @@ -1833,38 +1833,41 @@ void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf, >> uint8_t *ptr; >> uint32_t val; >> MemoryRegionSection *section; >> + MemoryRegion *mr; >> >> while (len > 0) { >> l = ((addr & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE) - addr; >> if (l > len) >> l = len; >> section = address_space_lookup_region(as, addr); >> + mr = section->mr; >> >> if (is_write) { >> - if (!memory_region_is_ram(section->mr)) { >> + if (!memory_region_is_ram(mr)) { >> hwaddr addr1; >> addr1 = memory_region_section_addr(section, addr); >> /* XXX: could force cpu_single_env to NULL to avoid >> potential bugs */ >> - if (l >= 4 && ((addr1 & 3) == 0)) { >> + if (l >= 4 && ((addr1 & 3) == 0 || mr->ops->impl.unaligned)) { > > Does the length matter at all if unaligned accesses are allowed? I > think it shouldn't... What do you mean? The length test here is not about alignment, it's about proper split-up depending on the input size (we cannot use 32 bit for all accesses and do not want to make them all byte accesses, do we?). Jan -- Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux