From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:54986) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RV9sP-0006WO-Ed for qemu-devel@nongnu.org; Mon, 28 Nov 2011 17:40:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RV9sL-0005ZS-AO for qemu-devel@nongnu.org; Mon, 28 Nov 2011 17:40:41 -0500 Received: from cantor2.suse.de ([195.135.220.15]:42450 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RV9sL-0005ZO-04 for qemu-devel@nongnu.org; Mon, 28 Nov 2011 17:40:37 -0500 Message-ID: <4ED40DB6.3020701@suse.de> Date: Mon, 28 Nov 2011 23:39:50 +0100 From: =?ISO-8859-1?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1322492805-5530-1-git-send-email-afaerber@suse.de> <4ED3C22E.1070607@redhat.com> In-Reply-To: <4ED3C22E.1070607@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 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: Avi Kivity Cc: Blue Swirl , qemu-devel@nongnu.org, Gleb Natapov Am 28.11.2011 18:17, schrieb Avi Kivity: > On 11/28/2011 05:06 PM, Andreas F=E4rber wrote: >> Commit 95c318f5e1f88d7e5bcc6deac17330fd4806a2d3 (Fix segfault in mmio = subpage >> handling code.) prevented a segfault by making all subpage registratio= ns >> over an existing memory page perform an unassigned access. Symptoms we= re >> writes not taking effect and reads returning zero. >> >> Very small page sizes are not currently supported either, so subpage m= emory >> areas cannot fully be avoided. >> >> Therefore revert the previous fix and defer recognition of IO_MEM_RAM = to >> subpage_{read,write}len() and translate any access there. >> >> Signed-off-by: Andreas F=E4rber >> Cc: Avi Kivity >> Cc: Gleb Natapov >> Cc: Blue Swirl >> --- >> exec.c | 33 +++++++++++++++++++++++++++++++-- >> 1 files changed, 31 insertions(+), 2 deletions(-) >> >> 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)) { >=20 > IMO, io_mem_init() should have something like >=20 > cpu_register_io_memory_fixed(IO_MEM_SUBPAGE_RAM, subpage_ram_read, > subpage_ram_write, ...); >=20 > so you don't need those ugly switches; you just convert IO_MEM_RAM to > IO_MEM_SUBPAGE_RAM. Maybe even register IO_MEM_RAM itself. Note need > to handle dirty logging carefully. That didn't work because cpu_register_io_memory_fixed() is called from subpage_init(), which is called once for the whole page only, and the actual subpages are set up with multiple calls to subpage_register() instead. Andreas --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=F6rffer; HRB 16746 AG N=FCrnbe= rg