Mark host brk() area as reserved.
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 31 May 2008 16:33:53 +0000 (16:33 +0000)
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 31 May 2008 16:33:53 +0000 (16:33 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4637 c046a42c-6fe2-441c-8c8c-71466251a162

exec.c
linux-user/mmap.c
linux-user/qemu.h

diff --git a/exec.c b/exec.c
index 544e111..a2e71f0 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -234,6 +234,7 @@ static void page_init(void)
         FILE *f;
         int n;
 
+        last_brk = (unsigned long)sbrk(0);
         f = fopen("/proc/self/maps", "r");
         if (f) {
             do {
index b5e31f5..794b1d0 100644 (file)
@@ -157,6 +157,8 @@ static abi_ulong mmap_next_start = 0x18000000;
 static abi_ulong mmap_next_start = 0x40000000;
 #endif
 
+unsigned long last_brk;
+
 /* find a free memory area of size 'size'. The search starts at
    'start'. If 'start' == 0, then a default start address is used.
    Return -1 if error.
@@ -167,6 +169,20 @@ static abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size)
 {
     abi_ulong addr, addr1, addr_start;
     int prot;
+    unsigned long new_brk;
+
+    new_brk = (unsigned long)sbrk(0);
+    if (last_brk && last_brk < new_brk && last_brk == (target_ulong)last_brk) {
+        /* This is a hack to catch the host allocating memory with brk().
+           If it uses mmap then we loose.
+           FIXME: We really want to avoid the host allocating memory in
+           the first place, and maybe leave some slack to avoid switching
+           to mmap.  */
+        page_set_flags(last_brk & TARGET_PAGE_MASK,
+                       TARGET_PAGE_ALIGN(new_brk),
+                       PAGE_RESERVED); 
+    }
+    last_brk = new_brk;
 
     size = HOST_PAGE_ALIGN(size);
     start = start & qemu_host_page_mask;
index 8b11495..093b8ff 100644 (file)
@@ -232,6 +232,7 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
                        abi_ulong new_size, unsigned long flags,
                        abi_ulong new_addr);
 int target_msync(abi_ulong start, abi_ulong len, int flags);
+extern unsigned long last_brk;
 
 /* user access */