parisc: add flexible mmap memory layout support
Subsystems (3)
Helge Deller
maintainerPATCH 1/1 parisc: add flexible mmap memory layout support
Add support for the flexible mmap memory layout (as described in
http://lwn.net/Articles/91829). This is especially very interesting on parisc since we currently only support 32bit userspace (even with a 64bit Linux kernel).
Signed-off-by Helge Deller <[email protected]>
arch/parisc/include/asm/elf.h +7 -0
@@ -348,4 +348,11 @@ struct pt_regs; /* forward declaration... */#define ELF_HWCAP 0 +/* Stack randomization: 1GB for 64bit, 8MB for 32bit */ +#define STACK_RND_MASK (is_32bit_task() ? 0x7ff : 0x3fffff) + +struct mm_struct ; +extern unsigned long arch_randomize_brk (struct mm_struct *); +#define arch_randomize_brk arch_randomize_brk +#endif
arch/parisc/include/asm/pgtable.h +1 -0
@@ -511,6 +511,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,/* We provide our own get_unmapped_area to provide cache coherency */ #define HAVE_ARCH_UNMAPPED_AREA +#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
arch/parisc/include/asm/processor.h +2 -0
@@ -30,6 +30,8 @@#endif #define current_text_addr () ({ void *pc; current_ia(pc); pc; }) +#define HAVE_ARCH_PICK_MMAP_LAYOUT +#define TASK_SIZE_OF (tsk) ((tsk)->thread.task_size)#define TASK_SIZE TASK_SIZE_OF(current)#define TASK_UNMAPPED_BASE (current->thread.map_base)
arch/parisc/include/asm/thread_info.h +10 -0
@@ -76,6 +76,16 @@ struct thread_info {#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT) +#ifdef CONFIG_64BIT +# ifdef CONFIG_COMPAT +# define is_32bit_task () (test_thread_flag(TIF_32BIT)) +# else +# define is_32bit_task () (0) +# endif +#else +# define is_32bit_task () (1) +#endif +#endif /* __KERNEL__ */ #endif /* _ASM_PARISC_THREAD_INFO_H */
arch/parisc/kernel/process.c +20 -1
@@ -13,7 +13,7 @@* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> -* Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> +* Copyright (C) 2001-2014 Helge Deller <[email protected]> * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> * *
@@ -49,6 +49,7 @@#include <linux/kallsyms.h> #include <linux/uaccess.h> #include <linux/rcupdate.h> +#include <linux/random.h> #include <asm/io.h> #include <asm/asm-offsets.h>
@@ -286,3 +287,21 @@ void *dereference_function_descriptor(void *ptr) return ptr; }#endif + +static inline unsigned long brk_rnd (void ) +{ +/* 8MB for 32bit, 1GB for 64bit */ +if (is_32bit_task ()) +return (get_random_int () &0x7ffUL ) <<PAGE_SHIFT ; +else +return (get_random_int () &0x3ffffUL ) <<PAGE_SHIFT ; +} + +unsigned long arch_randomize_brk (struct mm_struct *mm) +{ +unsigned long ret =PAGE_ALIGN (mm->brk +brk_rnd ()); + +if (ret < mm->brk) +return mm->brk; +return ret; +}
arch/parisc/kernel/sys_parisc.c +196 -42
286 lines not on this page · raw message
fs/exec.c +3 -0
@@ -659,6 +659,9 @@ int setup_arg_pages(struct linux_binprm *bprm,if (stack_base > (1 <<30 )) stack_base =1 <<30 ; +/* add some more stack size for stack randomization */ + stack_base +=STACK_RND_MASK +1 ; +/* Make sure we didn't let the argument array grow too large. */ if (vma->vm_end - vma->vm_start > stack_base)return -ENOMEM ;