Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parisc: Use generic mmap top-down layout and brk randomization

parisc uses a top-down layout by default that exactly fits the generic
functions, so get rid of arch specific code and use the generic version
by selecting ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT.

Note that on parisc the stack always grows up and a "unlimited stack"
simply means that the value as defined in CONFIG_STACK_MAX_DEFAULT_SIZE_MB
should be used. So RLIM_INFINITY is not an indicator to use the legacy
memory layout.

Signed-off-by: Helge Deller <deller@gmx.de>

+22 -68
+17
arch/parisc/Kconfig
··· 49 49 select TTY # Needed for pdc_cons.c 50 50 select HAS_IOPORT if PCI || EISA 51 51 select HAVE_DEBUG_STACKOVERFLOW 52 + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT 53 + select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT 54 + select HAVE_ARCH_MMAP_RND_BITS 52 55 select HAVE_ARCH_AUDITSYSCALL 53 56 select HAVE_ARCH_HASH 54 57 select HAVE_ARCH_JUMP_LABEL ··· 126 123 bool 127 124 depends on SMP 128 125 default y 126 + 127 + config ARCH_MMAP_RND_BITS_MIN 128 + default 18 if 64BIT 129 + default 8 130 + 131 + config ARCH_MMAP_RND_COMPAT_BITS_MIN 132 + default 8 133 + 134 + config ARCH_MMAP_RND_BITS_MAX 135 + default 24 if 64BIT 136 + default 17 137 + 138 + config ARCH_MMAP_RND_COMPAT_BITS_MAX 139 + default 17 129 140 130 141 # unless you want to implement ACPI on PA-RISC ... ;-) 131 142 config PM
-14
arch/parisc/kernel/process.c
··· 278 278 } while (count++ < MAX_UNWIND_ENTRIES); 279 279 return 0; 280 280 } 281 - 282 - static inline unsigned long brk_rnd(void) 283 - { 284 - return (get_random_u32() & BRK_RND_MASK) << PAGE_SHIFT; 285 - } 286 - 287 - unsigned long arch_randomize_brk(struct mm_struct *mm) 288 - { 289 - unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd()); 290 - 291 - if (ret < mm->brk) 292 - return mm->brk; 293 - return ret; 294 - }
+1 -53
arch/parisc/kernel/sys_parisc.c
··· 161 161 } 162 162 163 163 info.flags = 0; 164 - info.low_limit = mm->mmap_legacy_base; 164 + info.low_limit = mm->mmap_base; 165 165 info.high_limit = mmap_upper_limit(NULL); 166 166 return vm_unmapped_area(&info); 167 167 } ··· 180 180 return arch_get_unmapped_area_common(filp, 181 181 addr, len, pgoff, flags, DOWN); 182 182 } 183 - 184 - static int mmap_is_legacy(void) 185 - { 186 - if (current->personality & ADDR_COMPAT_LAYOUT) 187 - return 1; 188 - 189 - /* parisc stack always grows up - so a unlimited stack should 190 - * not be an indicator to use the legacy memory layout. 191 - * if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) 192 - * return 1; 193 - */ 194 - 195 - return sysctl_legacy_va_layout; 196 - } 197 - 198 - static unsigned long mmap_rnd(void) 199 - { 200 - unsigned long rnd = 0; 201 - 202 - if (current->flags & PF_RANDOMIZE) 203 - rnd = get_random_u32() & MMAP_RND_MASK; 204 - 205 - return rnd << PAGE_SHIFT; 206 - } 207 - 208 - unsigned long arch_mmap_rnd(void) 209 - { 210 - return (get_random_u32() & MMAP_RND_MASK) << PAGE_SHIFT; 211 - } 212 - 213 - static unsigned long mmap_legacy_base(void) 214 - { 215 - return TASK_UNMAPPED_BASE + mmap_rnd(); 216 - } 217 - 218 - /* 219 - * This function, called very early during the creation of a new 220 - * process VM image, sets up which VM layout function to use: 221 - */ 222 - void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack) 223 - { 224 - mm->mmap_legacy_base = mmap_legacy_base(); 225 - mm->mmap_base = mmap_upper_limit(rlim_stack); 226 - 227 - if (mmap_is_legacy()) { 228 - mm->mmap_base = mm->mmap_legacy_base; 229 - mm->get_unmapped_area = arch_get_unmapped_area; 230 - } else { 231 - mm->get_unmapped_area = arch_get_unmapped_area_topdown; 232 - } 233 - } 234 - 235 183 236 184 asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len, 237 185 unsigned long prot, unsigned long flags, unsigned long fd,
+4 -1
mm/util.c
··· 396 396 if (current->personality & ADDR_COMPAT_LAYOUT) 397 397 return 1; 398 398 399 - if (rlim_stack->rlim_cur == RLIM_INFINITY) 399 + /* On parisc the stack always grows up - so a unlimited stack should 400 + * not be an indicator to use the legacy memory layout. */ 401 + if (rlim_stack->rlim_cur == RLIM_INFINITY && 402 + !IS_ENABLED(CONFIG_STACK_GROWSUP)) 400 403 return 1; 401 404 402 405 return sysctl_legacy_va_layout;