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
This commit is contained in:
commit
c1e0d97d3d
10 changed files with 103 additions and 27 deletions
|
@ -5272,8 +5272,7 @@ S: Supported
|
|||
F: drivers/s390/net/
|
||||
|
||||
S390 ZCRYPT DRIVER
|
||||
M: Felix Beck <felix.beck@de.ibm.com>
|
||||
M: Ralph Wuerthner <ralph.wuerthner@de.ibm.com>
|
||||
M: Holger Dengler <hd@linux.vnet.ibm.com>
|
||||
M: linux390@de.ibm.com
|
||||
L: linux-s390@vger.kernel.org
|
||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||
|
|
|
@ -5,10 +5,21 @@ CONFIG_AUDIT=y
|
|||
CONFIG_RCU_TRACE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_RESOURCE_COUNTERS=y
|
||||
CONFIG_CGROUP_MEM_RES_CTLR=y
|
||||
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
|
@ -19,7 +30,9 @@ CONFIG_HIGH_RES_TIMERS=y
|
|||
CONFIG_PREEMPT=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_KSM=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_CMM=m
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_PM=y
|
||||
|
@ -105,6 +118,7 @@ CONFIG_DEBUG_LIST=y
|
|||
CONFIG_DEBUG_NOTIFIERS=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_KPROBES_SANITY_TEST=y
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
|
|
|
@ -169,7 +169,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr)
|
|||
|
||||
static inline int is_compat_task(void)
|
||||
{
|
||||
return test_thread_flag(TIF_31BIT);
|
||||
return is_32bit_task();
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
@ -161,7 +161,9 @@ extern unsigned int vdso_enabled;
|
|||
use of this is to invoke "./ld.so someprog" to test out a new version of
|
||||
the loader. We need to make sure that it is out of the way of the program
|
||||
that it will "exec", and that there is sufficient room for the brk. */
|
||||
#define ELF_ET_DYN_BASE (STACK_TOP / 3 * 2)
|
||||
|
||||
extern unsigned long randomize_et_dyn(unsigned long base);
|
||||
#define ELF_ET_DYN_BASE (randomize_et_dyn(STACK_TOP / 3 * 2))
|
||||
|
||||
/* This yields a mask that user programs can use to figure out what
|
||||
instruction set this CPU supports. */
|
||||
|
@ -206,6 +208,8 @@ do { \
|
|||
current->mm->context.noexec == 0; \
|
||||
})
|
||||
|
||||
#define STACK_RND_MASK 0x7ffUL
|
||||
|
||||
#define ARCH_DLINFO \
|
||||
do { \
|
||||
if (vdso_enabled) \
|
||||
|
@ -218,4 +222,7 @@ struct linux_binprm;
|
|||
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
|
||||
int arch_setup_additional_pages(struct linux_binprm *, int);
|
||||
|
||||
extern unsigned long arch_randomize_brk(struct mm_struct *mm);
|
||||
#define arch_randomize_brk arch_randomize_brk
|
||||
|
||||
#endif
|
||||
|
|
|
@ -449,7 +449,7 @@ extern void (*_machine_restart)(char *command);
|
|||
extern void (*_machine_halt)(void);
|
||||
extern void (*_machine_power_off)(void);
|
||||
|
||||
#define arch_align_stack(x) (x)
|
||||
extern unsigned long arch_align_stack(unsigned long sp);
|
||||
|
||||
static inline int tprot(unsigned long addr)
|
||||
{
|
||||
|
|
|
@ -118,6 +118,12 @@ static inline struct thread_info *current_thread_info(void)
|
|||
#define _TIF_SINGLE_STEP (1<<TIF_FREEZE)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define is_32bit_task() (test_thread_flag(TIF_31BIT))
|
||||
#else
|
||||
#define is_32bit_task() (1)
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define PREEMPT_ACTIVE 0x4000000
|
||||
|
|
|
@ -30,9 +30,11 @@
|
|||
#include <linux/tick.h>
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/random.h>
|
||||
#include <asm/compat.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -332,3 +334,39 @@ unsigned long get_wchan(struct task_struct *p)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long arch_align_stack(unsigned long sp)
|
||||
{
|
||||
if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
|
||||
sp -= get_random_int() & ~PAGE_MASK;
|
||||
return sp & ~0xf;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
unsigned long randomize_et_dyn(unsigned long base)
|
||||
{
|
||||
unsigned long ret = PAGE_ALIGN(base + brk_rnd());
|
||||
|
||||
if (!(current->flags & PF_RANDOMIZE))
|
||||
return base;
|
||||
if (ret < base)
|
||||
return base;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -203,7 +203,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|||
if (!uses_interp)
|
||||
return 0;
|
||||
|
||||
vdso_base = mm->mmap_base;
|
||||
#ifdef CONFIG_64BIT
|
||||
vdso_pagelist = vdso64_pagelist;
|
||||
vdso_pages = vdso64_pages;
|
||||
|
@ -233,8 +232,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|||
* fail and end up putting it elsewhere.
|
||||
*/
|
||||
down_write(&mm->mmap_sem);
|
||||
vdso_base = get_unmapped_area(NULL, vdso_base,
|
||||
vdso_pages << PAGE_SHIFT, 0, 0);
|
||||
vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
|
||||
if (IS_ERR_VALUE(vdso_base)) {
|
||||
rc = vdso_base;
|
||||
goto out_up;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1835,6 +1835,7 @@ static void __ccw_device_pm_restore(struct ccw_device *cdev)
|
|||
* available again. Kick re-detection.
|
||||
*/
|
||||
cdev->private->flags.resuming = 1;
|
||||
cdev->private->path_new_mask = LPM_ANYPATH;
|
||||
css_schedule_eval(sch->schid);
|
||||
spin_unlock_irq(sch->lock);
|
||||
css_complete_work();
|
||||
|
|
Loading…
Reference in a new issue