Commit 3af72a4d98dca033492102603734cbc63cd2694a

Authored by blueswir1
1 parent d445bde7

Fix mremap, based on patch by Kirill A. Shutemov

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6056 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 8 deletions
linux-user/mmap.c
@@ -24,6 +24,8 @@ @@ -24,6 +24,8 @@
24 #include <unistd.h> 24 #include <unistd.h>
25 #include <errno.h> 25 #include <errno.h>
26 #include <sys/mman.h> 26 #include <sys/mman.h>
  27 +#include <linux/mman.h>
  28 +#include <linux/unistd.h>
27 29
28 #include "qemu.h" 30 #include "qemu.h"
29 #include "qemu-common.h" 31 #include "qemu-common.h"
@@ -546,10 +548,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, @@ -546,10 +548,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
546 548
547 mmap_lock(); 549 mmap_lock();
548 550
549 -#if defined(MREMAP_FIXED)  
550 if (flags & MREMAP_FIXED) 551 if (flags & MREMAP_FIXED)
551 - host_addr = mremap(g2h(old_addr), old_size, new_size,  
552 - flags, new_addr); 552 + host_addr = (void *) syscall(__NR_mremap, g2h(old_addr),
  553 + old_size, new_size,
  554 + flags,
  555 + new_addr);
553 else if (flags & MREMAP_MAYMOVE) { 556 else if (flags & MREMAP_MAYMOVE) {
554 abi_ulong mmap_start; 557 abi_ulong mmap_start;
555 558
@@ -559,11 +562,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, @@ -559,11 +562,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
559 errno = ENOMEM; 562 errno = ENOMEM;
560 host_addr = MAP_FAILED; 563 host_addr = MAP_FAILED;
561 } else 564 } else
562 - host_addr = mremap(g2h(old_addr), old_size, new_size,  
563 - flags | MREMAP_FIXED, g2h(mmap_start));  
564 - } else  
565 -#endif  
566 - { 565 + host_addr = (void *) syscall(__NR_mremap, g2h(old_addr),
  566 + old_size, new_size,
  567 + flags | MREMAP_FIXED,
  568 + g2h(mmap_start));
  569 + } else {
567 host_addr = mremap(g2h(old_addr), old_size, new_size, flags); 570 host_addr = mremap(g2h(old_addr), old_size, new_size, flags);
568 /* Check if address fits target address space */ 571 /* Check if address fits target address space */
569 if ((unsigned long)host_addr + new_size > (abi_ulong)-1) { 572 if ((unsigned long)host_addr + new_size > (abi_ulong)-1) {