1 #include <linux/errno.h>
2 #include <linux/sched.h>
10 #include <linux/stat.h>
11 #include <linux/mman.h>
13 #include <linux/utsname.h>
14 #include <linux/personality.h>
15 #include <linux/random.h>
17 #include <linux/elf.h>
20 #include <asm/syscalls.h>
31 unsigned long tmp_addr;
57 static int __init control_va_addr_alignment(
char *
str)
71 else if (!
strcmp(str,
"64"))
73 else if (!
strcmp(str,
"off"))
75 else if (!
strcmp(str,
"on"))
82 __setup(
"align_va_addr", control_va_addr_alignment);
85 unsigned long, prot,
unsigned long,
flags,
86 unsigned long,
fd,
unsigned long, off)
98 static void find_start_end(
unsigned long flags,
unsigned long *begin,
102 unsigned long new_begin;
125 unsigned long len,
unsigned long pgoff,
unsigned long flags)
130 unsigned long begin,
end;
135 find_start_end(flags, &begin, &end);
143 if (end - len >= addr &&
144 (!vma || addr + len <= vma->
vm_start))
147 if (((flags & MAP_32BIT) || test_thread_flag(
TIF_ADDR32))
148 && len <= mm->cached_hole_size) {
163 if (end - len < addr) {
168 if (start_addr != begin) {
169 start_addr = addr = begin;
175 if (!vma || addr + len <= vma->
vm_start) {
193 const unsigned long len,
const unsigned long pgoff,
194 const unsigned long flags)
208 if (!test_thread_flag(
TIF_ADDR32) && (flags & MAP_32BIT))
216 (!vma || addr + len <= vma->vm_start))
243 if (!vma || addr+len <= vma->vm_start)
253 }
while (len < vma->vm_start);