Add support for MAP_TRYFIXED
authorSimon Schubert <corecode@dragonflybsd.org>
Mon, 1 Dec 2008 12:12:24 +0000 (13:12 +0100)
committerSimon Schubert <corecode@dragonflybsd.org>
Mon, 1 Dec 2008 18:59:23 +0000 (19:59 +0100)
MAP_TRYFIXED signals to the kernel that the process is well aware
that the hint might fall into the heap area, but that it would still
like to map the area.  I think this is necessary for wine.

sys/sys/mman.h
sys/vm/vm_mmap.c

index 805d5a2..8ce6a0d 100644 (file)
@@ -82,6 +82,7 @@
 #define        MAP_HASSEMAPHORE 0x0200 /* region may contain semaphores */
 #define        MAP_STACK        0x0400 /* region grows down, like a stack */
 #define        MAP_NOSYNC       0x0800 /* page to but do not sync underlying file */
+#define        MAP_TRYFIXED    0x10000 /* attempt hint address, even within heap */
 
 #ifdef _P1003_1B_VISIBLE
 /*
index 4d0cd00..758d844 100644 (file)
@@ -229,19 +229,20 @@ kern_mmap(struct vmspace *vms, caddr_t uaddr, size_t ulen,
                        return (EINVAL);
                if (addr + size < addr)
                        return (EINVAL);
+       } else if ((flags & MAP_TRYFIXED) == 0) {
+               /*
+                * XXX for non-fixed mappings where no hint is provided or
+                * the hint would fall in the potential heap space,
+                * place it after the end of the largest possible heap.
+                *
+                * There should really be a pmap call to determine a reasonable
+                * location.
+                */
+               if (addr == 0 ||
+                   (addr >= round_page((vm_offset_t)vms->vm_taddr) &&
+                    addr < round_page((vm_offset_t)vms->vm_daddr + maxdsiz)))
+                       addr = round_page((vm_offset_t)vms->vm_daddr + maxdsiz);
        }
-       /*
-        * XXX for non-fixed mappings where no hint is provided or
-        * the hint would fall in the potential heap space,
-        * place it after the end of the largest possible heap.
-        *
-        * There should really be a pmap call to determine a reasonable
-        * location.
-        */
-       else if (addr == 0 ||
-           (addr >= round_page((vm_offset_t)vms->vm_taddr) &&
-            addr < round_page((vm_offset_t)vms->vm_daddr + maxdsiz)))
-               addr = round_page((vm_offset_t)vms->vm_daddr + maxdsiz);
 
        if (flags & MAP_ANON) {
                /*