diff options
Diffstat (limited to 'arch/mips/kernel/syscall.c')
| -rw-r--r-- | arch/mips/kernel/syscall.c | 28 | 
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 9824a829f61..58bab2ef257 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -30,6 +30,7 @@  #include <linux/uaccess.h>  #include <linux/slab.h>  #include <linux/random.h> +#include <linux/elf.h>  #include <asm/asm.h>  #include <asm/branch.h> @@ -153,6 +154,33 @@ void arch_pick_mmap_layout(struct mm_struct *mm)  	mm->unmap_area = arch_unmap_area;  } +static inline unsigned long brk_rnd(void) +{ +	unsigned long rnd = get_random_int(); + +	rnd = rnd << PAGE_SHIFT; +	/* 8MB for 32bit, 256MB for 64bit */ +	if (TASK_IS_32BIT_ADDR) +		rnd = rnd & 0x7ffffful; +	else +		rnd = rnd & 0xffffffful; + +	return rnd; +} + +unsigned long arch_randomize_brk(struct mm_struct *mm) +{ +	unsigned long base = mm->brk; +	unsigned long ret; + +	ret = PAGE_ALIGN(base + brk_rnd()); + +	if (ret < mm->brk) +		return mm->brk; + +	return ret; +} +  SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,  	unsigned long, prot, unsigned long, flags, unsigned long,  	fd, off_t, offset)  |