diff options
Diffstat (limited to 'arch/s390/kernel/process.c')
| -rw-r--r-- | arch/s390/kernel/process.c | 35 | 
1 files changed, 19 insertions, 16 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index c5dbb335716..93b9ca42e5c 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c @@ -64,7 +64,7 @@ unsigned long thread_saved_pc(struct task_struct *tsk)  void arch_cpu_idle(void)  {  	local_mcck_disable(); -	if (test_thread_flag(TIF_MCCK_PENDING)) { +	if (test_cpu_flag(CIF_MCCK_PENDING)) {  		local_mcck_enable();  		local_irq_enable();  		return; @@ -76,7 +76,7 @@ void arch_cpu_idle(void)  void arch_cpu_idle_exit(void)  { -	if (test_thread_flag(TIF_MCCK_PENDING)) +	if (test_cpu_flag(CIF_MCCK_PENDING))  		s390_handle_mcck();  } @@ -123,7 +123,6 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	memset(&p->thread.per_user, 0, sizeof(p->thread.per_user));  	memset(&p->thread.per_event, 0, sizeof(p->thread.per_event));  	clear_tsk_thread_flag(p, TIF_SINGLE_STEP); -	clear_tsk_thread_flag(p, TIF_PER_TRAP);  	/* Initialize per thread user and system timer values */  	ti = task_thread_info(p);  	ti->user_timer = 0; @@ -139,7 +138,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	if (unlikely(p->flags & PF_KTHREAD)) {  		/* kernel thread */  		memset(&frame->childregs, 0, sizeof(struct pt_regs)); -		frame->childregs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | +		frame->childregs.psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT |  				PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;  		frame->childregs.psw.addr = PSW_ADDR_AMODE |  				(unsigned long) kernel_thread_starter; @@ -152,6 +151,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	}  	frame->childregs = *current_pt_regs();  	frame->childregs.gprs[2] = 0;	/* child returns 0 on fork. */ +	frame->childregs.flags = 0;  	if (new_stackp)  		frame->childregs.gprs[15] = new_stackp; @@ -165,7 +165,8 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  	 * save fprs to current->thread.fp_regs to merge them with  	 * the emulated registers and then copy the result to the child.  	 */ -	save_fp_regs(¤t->thread.fp_regs); +	save_fp_ctl(¤t->thread.fp_regs.fpc); +	save_fp_regs(current->thread.fp_regs.fprs);  	memcpy(&p->thread.fp_regs, ¤t->thread.fp_regs,  	       sizeof(s390_fp_regs));  	/* Set a new TLS ?  */ @@ -173,7 +174,9 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,  		p->thread.acrs[0] = frame->childregs.gprs[6];  #else /* CONFIG_64BIT */  	/* Save the fpu registers to new thread structure. */ -	save_fp_regs(&p->thread.fp_regs); +	save_fp_ctl(&p->thread.fp_regs.fpc); +	save_fp_regs(p->thread.fp_regs.fprs); +	p->thread.fp_regs.pad = 0;  	/* Set a new TLS ?  */  	if (clone_flags & CLONE_SETTLS) {  		unsigned long tls = frame->childregs.gprs[6]; @@ -205,10 +208,12 @@ int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs)  	 * save fprs to current->thread.fp_regs to merge them with  	 * the emulated registers and then copy the result to the dump.  	 */ -	save_fp_regs(¤t->thread.fp_regs); +	save_fp_ctl(¤t->thread.fp_regs.fpc); +	save_fp_regs(current->thread.fp_regs.fprs);  	memcpy(fpregs, ¤t->thread.fp_regs, sizeof(s390_fp_regs));  #else /* CONFIG_64BIT */ -	save_fp_regs(fpregs); +	save_fp_ctl(&fpregs->fpc); +	save_fp_regs(fpregs->fprs);  #endif /* CONFIG_64BIT */  	return 1;  } @@ -256,20 +261,18 @@ static inline unsigned long brk_rnd(void)  unsigned long arch_randomize_brk(struct mm_struct *mm)  { -	unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd()); +	unsigned long ret; -	if (ret < mm->brk) -		return mm->brk; -	return ret; +	ret = PAGE_ALIGN(mm->brk + brk_rnd()); +	return (ret > mm->brk) ? ret : mm->brk;  }  unsigned long randomize_et_dyn(unsigned long base)  { -	unsigned long ret = PAGE_ALIGN(base + brk_rnd()); +	unsigned long ret;  	if (!(current->flags & PF_RANDOMIZE))  		return base; -	if (ret < base) -		return base; -	return ret; +	ret = PAGE_ALIGN(base + brk_rnd()); +	return (ret > base) ? ret : base;  }  | 
