aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/mm/mmap.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-01-14 08:47:26 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-14 08:47:26 -0800
commitc1e0d97d3d63d5173baf8c39a13dc5c25b031bd4 (patch)
tree4bf35b974326f1f17de4ea3d17b65aa44811da01 /arch/s390/mm/mmap.c
parent7f5db6a8022e8d4bb92b3d638068d2c2a9c9b59b (diff)
parent51120c2cc70fc241721b8016f4eff575e7d6aa30 (diff)
downloadkernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.zip
kernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.tar.gz
kernel_samsung_smdk4412-c1e0d97d3d63d5173baf8c39a13dc5c25b031bd4.tar.bz2
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: [S390] MAINTAINERS: Update zcrypt driver entry [S390] Randomize PIEs [S390] Randomise the brk region [S390] Add is_32bit_task() helper function [S390] Randomize lower bits of stack address [S390] Randomize mmap start address [S390] Rearrange mmap.c [S390] Enable flexible mmap layout for 64 bit processes [S390] vdso: dont map at mmap_base [S390] reduce miminum gap between stack and mmap_base [S390] mmap: consider stack address randomization [S390] Update default configuration [S390] cio: path_event overindication after resume
Diffstat (limited to 'arch/s390/mm/mmap.c')
-rw-r--r--arch/s390/mm/mmap.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c
index 869efba..c9a9f7f 100644
--- a/arch/s390/mm/mmap.c
+++ b/arch/s390/mm/mmap.c
@@ -27,17 +27,44 @@
#include <linux/personality.h>
#include <linux/mm.h>
#include <linux/module.h>
+#include <linux/random.h>
#include <asm/pgalloc.h>
#include <asm/compat.h>
+static unsigned long stack_maxrandom_size(void)
+{
+ if (!(current->flags & PF_RANDOMIZE))
+ return 0;
+ if (current->personality & ADDR_NO_RANDOMIZE)
+ return 0;
+ return STACK_RND_MASK << PAGE_SHIFT;
+}
+
/*
* Top of mmap area (just below the process stack).
*
- * Leave an at least ~128 MB hole.
+ * Leave at least a ~32 MB hole.
*/
-#define MIN_GAP (128*1024*1024)
+#define MIN_GAP (32*1024*1024)
#define MAX_GAP (STACK_TOP/6*5)
+static inline int mmap_is_legacy(void)
+{
+ if (current->personality & ADDR_COMPAT_LAYOUT)
+ return 1;
+ if (rlimit(RLIMIT_STACK) == RLIM_INFINITY)
+ return 1;
+ return sysctl_legacy_va_layout;
+}
+
+static unsigned long mmap_rnd(void)
+{
+ if (!(current->flags & PF_RANDOMIZE))
+ return 0;
+ /* 8MB randomization for mmap_base */
+ return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
+}
+
static inline unsigned long mmap_base(void)
{
unsigned long gap = rlimit(RLIMIT_STACK);
@@ -46,22 +73,8 @@ static inline unsigned long mmap_base(void)
gap = MIN_GAP;
else if (gap > MAX_GAP)
gap = MAX_GAP;
-
- return STACK_TOP - (gap & PAGE_MASK);
-}
-
-static inline int mmap_is_legacy(void)
-{
-#ifdef CONFIG_64BIT
- /*
- * Force standard allocation for 64 bit programs.
- */
- if (!is_compat_task())
- return 1;
-#endif
- return sysctl_legacy_va_layout ||
- (current->personality & ADDR_COMPAT_LAYOUT) ||
- rlimit(RLIMIT_STACK) == RLIM_INFINITY;
+ gap &= PAGE_MASK;
+ return STACK_TOP - stack_maxrandom_size() - mmap_rnd() - gap;
}
#ifndef CONFIG_64BIT