diff options
Diffstat (limited to 'arch/x86/kernel/process.c')
| -rw-r--r-- | arch/x86/kernel/process.c | 22 | 
1 files changed, 19 insertions, 3 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index ca989158e84..994dd6a4a2a 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -8,12 +8,15 @@  #include <linux/module.h>  #include <linux/pm.h>  #include <linux/clockchips.h> +#include <linux/random.h>  #include <trace/power.h>  #include <asm/system.h>  #include <asm/apic.h> +#include <asm/syscalls.h>  #include <asm/idle.h>  #include <asm/uaccess.h>  #include <asm/i387.h> +#include <asm/ds.h>  unsigned long idle_halt;  EXPORT_SYMBOL(idle_halt); @@ -45,6 +48,8 @@ void free_thread_xstate(struct task_struct *tsk)  		kmem_cache_free(task_xstate_cachep, tsk->thread.xstate);  		tsk->thread.xstate = NULL;  	} + +	WARN(tsk->thread.ds_ctx, "leaking DS context\n");  }  void free_thread_info(struct thread_info *ti) @@ -58,7 +63,7 @@ void arch_task_cache_init(void)          task_xstate_cachep =          	kmem_cache_create("task_xstate", xstate_size,  				  __alignof__(union thread_xstate), -				  SLAB_PANIC, NULL); +				  SLAB_PANIC | SLAB_NOTRACK, NULL);  }  /* @@ -83,8 +88,6 @@ void exit_thread(void)  		put_cpu();  		kfree(bp);  	} - -	ds_exit_thread(current);  }  void flush_thread(void) @@ -613,3 +616,16 @@ static int __init idle_setup(char *str)  }  early_param("idle", idle_setup); +unsigned long arch_align_stack(unsigned long sp) +{ +	if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +		sp -= get_random_int() % 8192; +	return sp & ~0xf; +} + +unsigned long arch_randomize_brk(struct mm_struct *mm) +{ +	unsigned long range_end = mm->brk + 0x02000000; +	return randomize_range(mm->brk, range_end, 0) ? : mm->brk; +} +  |