Commit 3af72a4d98dca033492102603734cbc63cd2694a
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 | 24 | #include <unistd.h> |
25 | 25 | #include <errno.h> |
26 | 26 | #include <sys/mman.h> |
27 | +#include <linux/mman.h> | |
28 | +#include <linux/unistd.h> | |
27 | 29 | |
28 | 30 | #include "qemu.h" |
29 | 31 | #include "qemu-common.h" |
... | ... | @@ -546,10 +548,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, |
546 | 548 | |
547 | 549 | mmap_lock(); |
548 | 550 | |
549 | -#if defined(MREMAP_FIXED) | |
550 | 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 | 556 | else if (flags & MREMAP_MAYMOVE) { |
554 | 557 | abi_ulong mmap_start; |
555 | 558 | |
... | ... | @@ -559,11 +562,11 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, |
559 | 562 | errno = ENOMEM; |
560 | 563 | host_addr = MAP_FAILED; |
561 | 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 | 570 | host_addr = mremap(g2h(old_addr), old_size, new_size, flags); |
568 | 571 | /* Check if address fits target address space */ |
569 | 572 | if ((unsigned long)host_addr + new_size > (abi_ulong)-1) { | ... | ... |