From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:56141) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RbFkN-0003b7-8A for qemu-devel@nongnu.org; Thu, 15 Dec 2011 13:09:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RbFkL-0006qY-KY for qemu-devel@nongnu.org; Thu, 15 Dec 2011 13:09:35 -0500 Received: from mail-iy0-f173.google.com ([209.85.210.173]:56626) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RbFkL-0006qH-DG for qemu-devel@nongnu.org; Thu, 15 Dec 2011 13:09:33 -0500 Received: by iagj37 with SMTP id j37so3554295iag.4 for ; Thu, 15 Dec 2011 10:09:32 -0800 (PST) Message-ID: <4EEA37D6.6080706@codemonkey.ws> Date: Thu, 15 Dec 2011 12:09:26 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1322666781-6108-1-git-send-email-afaerber@suse.de> In-Reply-To: <1322666781-6108-1-git-send-email-afaerber@suse.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v2] exec.c: Fix subpage memory access to RAM MemoryRegion List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= Cc: qemu-devel@nongnu.org, Gleb Natapov , Avi Kivity On 11/30/2011 09:26 AM, Andreas Färber wrote: > Commit 95c318f5e1f88d7e5bcc6deac17330fd4806a2d3 (Fix segfault in mmio > subpage handling code.) prevented a segfault by making all subpage > registrations over an existing memory page perform an unassigned access. > Symptoms were writes not taking effect and reads returning zero. > > Very small page sizes are not currently supported either, > so subpage memory areas cannot fully be avoided. > > Therefore change the previous fix to use a new IO_MEM_SUBPAGE_RAM > instead of IO_MEM_UNASSIGNED. Suggested by Avi. > > Signed-off-by: Andreas Färber > Cc: Avi Kivity > Cc: Gleb Natapov Applied. Thanks. Regards, Anthony Liguori > --- > cpu-common.h | 1 + > exec.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 64 insertions(+), 2 deletions(-) > > diff --git a/cpu-common.h b/cpu-common.h > index c9878ba..3f45428 100644 > --- a/cpu-common.h > +++ b/cpu-common.h > @@ -172,6 +172,7 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, > #define IO_MEM_ROM (1<< IO_MEM_SHIFT) /* hardcoded offset */ > #define IO_MEM_UNASSIGNED (2<< IO_MEM_SHIFT) > #define IO_MEM_NOTDIRTY (3<< IO_MEM_SHIFT) > +#define IO_MEM_SUBPAGE_RAM (4<< IO_MEM_SHIFT) > > /* Acts like a ROM when read and like a device when written. */ > #define IO_MEM_ROMD (1) > diff --git a/exec.c b/exec.c > index 6b92198..6c206ff 100644 > --- a/exec.c > +++ b/exec.c > @@ -3570,6 +3570,63 @@ static CPUWriteMemoryFunc * const subpage_write[] = { > &subpage_writel, > }; > > +static uint32_t subpage_ram_readb(void *opaque, target_phys_addr_t addr) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + return ldub_p(ptr); > +} > + > +static void subpage_ram_writeb(void *opaque, target_phys_addr_t addr, > + uint32_t value) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + stb_p(ptr, value); > +} > + > +static uint32_t subpage_ram_readw(void *opaque, target_phys_addr_t addr) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + return lduw_p(ptr); > +} > + > +static void subpage_ram_writew(void *opaque, target_phys_addr_t addr, > + uint32_t value) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + stw_p(ptr, value); > +} > + > +static uint32_t subpage_ram_readl(void *opaque, target_phys_addr_t addr) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + return ldl_p(ptr); > +} > + > +static void subpage_ram_writel(void *opaque, target_phys_addr_t addr, > + uint32_t value) > +{ > + ram_addr_t raddr = addr; > + void *ptr = qemu_get_ram_ptr(raddr); > + stl_p(ptr, value); > +} > + > +static CPUReadMemoryFunc * const subpage_ram_read[] = { > +&subpage_ram_readb, > +&subpage_ram_readw, > +&subpage_ram_readl, > +}; > + > +static CPUWriteMemoryFunc * const subpage_ram_write[] = { > +&subpage_ram_writeb, > +&subpage_ram_writew, > +&subpage_ram_writel, > +}; > + > static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, > ram_addr_t memory, ram_addr_t region_offset) > { > @@ -3583,8 +3640,9 @@ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, > printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__, > mmio, start, end, idx, eidx, memory); > #endif > - if ((memory& ~TARGET_PAGE_MASK) == IO_MEM_RAM) > - memory = IO_MEM_UNASSIGNED; > + if ((memory& ~TARGET_PAGE_MASK) == IO_MEM_RAM) { > + memory = IO_MEM_SUBPAGE_RAM; > + } > memory = (memory>> IO_MEM_SHIFT)& (IO_MEM_NB_ENTRIES - 1); > for (; idx<= eidx; idx++) { > mmio->sub_io_index[idx] = memory; > @@ -3817,6 +3875,9 @@ static void io_mem_init(void) > cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read, > notdirty_mem_write, NULL, > DEVICE_NATIVE_ENDIAN); > + cpu_register_io_memory_fixed(IO_MEM_SUBPAGE_RAM, subpage_ram_read, > + subpage_ram_write, NULL, > + DEVICE_NATIVE_ENDIAN); > for (i=0; i<5; i++) > io_mem_used[i] = 1; >