diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-08-03 17:55:12 +0800 | 
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-08-03 17:55:12 +0800 | 
| commit | c5f5aeef9b55b362ad5a0e04e4b41cd63b208842 (patch) | |
| tree | 0ee2bb561e879db0a990d998359f6516dff3393b /arch/mips | |
| parent | a4789089937941959be6c18fa53e1fc0189257fd (diff) | |
| parent | c7513c2a2714204d3588ecaa170ae628fd0d217e (diff) | |
| download | linux-c5f5aeef9b55b362ad5a0e04e4b41cd63b208842.tar.bz2 | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
Merge mainline to pick up c7513c2a2714 ("crypto/arm64: aes-ce-gcm -
add missing kernel_neon_begin/end pair").
Diffstat (limited to 'arch/mips')
| -rw-r--r-- | arch/mips/Kconfig | 1 | ||||
| -rw-r--r-- | arch/mips/ath79/common.c | 2 | ||||
| -rw-r--r-- | arch/mips/ath79/mach-pb44.c | 2 | ||||
| -rw-r--r-- | arch/mips/include/asm/io.h | 2 | ||||
| -rw-r--r-- | arch/mips/include/uapi/asm/unistd.h | 18 | ||||
| -rw-r--r-- | arch/mips/kernel/entry.S | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/mcount.S | 27 | ||||
| -rw-r--r-- | arch/mips/kernel/process.c | 43 | ||||
| -rw-r--r-- | arch/mips/kernel/scall32-o32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-64.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-o32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/signal.c | 3 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 1 | ||||
| -rw-r--r-- | arch/mips/mm/ioremap.c | 37 | ||||
| -rw-r--r-- | arch/mips/pci/pci.c | 2 | 
16 files changed, 104 insertions, 50 deletions
| diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 3f9deec70b92..08c10c518f83 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -65,6 +65,7 @@ config MIPS  	select HAVE_OPROFILE  	select HAVE_PERF_EVENTS  	select HAVE_REGS_AND_STACK_ACCESS_API +	select HAVE_RSEQ  	select HAVE_STACKPROTECTOR  	select HAVE_SYSCALL_TRACEPOINTS  	select HAVE_VIRT_CPU_ACCOUNTING_GEN if 64BIT || !SMP diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c index 10a405d593df..c782b10ddf50 100644 --- a/arch/mips/ath79/common.c +++ b/arch/mips/ath79/common.c @@ -58,7 +58,7 @@ EXPORT_SYMBOL_GPL(ath79_ddr_ctrl_init);  void ath79_ddr_wb_flush(u32 reg)  { -	void __iomem *flush_reg = ath79_ddr_wb_flush_base + reg; +	void __iomem *flush_reg = ath79_ddr_wb_flush_base + (reg * 4);  	/* Flush the DDR write buffer. */  	__raw_writel(0x1, flush_reg); diff --git a/arch/mips/ath79/mach-pb44.c b/arch/mips/ath79/mach-pb44.c index 6b2c6f3baefa..75fb96ca61db 100644 --- a/arch/mips/ath79/mach-pb44.c +++ b/arch/mips/ath79/mach-pb44.c @@ -34,7 +34,7 @@  #define PB44_KEYS_DEBOUNCE_INTERVAL	(3 * PB44_KEYS_POLL_INTERVAL)  static struct gpiod_lookup_table pb44_i2c_gpiod_table = { -	.dev_id = "i2c-gpio", +	.dev_id = "i2c-gpio.0",  	.table = {  		GPIO_LOOKUP_IDX("ath79-gpio", PB44_GPIO_I2C_SDA,  				NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h index a7d0b836f2f7..cea8ad864b3f 100644 --- a/arch/mips/include/asm/io.h +++ b/arch/mips/include/asm/io.h @@ -414,6 +414,8 @@ static inline type pfx##in##bwlq##p(unsigned long port)			\  	__val = *__addr;						\  	slow;								\  									\ +	/* prevent prefetching of coherent DMA data prematurely */	\ +	rmb();								\  	return pfx##ioswab##bwlq(__addr, __val);			\  } diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index bb05e9916a5f..f25dd1d83fb7 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h @@ -388,17 +388,19 @@  #define __NR_pkey_alloc			(__NR_Linux + 364)  #define __NR_pkey_free			(__NR_Linux + 365)  #define __NR_statx			(__NR_Linux + 366) +#define __NR_rseq			(__NR_Linux + 367) +#define __NR_io_pgetevents		(__NR_Linux + 368)  /*   * Offset of the last Linux o32 flavoured syscall   */ -#define __NR_Linux_syscalls		366 +#define __NR_Linux_syscalls		368  #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */  #define __NR_O32_Linux			4000 -#define __NR_O32_Linux_syscalls		366 +#define __NR_O32_Linux_syscalls		368  #if _MIPS_SIM == _MIPS_SIM_ABI64 @@ -733,16 +735,18 @@  #define __NR_pkey_alloc			(__NR_Linux + 324)  #define __NR_pkey_free			(__NR_Linux + 325)  #define __NR_statx			(__NR_Linux + 326) +#define __NR_rseq			(__NR_Linux + 327) +#define __NR_io_pgetevents		(__NR_Linux + 328)  /*   * Offset of the last Linux 64-bit flavoured syscall   */ -#define __NR_Linux_syscalls		326 +#define __NR_Linux_syscalls		328  #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */  #define __NR_64_Linux			5000 -#define __NR_64_Linux_syscalls		326 +#define __NR_64_Linux_syscalls		328  #if _MIPS_SIM == _MIPS_SIM_NABI32 @@ -1081,15 +1085,17 @@  #define __NR_pkey_alloc			(__NR_Linux + 328)  #define __NR_pkey_free			(__NR_Linux + 329)  #define __NR_statx			(__NR_Linux + 330) +#define __NR_rseq			(__NR_Linux + 331) +#define __NR_io_pgetevents		(__NR_Linux + 332)  /*   * Offset of the last N32 flavoured syscall   */ -#define __NR_Linux_syscalls		330 +#define __NR_Linux_syscalls		332  #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */  #define __NR_N32_Linux			6000 -#define __NR_N32_Linux_syscalls		330 +#define __NR_N32_Linux_syscalls		332  #endif /* _UAPI_ASM_UNISTD_H */ diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 38a302919e6b..d7de8adcfcc8 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -79,6 +79,10 @@ FEXPORT(ret_from_fork)  	jal	schedule_tail		# a0 = struct task_struct *prev  FEXPORT(syscall_exit) +#ifdef CONFIG_DEBUG_RSEQ +	move	a0, sp +	jal	rseq_syscall +#endif  	local_irq_disable		# make sure need_resched and  					# signals dont change between  					# sampling and return @@ -141,6 +145,10 @@ work_notifysig:				# deal with pending signals and  	j	resume_userspace_check  FEXPORT(syscall_exit_partial) +#ifdef CONFIG_DEBUG_RSEQ +	move	a0, sp +	jal	rseq_syscall +#endif  	local_irq_disable		# make sure need_resched doesn't  					# change between and return  	LONG_L	a2, TI_FLAGS($28)	# current->work diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index f2ee7e1e3342..cff52b283e03 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S @@ -119,10 +119,20 @@ NESTED(_mcount, PT_SIZE, ra)  EXPORT_SYMBOL(_mcount)  	PTR_LA	t1, ftrace_stub  	PTR_L	t2, ftrace_trace_function /* Prepare t2 for (1) */ -	bne	t1, t2, static_trace +	beq	t1, t2, fgraph_trace  	 nop +	MCOUNT_SAVE_REGS + +	move	a0, ra		/* arg1: self return address */ +	jalr	t2		/* (1) call *ftrace_trace_function */ +	 move	a1, AT		/* arg2: parent's return address */ + +	MCOUNT_RESTORE_REGS + +fgraph_trace:  #ifdef	CONFIG_FUNCTION_GRAPH_TRACER +	PTR_LA	t1, ftrace_stub  	PTR_L	t3, ftrace_graph_return  	bne	t1, t3, ftrace_graph_caller  	 nop @@ -131,24 +141,11 @@ EXPORT_SYMBOL(_mcount)  	bne	t1, t3, ftrace_graph_caller  	 nop  #endif -	b	ftrace_stub -#ifdef CONFIG_32BIT -	 addiu sp, sp, 8 -#else -	 nop -#endif -static_trace: -	MCOUNT_SAVE_REGS - -	move	a0, ra		/* arg1: self return address */ -	jalr	t2		/* (1) call *ftrace_trace_function */ -	 move	a1, AT		/* arg2: parent's return address */ - -	MCOUNT_RESTORE_REGS  #ifdef CONFIG_32BIT  	addiu sp, sp, 8  #endif +  	.globl ftrace_stub  ftrace_stub:  	RETURN_BACK diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index 8d85046adcc8..9670e70139fd 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c @@ -29,6 +29,7 @@  #include <linux/kallsyms.h>  #include <linux/random.h>  #include <linux/prctl.h> +#include <linux/nmi.h>  #include <asm/asm.h>  #include <asm/bootinfo.h> @@ -655,28 +656,42 @@ unsigned long arch_align_stack(unsigned long sp)  	return sp & ALMASK;  } -static void arch_dump_stack(void *info) +static DEFINE_PER_CPU(call_single_data_t, backtrace_csd); +static struct cpumask backtrace_csd_busy; + +static void handle_backtrace(void *info)  { -	struct pt_regs *regs; +	nmi_cpu_backtrace(get_irq_regs()); +	cpumask_clear_cpu(smp_processor_id(), &backtrace_csd_busy); +} -	regs = get_irq_regs(); +static void raise_backtrace(cpumask_t *mask) +{ +	call_single_data_t *csd; +	int cpu; -	if (regs) -		show_regs(regs); +	for_each_cpu(cpu, mask) { +		/* +		 * If we previously sent an IPI to the target CPU & it hasn't +		 * cleared its bit in the busy cpumask then it didn't handle +		 * our previous IPI & it's not safe for us to reuse the +		 * call_single_data_t. +		 */ +		if (cpumask_test_and_set_cpu(cpu, &backtrace_csd_busy)) { +			pr_warn("Unable to send backtrace IPI to CPU%u - perhaps it hung?\n", +				cpu); +			continue; +		} -	dump_stack(); +		csd = &per_cpu(backtrace_csd, cpu); +		csd->func = handle_backtrace; +		smp_call_function_single_async(cpu, csd); +	}  }  void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)  { -	long this_cpu = get_cpu(); - -	if (cpumask_test_cpu(this_cpu, mask) && !exclude_self) -		dump_stack(); - -	smp_call_function_many(mask, arch_dump_stack, NULL, 1); - -	put_cpu(); +	nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_backtrace);  }  int mips_get_process_fp_mode(struct task_struct *task) diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index a9a7d78803cd..91d3c8c46097 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S @@ -590,3 +590,5 @@ EXPORT(sys_call_table)  	PTR	sys_pkey_alloc  	PTR	sys_pkey_free			/* 4365 */  	PTR	sys_statx +	PTR	sys_rseq +	PTR	sys_io_pgetevents diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 65d5aeeb9bdb..358d9599983d 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S @@ -439,4 +439,6 @@ EXPORT(sys_call_table)  	PTR	sys_pkey_alloc  	PTR	sys_pkey_free			/* 5325 */  	PTR	sys_statx +	PTR	sys_rseq +	PTR	sys_io_pgetevents  	.size	sys_call_table,.-sys_call_table diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index cbf190ef9e8a..c65eaacc1abf 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -434,4 +434,6 @@ EXPORT(sysn32_call_table)  	PTR	sys_pkey_alloc  	PTR	sys_pkey_free  	PTR	sys_statx			/* 6330 */ +	PTR	sys_rseq +	PTR	compat_sys_io_pgetevents  	.size	sysn32_call_table,.-sysn32_call_table diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 9ebe3e2403b1..73913f072e39 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -583,4 +583,6 @@ EXPORT(sys32_call_table)  	PTR	sys_pkey_alloc  	PTR	sys_pkey_free			/* 4365 */  	PTR	sys_statx +	PTR	sys_rseq +	PTR	compat_sys_io_pgetevents  	.size	sys32_call_table,.-sys32_call_table diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 9e224469c788..0a9cfe7a0372 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c @@ -801,6 +801,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)  		regs->regs[0] = 0;		/* Don't deal with this again.	*/  	} +	rseq_signal_deliver(ksig, regs); +  	if (sig_uses_siginfo(&ksig->ka, abi))  		ret = abi->setup_rt_frame(vdso + abi->vdso->off_rt_sigreturn,  					  ksig, regs, oldset); @@ -868,6 +870,7 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,  	if (thread_info_flags & _TIF_NOTIFY_RESUME) {  		clear_thread_flag(TIF_NOTIFY_RESUME);  		tracehook_notify_resume(regs); +		rseq_handle_notify_resume(NULL, regs);  	}  	user_enter(); diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index d67fa74622ee..8d505a21396e 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -351,6 +351,7 @@ static void __show_regs(const struct pt_regs *regs)  void show_regs(struct pt_regs *regs)  {  	__show_regs((struct pt_regs *)regs); +	dump_stack();  }  void show_registers(struct pt_regs *regs) diff --git a/arch/mips/mm/ioremap.c b/arch/mips/mm/ioremap.c index 1986e09fb457..1601d90b087b 100644 --- a/arch/mips/mm/ioremap.c +++ b/arch/mips/mm/ioremap.c @@ -9,6 +9,7 @@  #include <linux/export.h>  #include <asm/addrspace.h>  #include <asm/byteorder.h> +#include <linux/ioport.h>  #include <linux/sched.h>  #include <linux/slab.h>  #include <linux/vmalloc.h> @@ -98,6 +99,20 @@ static int remap_area_pages(unsigned long address, phys_addr_t phys_addr,  	return error;  } +static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, +			       void *arg) +{ +	unsigned long i; + +	for (i = 0; i < nr_pages; i++) { +		if (pfn_valid(start_pfn + i) && +		    !PageReserved(pfn_to_page(start_pfn + i))) +			return 1; +	} + +	return 0; +} +  /*   * Generic mapping function (not visible outside):   */ @@ -116,8 +131,8 @@ static int remap_area_pages(unsigned long address, phys_addr_t phys_addr,  void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long flags)  { +	unsigned long offset, pfn, last_pfn;  	struct vm_struct * area; -	unsigned long offset;  	phys_addr_t last_addr;  	void * addr; @@ -137,18 +152,16 @@ void __iomem * __ioremap(phys_addr_t phys_addr, phys_addr_t size, unsigned long  		return (void __iomem *) CKSEG1ADDR(phys_addr);  	/* -	 * Don't allow anybody to remap normal RAM that we're using.. +	 * Don't allow anybody to remap RAM that may be allocated by the page +	 * allocator, since that could lead to races & data clobbering.  	 */ -	if (phys_addr < virt_to_phys(high_memory)) { -		char *t_addr, *t_end; -		struct page *page; - -		t_addr = __va(phys_addr); -		t_end = t_addr + (size - 1); - -		for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) -			if(!PageReserved(page)) -				return NULL; +	pfn = PFN_DOWN(phys_addr); +	last_pfn = PFN_DOWN(last_addr); +	if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL, +				  __ioremap_check_ram) == 1) { +		WARN_ONCE(1, "ioremap on RAM at %pa - %pa\n", +			  &phys_addr, &last_addr); +		return NULL;  	}  	/* diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 9632436d74d7..c2e94cf5ecda 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -54,5 +54,5 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,  	phys_addr_t size = resource_size(rsrc);  	*start = fixup_bigphys_addr(rsrc->start, size); -	*end = rsrc->start + size; +	*end = rsrc->start + size - 1;  } |