9 #include <linux/compiler.h>
10 #include <linux/errno.h>
12 #include <linux/mman.h>
13 #include <linux/module.h>
14 #include <linux/personality.h>
15 #include <linux/random.h>
16 #include <linux/sched.h>
22 #define MIN_GAP (128*1024*1024UL)
23 #define MAX_GAP ((TASK_SIZE)/6*5)
25 static int mmap_is_legacy(
void)
48 static inline unsigned long COLOUR_ALIGN_DOWN(
unsigned long addr,
54 if (base + off <= addr)
60 #define COLOUR_ALIGN(addr, pgoff) \
61 ((((addr) + shm_align_mask) & ~shm_align_mask) + \
62 (((pgoff) << PAGE_SHIFT) & shm_align_mask))
66 static unsigned long arch_get_unmapped_area_common(
struct file *filp,
67 unsigned long addr0,
unsigned long len,
unsigned long pgoff,
72 unsigned long addr = addr0;
94 if (filp || (flags & MAP_SHARED))
106 (!vma || addr + len <= vma->
vm_start))
121 if (!vma || addr + len <= vma->
vm_start)
129 if (len <= mm->cached_hole_size) {
139 if (do_color_align) {
141 COLOUR_ALIGN_DOWN(addr - len, pgoff);
148 if (!vma || addr <= vma->
vm_start) {
159 addr = COLOUR_ALIGN_DOWN(addr, pgoff);
180 addr = COLOUR_ALIGN_DOWN(addr, pgoff);
181 }
while (
likely(len < vma->vm_start));
204 unsigned long len,
unsigned long pgoff,
unsigned long flags)
206 return arch_get_unmapped_area_common(filp,
207 addr0, len, pgoff, flags,
UP);
215 unsigned long addr0,
unsigned long len,
unsigned long pgoff,
218 return arch_get_unmapped_area_common(filp,
219 addr0, len, pgoff, flags,
DOWN);
224 unsigned long random_factor = 0
UL;
229 if (TASK_IS_32BIT_ADDR)
230 random_factor &= 0xfffffful;
232 random_factor &= 0xffffffful;
235 if (mmap_is_legacy()) {
240 mm->
mmap_base = mmap_base(random_factor);
246 static inline unsigned long brk_rnd(
void)
252 if (TASK_IS_32BIT_ADDR)
253 rnd = rnd & 0x7ffffful;
255 rnd = rnd & 0xffffffful;
262 unsigned long base = mm->
brk;