From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LUULu-0004yp-2R for qemu-devel@nongnu.org; Tue, 03 Feb 2009 18:06:46 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LUULm-0004yF-4R for qemu-devel@nongnu.org; Tue, 03 Feb 2009 18:06:38 -0500 Received: from [199.232.76.173] (port=54403 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LUULk-0004yA-Q2 for qemu-devel@nongnu.org; Tue, 03 Feb 2009 18:06:36 -0500 Received: from savannah.gnu.org ([199.232.41.3]:52243 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LUULj-00089f-VG for qemu-devel@nongnu.org; Tue, 03 Feb 2009 18:06:36 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LUULj-0001VU-II for qemu-devel@nongnu.org; Tue, 03 Feb 2009 23:06:35 +0000 Received: from edgar_igl by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LUULj-0001VP-72 for qemu-devel@nongnu.org; Tue, 03 Feb 2009 23:06:35 +0000 MIME-Version: 1.0 Errors-To: edgar_igl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: "Edgar E. Iglesias" Message-Id: Date: Tue, 03 Feb 2009 23:06:35 +0000 Subject: [Qemu-devel] [6510] Partialy fix mmap at EOF for large pagesize targets in user-mode. 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 Revision: 6510 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6510 Author: edgar_igl Date: 2009-02-03 23:06:34 +0000 (Tue, 03 Feb 2009) Log Message: ----------- Partialy fix mmap at EOF for large pagesize targets in user-mode. Signed-off-by: Edgar E. Iglesias Modified Paths: -------------- trunk/linux-user/mmap.c Modified: trunk/linux-user/mmap.c =================================================================== --- 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 = start & qemu_host_page_mask; + /* When mapping files into a memory area larger than the file, accesses + to pages beyond the file size will cause a SIGBUS. + + For example, if mmaping a file of 100 bytes on a host with 4K pages + 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 beyond + 4K. + + 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 pages + 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) == -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 + the hosts real pagesize. Additional anonymous maps + will be created beyond EOF. */ + len = (sb.st_size - offset); + len += qemu_real_host_page_size - 1; + len &= ~(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 = 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 == MAP_FAILED) goto fail; /* update start so that it points to the file position at 'offset' */ host_start = (unsigned long)p; - if (!(flags & MAP_ANONYMOUS)) + if (!(flags & MAP_ANONYMOUS)) { + p = mmap(g2h(mmap_start), len, prot, + flags | MAP_FIXED, fd, host_offset); host_start += offset - host_offset; + } start = h2g(host_start); } else { int flg;