diff options
Diffstat (limited to 'arch/parisc/kernel')
| -rw-r--r-- | arch/parisc/kernel/Makefile | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/audit.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/binfmt_elf32.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/compat_audit.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/firmware.c | 20 | ||||
| -rw-r--r-- | arch/parisc/kernel/ftrace.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/pa7300lc.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/parisc_ksyms.c | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/pci-dma.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/pdt.c | 10 | ||||
| -rw-r--r-- | arch/parisc/kernel/process.c | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/processor.c | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/ptrace.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/setup.c | 6 | ||||
| -rw-r--r-- | arch/parisc/kernel/signal.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/smp.c | 3 | ||||
| -rw-r--r-- | arch/parisc/kernel/sys_parisc32.c | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/syscall.S | 6 | ||||
| -rw-r--r-- | arch/parisc/kernel/time.c | 6 | ||||
| -rw-r--r-- | arch/parisc/kernel/traps.c | 11 | ||||
| -rw-r--r-- | arch/parisc/kernel/unwind.c | 13 | ||||
| -rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 1 | 
22 files changed, 79 insertions, 13 deletions
| diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile index c4294df69fb6..649dc3eda448 100644 --- a/arch/parisc/kernel/Makefile +++ b/arch/parisc/kernel/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for arch/parisc/kernel  # diff --git a/arch/parisc/kernel/audit.c b/arch/parisc/kernel/audit.c index eb64a6148c82..9eb47b2225d2 100644 --- a/arch/parisc/kernel/audit.c +++ b/arch/parisc/kernel/audit.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/init.h>  #include <linux/types.h>  #include <linux/audit.h> diff --git a/arch/parisc/kernel/binfmt_elf32.c b/arch/parisc/kernel/binfmt_elf32.c index f2adcf33f8f2..20dfa081ed0b 100644 --- a/arch/parisc/kernel/binfmt_elf32.c +++ b/arch/parisc/kernel/binfmt_elf32.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Support for 32-bit Linux/Parisc ELF binaries on 64 bit kernels   * diff --git a/arch/parisc/kernel/compat_audit.c b/arch/parisc/kernel/compat_audit.c index c74478f6bc74..20c39c9d86a9 100644 --- a/arch/parisc/kernel/compat_audit.c +++ b/arch/parisc/kernel/compat_audit.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <asm/unistd.h>  unsigned int parisc32_dir_class[] = { diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index ab80e5c6f651..6d471c00c71a 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -233,6 +233,26 @@ int pdc_add_valid(unsigned long address)  EXPORT_SYMBOL(pdc_add_valid);  /** + * pdc_instr - Get instruction that invokes PDCE_CHECK in HPMC handler. + * @instr: Pointer to variable which will get instruction opcode. + * + * The return value is PDC_OK (0) in case call succeeded. + */ +int __init pdc_instr(unsigned int *instr) +{ +	int retval; +	unsigned long flags; + +	spin_lock_irqsave(&pdc_lock, flags); +	retval = mem_pdc_call(PDC_INSTR, 0UL, __pa(pdc_result)); +	convert_to_wide(pdc_result); +	*instr = pdc_result[0]; +	spin_unlock_irqrestore(&pdc_lock, flags); + +	return retval; +} + +/**   * pdc_chassis_info - Return chassis information.   * @result: The return buffer.   * @chassis_info: The memory buffer address. diff --git a/arch/parisc/kernel/ftrace.c b/arch/parisc/kernel/ftrace.c index 5a5506a35395..6fa8535d3cce 100644 --- a/arch/parisc/kernel/ftrace.c +++ b/arch/parisc/kernel/ftrace.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Code for tracing calls in Linux kernel.   * Copyright (C) 2009-2016 Helge Deller <[email protected]> diff --git a/arch/parisc/kernel/pa7300lc.c b/arch/parisc/kernel/pa7300lc.c index 9b245fc67560..0d770ac83f70 100644 --- a/arch/parisc/kernel/pa7300lc.c +++ b/arch/parisc/kernel/pa7300lc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *   linux/arch/parisc/kernel/pa7300lc.c   *	- PA7300LC-specific functions	 diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index c6d6272a934f..7baa2265d439 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c @@ -35,12 +35,12 @@ EXPORT_SYMBOL(memset);  EXPORT_SYMBOL(__xchg8);  EXPORT_SYMBOL(__xchg32);  EXPORT_SYMBOL(__cmpxchg_u32); +EXPORT_SYMBOL(__cmpxchg_u64);  #ifdef CONFIG_SMP  EXPORT_SYMBOL(__atomic_hash);  #endif  #ifdef CONFIG_64BIT  EXPORT_SYMBOL(__xchg64); -EXPORT_SYMBOL(__cmpxchg_u64);  #endif  #include <linux/uaccess.h> diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index bd4c0a7471d3..412231d101f9 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*  ** PARISC 1.1 Dynamic DMA mapping support.  ** This implementation is for PA-RISC platforms that do not support diff --git a/arch/parisc/kernel/pdt.c b/arch/parisc/kernel/pdt.c index 05730a83895c..e07eb34c8750 100644 --- a/arch/parisc/kernel/pdt.c +++ b/arch/parisc/kernel/pdt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *    Page Deallocation Table (PDT) support   * @@ -15,6 +16,7 @@  #include <linux/memblock.h>  #include <linux/seq_file.h>  #include <linux/kthread.h> +#include <linux/initrd.h>  #include <asm/pdc.h>  #include <asm/pdcpat.h> @@ -216,8 +218,16 @@ void __init pdc_pdt_init(void)  	}  	for (i = 0; i < pdt_status.pdt_entries; i++) { +		unsigned long addr; +  		report_mem_err(pdt_entry[i]); +		addr = pdt_entry[i] & PDT_ADDR_PHYS_MASK; +		if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && +			addr >= initrd_start && addr < initrd_end) +			pr_crit("CRITICAL: initrd possibly broken " +				"due to bad memory!\n"); +  		/* mark memory page bad */  		memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);  	} diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index a45a67d526f8..30f92391a93e 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c @@ -146,7 +146,7 @@ void machine_power_off(void)  	/* prevent soft lockup/stalled CPU messages for endless loop. */  	rcu_sysrq_start(); -	lockup_detector_suspend(); +	lockup_detector_soft_poweroff();  	for (;;);  } diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index a778bd3c107c..e120d63c1b28 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c @@ -317,7 +317,7 @@ void __init collect_boot_cpu_data(void)   *   * o Enable CPU profiling hooks.   */ -int init_per_cpu(int cpunum) +int __init init_per_cpu(int cpunum)  {  	int ret;  	struct pdc_coproc_cfg coproc_cfg; diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index f8b6959d2d97..1a2be6e639b5 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Kernel support for the ptrace() and syscall tracing interfaces.   * diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index dee6f9d6a153..f7d0c3b33d70 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c @@ -38,6 +38,7 @@  #include <linux/export.h>  #include <linux/sched.h>  #include <linux/sched/clock.h> +#include <linux/start_kernel.h>  #include <asm/processor.h>  #include <asm/sections.h> @@ -48,6 +49,7 @@  #include <asm/io.h>  #include <asm/setup.h>  #include <asm/unwind.h> +#include <asm/smp.h>  static char __initdata command_line[COMMAND_LINE_SIZE]; @@ -115,7 +117,6 @@ void __init dma_ops_init(void)  }  #endif -extern int init_per_cpu(int cpuid);  extern void collect_boot_cpu_data(void);  void __init setup_arch(char **cmdline_p) @@ -398,9 +399,8 @@ static int __init parisc_init(void)  }  arch_initcall(parisc_init); -void start_parisc(void) +void __init start_parisc(void)  { -	extern void start_kernel(void);  	extern void early_trap_init(void);  	int ret, cpunum; diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 26f12f45b4bb..f2a4038e275b 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *  linux/arch/parisc/kernel/signal.c: Architecture-specific signal   *  handling support. diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 63365106ea19..30c28ab14540 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -255,12 +255,11 @@ void arch_send_call_function_single_ipi(int cpu)  static void __init  smp_cpu_init(int cpunum)  { -	extern int init_per_cpu(int);  /* arch/parisc/kernel/processor.c */  	extern void init_IRQ(void);    /* arch/parisc/kernel/irq.c */  	extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */  	/* Set modes and Enable floating point coprocessor */ -	(void) init_per_cpu(cpunum); +	init_per_cpu(cpunum);  	disable_sr_hashing(); diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 93c1963d76fe..2a12a547b447 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * sys_parisc32.c: Conversion between 32bit and 64bit native syscalls.   * diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 23de307c3052..41e60a9c7db2 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S @@ -742,7 +742,7 @@ lws_compare_and_swap_2:  10:	ldd	0(%r25), %r25  11:	ldd	0(%r24), %r24  #else -	/* Load new value into r22/r23 - high/low */ +	/* Load old value into r22/r23 - high/low */  10:	ldw	0(%r25), %r22  11:	ldw	4(%r25), %r23  	/* Load new value into fr4 for atomic store later */ @@ -834,11 +834,11 @@ cas2_action:  	copy	%r0, %r28  #else  	/* Compare first word */ -19:	ldw,ma	0(%r26), %r29 +19:	ldw	0(%r26), %r29  	sub,=	%r29, %r22, %r0  	b,n	cas2_end  	/* Compare second word */ -20:	ldw,ma	4(%r26), %r29 +20:	ldw	4(%r26), %r29  	sub,=	%r29, %r23, %r0  	b,n	cas2_end  	/* Perform the store */ diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 2d956aa0a38a..4b8fd6dc22da 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *  linux/arch/parisc/kernel/time.c   * @@ -253,7 +254,10 @@ static int __init init_cr16_clocksource(void)  		cpu0_loc = per_cpu(cpu_data, 0).cpu_loc;  		for_each_online_cpu(cpu) { -			if (cpu0_loc == per_cpu(cpu_data, cpu).cpu_loc) +			if (cpu == 0) +				continue; +			if ((cpu0_loc != 0) && +			    (cpu0_loc == per_cpu(cpu_data, cpu).cpu_loc))  				continue;  			clocksource_cr16.name = "cr16_unstable"; diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 991654c88eec..8453724b8009 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *  linux/arch/parisc/traps.c   * @@ -817,7 +818,7 @@ void __init initialize_ivt(const void *iva)  	u32 check = 0;  	u32 *ivap;  	u32 *hpmcp; -	u32 length; +	u32 length, instr;  	if (strcmp((const char *)iva, "cows can fly"))  		panic("IVT invalid"); @@ -827,6 +828,14 @@ void __init initialize_ivt(const void *iva)  	for (i = 0; i < 8; i++)  	    *ivap++ = 0; +	/* +	 * Use PDC_INSTR firmware function to get instruction that invokes +	 * PDCE_CHECK in HPMC handler.  See programming note at page 1-31 of +	 * the PA 1.1 Firmware Architecture document. +	 */ +	if (pdc_instr(&instr) == PDC_OK) +		ivap[0] = instr; +  	/* Compute Checksum for HPMC handler */  	length = os_hpmc_size;  	ivap[7] = length; diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index 48dc7d4d20bb..5a657986ebbf 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Kernel unwinding support   * @@ -14,6 +15,7 @@  #include <linux/slab.h>  #include <linux/kallsyms.h>  #include <linux/sort.h> +#include <linux/sched.h>  #include <linux/uaccess.h>  #include <asm/assembly.h> @@ -279,6 +281,17 @@ static void unwind_frame_regs(struct unwind_frame_info *info)  			info->prev_sp = sp - 64;  			info->prev_ip = 0; + +			/* The stack is at the end inside the thread_union +			 * struct. If we reach data, we have reached the +			 * beginning of the stack and should stop unwinding. */ +			if (info->prev_sp >= (unsigned long) task_thread_info(info->t) && +			    info->prev_sp < ((unsigned long) task_thread_info(info->t) +						+ THREAD_SZ_ALGN)) { +				info->prev_sp = 0; +				break; +			} +  			if (get_user(tmp, (unsigned long *)(info->prev_sp - RP_OFFSET)))   				break;  			info->prev_ip = tmp; diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index ffe2cbf52d1a..159a2ec0b4e0 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*    Kernel link layout for various "sections"   *   *    Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org> |