diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/cmpxchg.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/idle.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/kprobes.c | 36 | ||||
| -rw-r--r-- | arch/mips/kernel/mips-cpc.c | 1 | ||||
| -rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 17 | ||||
| -rw-r--r-- | arch/mips/kernel/smp.c | 6 | 
8 files changed, 48 insertions, 20 deletions
diff --git a/arch/mips/kernel/cmpxchg.c b/arch/mips/kernel/cmpxchg.c index ac9c8cfb2ba9..e974a4954df8 100644 --- a/arch/mips/kernel/cmpxchg.c +++ b/arch/mips/kernel/cmpxchg.c @@ -22,7 +22,7 @@ unsigned long __xchg_small(volatile void *ptr, unsigned long val, unsigned int s  	/*  	 * Calculate a shift & mask that correspond to the value we wish to -	 * exchange within the naturally aligned 4 byte integerthat includes +	 * exchange within the naturally aligned 4 byte integer that includes  	 * it.  	 */  	shift = (unsigned long)ptr & 0x3; diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index f0ea92937546..d510f628ee03 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -156,7 +156,7 @@ static inline void check_errata(void)  		/*  		 * Erratum "RPS May Cause Incorrect Instruction Execution"  		 * This code only handles VPE0, any SMP/RTOS code -		 * making use of VPE1 will be responsable for that VPE. +		 * making use of VPE1 will be responsible for that VPE.  		 */  		if ((c->processor_id & PRID_REV_MASK) <= PRID_REV_34K_V1_0_2)  			write_c0_config7(read_c0_config7() | MIPS_CONF7_RPS); diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c index 146d9fa77f75..53adcc1b2ed5 100644 --- a/arch/mips/kernel/idle.c +++ b/arch/mips/kernel/idle.c @@ -228,7 +228,7 @@ void __init check_wait(void)  			break;  		/* -		 * Another rev is incremeting c0_count at a reduced clock +		 * Another rev is incrementing c0_count at a reduced clock  		 * rate while in WAIT mode.  So we basically have the choice  		 * between using the cp0 timer as clocksource or avoiding  		 * the WAIT instruction.  Until more details are known, diff --git a/arch/mips/kernel/kprobes.c b/arch/mips/kernel/kprobes.c index 6c7f3b143fdc..316b27d0d2fb 100644 --- a/arch/mips/kernel/kprobes.c +++ b/arch/mips/kernel/kprobes.c @@ -44,10 +44,11 @@ static const union mips_instruction breakpoint2_insn = {  DEFINE_PER_CPU(struct kprobe *, current_kprobe);  DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); -static int __kprobes insn_has_delayslot(union mips_instruction insn) +static int insn_has_delayslot(union mips_instruction insn)  {  	return __insn_has_delay_slot(insn);  } +NOKPROBE_SYMBOL(insn_has_delayslot);  /*   * insn_has_ll_or_sc function checks whether instruction is ll or sc @@ -56,7 +57,7 @@ static int __kprobes insn_has_delayslot(union mips_instruction insn)   * instructions; cannot do much about breakpoint in the middle of   * ll/sc pair; it is upto user to avoid those places   */ -static int __kprobes insn_has_ll_or_sc(union mips_instruction insn) +static int insn_has_ll_or_sc(union mips_instruction insn)  {  	int ret = 0; @@ -72,8 +73,9 @@ static int __kprobes insn_has_ll_or_sc(union mips_instruction insn)  	}  	return ret;  } +NOKPROBE_SYMBOL(insn_has_ll_or_sc); -int __kprobes arch_prepare_kprobe(struct kprobe *p) +int arch_prepare_kprobe(struct kprobe *p)  {  	union mips_instruction insn;  	union mips_instruction prev_insn; @@ -132,26 +134,30 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)  out:  	return ret;  } +NOKPROBE_SYMBOL(arch_prepare_kprobe); -void __kprobes arch_arm_kprobe(struct kprobe *p) +void arch_arm_kprobe(struct kprobe *p)  {  	*p->addr = breakpoint_insn;  	flush_insn_slot(p);  } +NOKPROBE_SYMBOL(arch_arm_kprobe); -void __kprobes arch_disarm_kprobe(struct kprobe *p) +void arch_disarm_kprobe(struct kprobe *p)  {  	*p->addr = p->opcode;  	flush_insn_slot(p);  } +NOKPROBE_SYMBOL(arch_disarm_kprobe); -void __kprobes arch_remove_kprobe(struct kprobe *p) +void arch_remove_kprobe(struct kprobe *p)  {  	if (p->ainsn.insn) {  		free_insn_slot(p->ainsn.insn, 0);  		p->ainsn.insn = NULL;  	}  } +NOKPROBE_SYMBOL(arch_remove_kprobe);  static void save_previous_kprobe(struct kprobe_ctlblk *kcb)  { @@ -257,7 +263,7 @@ static void prepare_singlestep(struct kprobe *p, struct pt_regs *regs,   * breakpoint trap. In case of branch instructions, the target   * epc to be restored.   */ -static void __kprobes resume_execution(struct kprobe *p, +static void resume_execution(struct kprobe *p,  				       struct pt_regs *regs,  				       struct kprobe_ctlblk *kcb)  { @@ -268,8 +274,9 @@ static void __kprobes resume_execution(struct kprobe *p,  		regs->cp0_epc = orig_epc + 4;  	}  } +NOKPROBE_SYMBOL(resume_execution); -static int __kprobes kprobe_handler(struct pt_regs *regs) +static int kprobe_handler(struct pt_regs *regs)  {  	struct kprobe *p;  	int ret = 0; @@ -367,6 +374,7 @@ no_kprobe:  	return ret;  } +NOKPROBE_SYMBOL(kprobe_handler);  static inline int post_kprobe_handler(struct pt_regs *regs)  { @@ -415,7 +423,7 @@ int kprobe_fault_handler(struct pt_regs *regs, int trapnr)  /*   * Wrapper routine for handling exceptions.   */ -int __kprobes kprobe_exceptions_notify(struct notifier_block *self, +int kprobe_exceptions_notify(struct notifier_block *self,  				       unsigned long val, void *data)  { @@ -446,6 +454,7 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,  	}  	return ret;  } +NOKPROBE_SYMBOL(kprobe_exceptions_notify);  /*   * Function return probe trampoline: @@ -469,7 +478,7 @@ static void __used kretprobe_trampoline_holder(void)  void __kretprobe_trampoline(void); -void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, +void arch_prepare_kretprobe(struct kretprobe_instance *ri,  				      struct pt_regs *regs)  {  	ri->ret_addr = (kprobe_opcode_t *) regs->regs[31]; @@ -478,11 +487,12 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,  	/* Replace the return addr with trampoline addr */  	regs->regs[31] = (unsigned long)__kretprobe_trampoline;  } +NOKPROBE_SYMBOL(arch_prepare_kretprobe);  /*   * Called when the probe at kretprobe trampoline is hit   */ -static int __kprobes trampoline_probe_handler(struct kprobe *p, +static int trampoline_probe_handler(struct kprobe *p,  						struct pt_regs *regs)  {  	instruction_pointer(regs) = __kretprobe_trampoline_handler(regs, NULL); @@ -493,14 +503,16 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,  	 */  	return 1;  } +NOKPROBE_SYMBOL(trampoline_probe_handler); -int __kprobes arch_trampoline_kprobe(struct kprobe *p) +int arch_trampoline_kprobe(struct kprobe *p)  {  	if (p->addr == (kprobe_opcode_t *)__kretprobe_trampoline)  		return 1;  	return 0;  } +NOKPROBE_SYMBOL(arch_trampoline_kprobe);  static struct kprobe trampoline_p = {  	.addr = (kprobe_opcode_t *)__kretprobe_trampoline, diff --git a/arch/mips/kernel/mips-cpc.c b/arch/mips/kernel/mips-cpc.c index 17aff13cd7ce..3e386f7e1545 100644 --- a/arch/mips/kernel/mips-cpc.c +++ b/arch/mips/kernel/mips-cpc.c @@ -28,6 +28,7 @@ phys_addr_t __weak mips_cpc_default_phys_base(void)  	cpc_node = of_find_compatible_node(of_root, NULL, "mti,mips-cpc");  	if (cpc_node) {  		err = of_address_to_resource(cpc_node, 0, &res); +		of_node_put(cpc_node);  		if (!err)  			return res.start;  	} diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index 1641d274fe37..c4d6b09136b1 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c @@ -329,7 +329,7 @@ static int mipsxx_pmu_alloc_counter(struct cpu_hw_events *cpuc,  	for (i = mipspmu.num_counters - 1; i >= 0; i--) {  		/*  		 * Note that some MIPS perf events can be counted by both -		 * even and odd counters, wheresas many other are only by +		 * even and odd counters, whereas many other are only by  		 * even _or_ odd counters. This introduces an issue that  		 * when the former kind of event takes the counter the  		 * latter kind of event wants to use, then the "counter diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index ef73ba1e0ec1..2ca156a5b231 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -37,6 +37,7 @@  #include <asm/cdmm.h>  #include <asm/cpu.h>  #include <asm/debug.h> +#include <asm/mmzone.h>  #include <asm/sections.h>  #include <asm/setup.h>  #include <asm/smp-ops.h> @@ -344,6 +345,11 @@ static int __init early_parse_mem(char *p)  {  	phys_addr_t start, size; +	if (!p) { +		pr_err("mem parameter is empty, do nothing\n"); +		return -EINVAL; +	} +  	/*  	 * If a user specifies memory size, we  	 * blow away any automatically generated @@ -359,7 +365,10 @@ static int __init early_parse_mem(char *p)  	if (*p == '@')  		start = memparse(p + 1, &p); -	memblock_add(start, size); +	if (IS_ENABLED(CONFIG_NUMA)) +		memblock_add_node(start, size, pa_to_nid(start), MEMBLOCK_NONE); +	else +		memblock_add(start, size);  	return 0;  } @@ -554,7 +563,7 @@ static void __init bootcmdline_init(void)  	 * unmodified.  	 */  	if (IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) { -		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); +		strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);  		return;  	} @@ -566,7 +575,7 @@ static void __init bootcmdline_init(void)  	 * boot_command_line to undo anything early_init_dt_scan_chosen() did.  	 */  	if (IS_ENABLED(CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND)) -		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); +		strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);  	else  		boot_command_line[0] = 0; @@ -628,7 +637,7 @@ static void __init arch_mem_init(char **cmdline_p)  	memblock_set_bottom_up(true);  	bootcmdline_init(); -	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); +	strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE);  	*cmdline_p = command_line;  	parse_early_param(); diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 1986d1309410..1d93b85271ba 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c @@ -518,6 +518,12 @@ static inline void smp_on_each_tlb(void (*func) (void *info), void *info)  void flush_tlb_mm(struct mm_struct *mm)  { +	if (!mm) +		return; + +	if (atomic_read(&mm->mm_users) == 0) +		return;		/* happens as a result of exit_mmap() */ +  	preempt_disable();  	if (cpu_has_mmid) {  | 
