diff options
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/kernel/sys_sparc_64.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index f836f4e93afe..96082d30def0 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
@@ -360,20 +360,25 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u | |||
360 | } | 360 | } |
361 | EXPORT_SYMBOL(get_fb_unmapped_area); | 361 | EXPORT_SYMBOL(get_fb_unmapped_area); |
362 | 362 | ||
363 | /* Essentially the same as PowerPC... */ | 363 | /* Essentially the same as PowerPC. */ |
364 | void arch_pick_mmap_layout(struct mm_struct *mm) | 364 | static unsigned long mmap_rnd(void) |
365 | { | 365 | { |
366 | unsigned long random_factor = 0UL; | 366 | unsigned long rnd = 0UL; |
367 | unsigned long gap; | ||
368 | 367 | ||
369 | if (current->flags & PF_RANDOMIZE) { | 368 | if (current->flags & PF_RANDOMIZE) { |
370 | random_factor = get_random_int(); | 369 | unsigned long val = get_random_int(); |
371 | if (test_thread_flag(TIF_32BIT)) | 370 | if (test_thread_flag(TIF_32BIT)) |
372 | random_factor &= ((1 * 1024 * 1024) - 1); | 371 | rnd = (val % (1UL << (22UL-PAGE_SHIFT))); |
373 | else | 372 | else |
374 | random_factor = ((random_factor << PAGE_SHIFT) & | 373 | rnd = (val % (1UL << (29UL-PAGE_SHIFT))); |
375 | 0xffffffffUL); | ||
376 | } | 374 | } |
375 | return (rnd << PAGE_SHIFT) * 2; | ||
376 | } | ||
377 | |||
378 | void arch_pick_mmap_layout(struct mm_struct *mm) | ||
379 | { | ||
380 | unsigned long random_factor = mmap_rnd(); | ||
381 | unsigned long gap; | ||
377 | 382 | ||
378 | /* | 383 | /* |
379 | * Fall back to the standard layout if the personality | 384 | * Fall back to the standard layout if the personality |