From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L7pu4-0007wu-Km for qemu-devel@nongnu.org; Wed, 03 Dec 2008 06:28:25 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L7ptz-0007sQ-JK for qemu-devel@nongnu.org; Wed, 03 Dec 2008 06:28:21 -0500 Received: from [199.232.76.173] (port=33381 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L7pty-0007rL-8u for qemu-devel@nongnu.org; Wed, 03 Dec 2008 06:28:18 -0500 Received: from ug-out-1314.google.com ([66.249.92.173]:3632) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1L7ptt-0004E0-Tz for qemu-devel@nongnu.org; Wed, 03 Dec 2008 06:28:14 -0500 Received: by ug-out-1314.google.com with SMTP id 29so3354935ugc.36 for ; Wed, 03 Dec 2008 03:27:49 -0800 (PST) From: "Kirill A. Shutemov" Date: Wed, 3 Dec 2008 13:29:44 +0200 Message-Id: <1228303789-25653-9-git-send-email-kirill@shutemov.name> In-Reply-To: <1228303789-25653-8-git-send-email-kirill@shutemov.name> References: <1228303789-25653-1-git-send-email-kirill@shutemov.name> <1228303789-25653-2-git-send-email-kirill@shutemov.name> <1228303789-25653-3-git-send-email-kirill@shutemov.name> <1228303789-25653-4-git-send-email-kirill@shutemov.name> <1228303789-25653-5-git-send-email-kirill@shutemov.name> <1228303789-25653-6-git-send-email-kirill@shutemov.name> <1228303789-25653-7-git-send-email-kirill@shutemov.name> <1228303789-25653-8-git-send-email-kirill@shutemov.name> Subject: [Qemu-devel] [PATCH] mremap(): handle MREMAP_FIXED and MREMAP_MAYMOVE correctly 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 Cc: "Kirill A. Shutemov" Signed-off-by: Kirill A. Shutemov --- linux-user/mmap.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-) diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 52e2dc8..0a1e27a 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -544,19 +544,41 @@ int target_munmap(abi_ulong start, abi_ulong len) return ret; } -/* XXX: currently, we only handle MAP_ANONYMOUS and not MAP_FIXED - blocks which have been allocated starting on a host page */ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, abi_ulong new_size, unsigned long flags, abi_ulong new_addr) { int prot; - unsigned long host_addr; + void *host_addr; mmap_lock(); - /* XXX: use 5 args syscall */ - host_addr = (long)mremap(g2h(old_addr), old_size, new_size, flags); - if (host_addr == -1) { + + if (flags & MREMAP_FIXED) + host_addr = mremap(g2h(old_addr), old_size, new_size, + flags, new_addr); + else if (flags & MREMAP_MAYMOVE) { + abi_ulong mmap_start; + + mmap_start = mmap_find_vma(0, new_size); + + if (mmap_start == -1) { + errno = ENOMEM; + host_addr = MAP_FAILED; + } else + host_addr = mremap(g2h(old_addr), old_size, new_size, + flags | MREMAP_FIXED, g2h(mmap_start)); + } else { + host_addr = mremap(g2h(old_addr), old_size, new_size, flags); + /* Check if address fits target address space */ + if ((unsigned long)host_addr + new_size > (abi_ulong)-1) { + /* Revert mremap() changes */ + host_addr = mremap(g2h(old_addr), new_size, old_size, flags); + errno = ENOMEM; + host_addr = MAP_FAILED; + } + } + + if (host_addr == MAP_FAILED) { new_addr = -1; } else { new_addr = h2g(host_addr); @@ -564,6 +586,7 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, page_set_flags(old_addr, old_addr + old_size, 0); page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID); } + mmap_unlock(); return new_addr; } -- 1.6.0.2.GIT