From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:52306) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RVN6E-00060e-09 for qemu-devel@nongnu.org; Tue, 29 Nov 2011 07:47:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RVN6C-0007av-S9 for qemu-devel@nongnu.org; Tue, 29 Nov 2011 07:47:49 -0500 Received: from cantor2.suse.de ([195.135.220.15]:55321 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RVN6C-0007ap-Ir for qemu-devel@nongnu.org; Tue, 29 Nov 2011 07:47:48 -0500 Message-ID: <4ED4D446.3010508@suse.de> Date: Tue, 29 Nov 2011 13:47:02 +0100 From: =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= MIME-Version: 1.0 References: <1322492805-5530-1-git-send-email-afaerber@suse.de> In-Reply-To: <1322492805-5530-1-git-send-email-afaerber@suse.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH] exec.c: Fix subpage memory access to RAM MemoryRegion List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl , Avi Kivity , Gleb Natapov Am 28.11.2011 16:06, schrieb Andreas F=C3=A4rber: > Commit 95c318f5e1f88d7e5bcc6deac17330fd4806a2d3 (Fix segfault in mmio s= ubpage > handling code.) prevented a segfault by making all subpage registration= s > over an existing memory page perform an unassigned access. Symptoms wer= e > writes not taking effect and reads returning zero. >=20 > Very small page sizes are not currently supported either, so subpage me= mory > areas cannot fully be avoided. >=20 > Therefore revert the previous fix and defer recognition of IO_MEM_RAM t= o > subpage_{read,write}len() and translate any access there. >=20 > Signed-off-by: Andreas F=C3=A4rber > Cc: Avi Kivity > Cc: Gleb Natapov > Cc: Blue Swirl > --- > exec.c | 33 +++++++++++++++++++++++++++++++-- > 1 files changed, 31 insertions(+), 2 deletions(-) >=20 > diff --git a/exec.c b/exec.c > index 6b92198..fba5ba1 100644 > --- a/exec.c > +++ b/exec.c > @@ -3508,6 +3508,21 @@ static inline uint32_t subpage_readlen (subpage_= t *mmio, > =20 > addr +=3D mmio->region_offset[idx]; > idx =3D mmio->sub_io_index[idx]; > + if (unlikely(idx =3D=3D IO_MEM_RAM)) { > + ram_addr_t raddr =3D /*mmio->base |*/ addr; > + void *ptr =3D qemu_get_ram_ptr(raddr); This... > + switch (len) { > + default: > + case 0: > + return ldub_p(ptr); > + case 1: > + return lduw_p(ptr); > + case 2: > + return ldl_p(ptr); > + case 3: > + return ldq_p(ptr); > + } > + } > return io_mem_read[idx][len](io_mem_opaque[idx], addr); > } > =20 > @@ -3522,6 +3537,22 @@ static inline void subpage_writelen (subpage_t *= mmio, target_phys_addr_t addr, > =20 > addr +=3D mmio->region_offset[idx]; > idx =3D mmio->sub_io_index[idx]; > + if (unlikely(idx =3D=3D IO_MEM_RAM)) { > + ram_addr_t raddr =3D /*mmio->base |*/ addr; > + void *ptr =3D qemu_get_ram_ptr(raddr); ...and/or this seems to lead to "Bad RAM pointer" (or so) when there's ELF code loaded into the subpage at that address despite being IO_MEM_RAM= ? (Seen, e.g., if for RL78 I increase the page size from 12 to 16.) > + switch (len) { > + default: > + case 0: > + stb_p(ptr, value); break; > + case 1: > + stw_p(ptr, value); break; > + case 2: > + stl_p(ptr, value); break; > + case 3: > + stq_p(ptr, value); break; Andreas > + } > + return; > + } > io_mem_write[idx][len](io_mem_opaque[idx], addr, value); > } > =20 > @@ -3583,8 +3614,6 @@ static int subpage_register (subpage_t *mmio, uin= t32_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) =3D=3D IO_MEM_RAM) > - memory =3D IO_MEM_UNASSIGNED; > memory =3D (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); > for (; idx <=3D eidx; idx++) { > mmio->sub_io_index[idx] =3D memory; --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HRB 16746 AG N=C3=BC= rnberg