From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LUoC3-0007TW-C6 for qemu-devel@nongnu.org; Wed, 04 Feb 2009 15:17:55 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LUoC1-0007TI-Su for qemu-devel@nongnu.org; Wed, 04 Feb 2009 15:17:55 -0500 Received: from [199.232.76.173] (port=36221 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LUoC1-0007TD-LD for qemu-devel@nongnu.org; Wed, 04 Feb 2009 15:17:53 -0500 Received: from soufre.accelance.net ([213.162.48.15]:56717) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LUoC1-0003Uu-4V for qemu-devel@nongnu.org; Wed, 04 Feb 2009 15:17:53 -0500 Received: from [192.168.0.3] (potipota.net [88.168.176.51]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by soufre.accelance.net (Postfix) with ESMTP id 164DF4500A for ; Wed, 4 Feb 2009 21:17:48 +0100 (CET) Subject: Re: [Qemu-devel] [6510] Partialy fix mmap at EOF for large pagesize targets in user-mode. From: Lionel Landwerlin In-Reply-To: References: Content-Type: text/plain; charset=utf-8 Date: Wed, 04 Feb 2009 21:17:44 +0100 Message-Id: <1233778664.18362.1.camel@cocoduo.atr> Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 Le mardi 03 f=C3=A9vrier 2009 =C3=A0 23:06 +0000, Edgar E. Iglesias a =C3= =A9crit : > Revision: 6510 > http://svn.sv.gnu.org/viewvc/?view=3Drev&root=3Dqemu&revision= =3D6510 > Author: edgar_igl > Date: 2009-02-03 23:06:34 +0000 (Tue, 03 Feb 2009) >=20 > Log Message: > ----------- > Partialy fix mmap at EOF for large pagesize targets in user-mode. >=20 > Signed-off-by: Edgar E. Iglesias >=20 > Modified Paths: > -------------- > trunk/linux-user/mmap.c >=20 > Modified: trunk/linux-user/mmap.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- trunk/linux-user/mmap.c 2009-02-03 22:45:00 UTC (rev 6509) > +++ trunk/linux-user/mmap.c 2009-02-03 23:06:34 UTC (rev 6510) > @@ -24,6 +24,8 @@ > #include > #include > #include > +#include > +#include > #include > #include > #include > @@ -366,6 +368,36 @@ > goto the_end; > real_start =3D start & qemu_host_page_mask; > =20 > + /* When mapping files into a memory area larger than the file, acc= esses > + to pages beyond the file size will cause a SIGBUS.=20 > + > + For example, if mmaping a file of 100 bytes on a host with 4K p= ages > + emulating a target with 8K pages, the target expects to be able= to > + access the first 8K. But the host will trap us on any access be= yond > + 4K. =20 > + > + When emulating a target with a larger page-size than the hosts,= we > + may need to truncate file maps at EOF and add extra anonymous p= ages > + up to the targets page boundary. */ > + > + if ((qemu_real_host_page_size < TARGET_PAGE_SIZE) > + && !(flags & MAP_ANONYMOUS)) { > + struct stat sb; > + > + if (fstat (fd, &sb) =3D=3D -1) > + goto fail; > + > + /* Are we trying to create a map beyond EOF?. */ > + if (offset + len > sb.st_size) { > + /* If so, truncate the file map at eof aligned with=20 > + the hosts real pagesize. Additional anonymous maps > + will be created beyond EOF. */ > + len =3D (sb.st_size - offset); > + len +=3D qemu_real_host_page_size - 1; > + len &=3D ~(qemu_real_host_page_size - 1); > + } > + } > + > if (!(flags & MAP_FIXED)) { > abi_ulong mmap_start; > void *p; > @@ -381,13 +413,16 @@ > especially important if qemu_host_page_size > > qemu_real_host_page_size */ > p =3D mmap(g2h(mmap_start), > - host_len, prot, flags | MAP_FIXED, fd, host_offset); > + host_len, prot, flags | MAP_FIXED | MAP_ANONYMOUS, -1= , 0); > if (p =3D=3D MAP_FAILED) > goto fail; > /* update start so that it points to the file position at 'off= set' */ > host_start =3D (unsigned long)p; > - if (!(flags & MAP_ANONYMOUS)) > + if (!(flags & MAP_ANONYMOUS)) { > + p =3D mmap(g2h(mmap_start), len, prot,=20 > + flags | MAP_FIXED, fd, host_offset); > host_start +=3D offset - host_offset; > + } > start =3D h2g(host_start); > } else { > int flg; >=20 We also need to check when mmap_start pointer is inside the code generation buffer. --=20 =EF=BB=BFLione Landwerlin =20 =EF=BB=BF O p e n W i d e 14, rue Gaillon 75002 Paris