diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/mips-cpc.c | 3 | ||||
| -rw-r--r-- | arch/mips/kernel/signal.c | 27 | ||||
| -rw-r--r-- | arch/mips/kernel/syscalls/syscall_n32.tbl | 1 | ||||
| -rw-r--r-- | arch/mips/kernel/syscalls/syscall_n64.tbl | 1 | ||||
| -rw-r--r-- | arch/mips/kernel/syscalls/syscall_o32.tbl | 1 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 2 | 
6 files changed, 24 insertions, 11 deletions
| diff --git a/arch/mips/kernel/mips-cpc.c b/arch/mips/kernel/mips-cpc.c index 8d2535123f11..17aff13cd7ce 100644 --- a/arch/mips/kernel/mips-cpc.c +++ b/arch/mips/kernel/mips-cpc.c @@ -4,6 +4,7 @@   * Author: Paul Burton <[email protected]>   */ +#include <linux/bitfield.h>  #include <linux/errno.h>  #include <linux/percpu.h>  #include <linux/of.h> @@ -97,7 +98,7 @@ void mips_cpc_lock_other(unsigned int core)  	curr_core = cpu_core(¤t_cpu_data);  	spin_lock_irqsave(&per_cpu(cpc_core_lock, curr_core),  			  per_cpu(cpc_core_lock_flags, curr_core)); -	write_cpc_cl_other(core << __ffs(CPC_Cx_OTHER_CORENUM)); +	write_cpc_cl_other(FIELD_PREP(CPC_Cx_OTHER_CORENUM, core));  	/*  	 * Ensure the core-other region reflects the appropriate core & diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index c9b2a75563e1..5bce782e694c 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c @@ -563,6 +563,13 @@ void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,  	sp = regs->regs[29];  	/* +	 * If we are on the alternate signal stack and would overflow it, don't. +	 * Return an always-bogus address instead so we will die with SIGSEGV. +	 */ +	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) +		return (void __user __force *)(-1UL); + +	/*  	 * FPU emulator may have it's own trampoline active just  	 * above the user stack, 16-bytes before the next lowest  	 * 16 byte boundary.  Try to avoid trashing it. @@ -747,23 +754,25 @@ static int setup_rt_frame(void *sig_return, struct ksignal *ksig,  			  struct pt_regs *regs, sigset_t *set)  {  	struct rt_sigframe __user *frame; -	int err = 0;  	frame = get_sigframe(ksig, regs, sizeof(*frame));  	if (!access_ok(frame, sizeof (*frame)))  		return -EFAULT;  	/* Create siginfo.  */ -	err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info); +	if (copy_siginfo_to_user(&frame->rs_info, &ksig->info)) +		return -EFAULT;  	/* Create the ucontext.	 */ -	err |= __put_user(0, &frame->rs_uc.uc_flags); -	err |= __put_user(NULL, &frame->rs_uc.uc_link); -	err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]); -	err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); -	err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); - -	if (err) +	if (__put_user(0, &frame->rs_uc.uc_flags)) +		return -EFAULT; +	if (__put_user(NULL, &frame->rs_uc.uc_link)) +		return -EFAULT; +	if (__save_altstack(&frame->rs_uc.uc_stack, regs->regs[29])) +		return -EFAULT; +	if (setup_sigcontext(regs, &frame->rs_uc.uc_mcontext)) +		return -EFAULT; +	if (__copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)))  		return -EFAULT;  	/* diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl index 72d02d363f36..253ff994ed2e 100644 --- a/arch/mips/kernel/syscalls/syscall_n32.tbl +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -388,3 +388,4 @@  # 447 reserved for memfd_secret  448	n32	process_mrelease		sys_process_mrelease  449	n32	futex_waitv			sys_futex_waitv +450	n32	set_mempolicy_home_node		sys_set_mempolicy_home_node diff --git a/arch/mips/kernel/syscalls/syscall_n64.tbl b/arch/mips/kernel/syscalls/syscall_n64.tbl index e2c481fcede6..3f1886ad9d80 100644 --- a/arch/mips/kernel/syscalls/syscall_n64.tbl +++ b/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -364,3 +364,4 @@  # 447 reserved for memfd_secret  448	n64	process_mrelease		sys_process_mrelease  449	n64	futex_waitv			sys_futex_waitv +450	common	set_mempolicy_home_node		sys_set_mempolicy_home_node diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl index 3714c97b2643..8f243e35a7b2 100644 --- a/arch/mips/kernel/syscalls/syscall_o32.tbl +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -437,3 +437,4 @@  # 447 reserved for memfd_secret  448	o32	process_mrelease		sys_process_mrelease  449	o32	futex_waitv			sys_futex_waitv +450	o32	set_mempolicy_home_node		sys_set_mempolicy_home_node diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index d26b0fb8ea06..a486486b2355 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -422,7 +422,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)  	if (regs && kexec_should_crash(current))  		crash_kexec(regs); -	do_exit(sig); +	make_task_dead(sig);  }  extern struct exception_table_entry __start___dbe_table[]; |