diff options
| author | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
| commit | 469da62096e23adc755c1268b00b5fc7a214151b (patch) | |
| tree | fefd055fdae584e38d551f44d1339eb22cee4ed9 /arch/mips/kernel | |
| parent | 4227961650884a06757f80877d5dce0bddc723d4 (diff) | |
| parent | 88b62b915b0b7e25870eb0604ed9a92ba4bfc9f7 (diff) | |
| download | olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.tar.xz olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.zip  | |
Merge tag 'v3.8-rc6' into next/soc
Linux 3.8-rc6
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/ftrace.c | 36 | ||||
| -rw-r--r-- | arch/mips/kernel/mcount.S | 7 | ||||
| -rw-r--r-- | arch/mips/kernel/vpe.c | 2 | 
3 files changed, 40 insertions, 5 deletions
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index 6a2d758dd8e..83fa1460e29 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c @@ -25,6 +25,12 @@  #define MCOUNT_OFFSET_INSNS 4  #endif +/* Arch override because MIPS doesn't need to run this from stop_machine() */ +void arch_ftrace_update_code(int command) +{ +	ftrace_modify_all_code(command); +} +  /*   * Check if the address is in kernel space   * @@ -89,6 +95,24 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)  	return 0;  } +#ifndef CONFIG_64BIT +static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1, +				unsigned int new_code2) +{ +	int faulted; + +	safe_store_code(new_code1, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	ip += 4; +	safe_store_code(new_code2, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	flush_icache_range(ip, ip + 8); /* original ip + 12 */ +	return 0; +} +#endif +  /*   * The details about the calling site of mcount on MIPS   * @@ -131,8 +155,18 @@ int ftrace_make_nop(struct module *mod,  	 * needed.  	 */  	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F; - +#ifdef CONFIG_64BIT  	return ftrace_modify_code(ip, new); +#else +	/* +	 * On 32 bit MIPS platforms, gcc adds a stack adjust +	 * instruction in the delay slot after the branch to +	 * mcount and expects mcount to restore the sp on return. +	 * This is based on a legacy API and does nothing but +	 * waste instructions so it's being removed at runtime. +	 */ +	return ftrace_modify_code_2(ip, new, INSN_NOP); +#endif  }  int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index 4c968e7efb7..16586767335 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S @@ -46,9 +46,8 @@  	PTR_L	a5, PT_R9(sp)  	PTR_L	a6, PT_R10(sp)  	PTR_L	a7, PT_R11(sp) -	PTR_ADDIU	sp, PT_SIZE  #else -	PTR_ADDIU	sp, (PT_SIZE + 8) +	PTR_ADDIU	sp, PT_SIZE  #endif  .endm @@ -69,7 +68,9 @@ NESTED(ftrace_caller, PT_SIZE, ra)  	.globl _mcount  _mcount:  	b	ftrace_stub -	 nop +	addiu sp,sp,8 + +	/* When tracing is activated, it calls ftrace_caller+8 (aka here) */  	lw	t1, function_trace_stop  	bnez	t1, ftrace_stub  	 nop diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index eec690af658..147cec19621 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c @@ -705,7 +705,7 @@ static int vpe_run(struct vpe * v)  			printk(KERN_WARNING  			       "VPE loader: TC %d is already in use.\n", -                               t->index); +			       v->tc->index);  			return -ENOEXEC;  		}  	} else {  |