diff options
Diffstat (limited to 'arch/mips/kernel/mcount.S')
| -rw-r--r-- | arch/mips/kernel/mcount.S | 32 | 
1 files changed, 25 insertions, 7 deletions
diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index 539b6294b613..2f7c734771f4 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S @@ -74,16 +74,25 @@ _mcount:  #endif  	/* When tracing is activated, it calls ftrace_caller+8 (aka here) */ -	lw	t1, function_trace_stop -	bnez	t1, ftrace_stub -	 nop -  	MCOUNT_SAVE_REGS  #ifdef KBUILD_MCOUNT_RA_ADDRESS  	PTR_S	MCOUNT_RA_ADDRESS_REG, PT_R12(sp)  #endif  	PTR_SUBU a0, ra, 8	/* arg1: self address */ +	PTR_LA   t1, _stext +	sltu     t2, a0, t1	/* t2 = (a0 < _stext) */ +	PTR_LA   t1, _etext +	sltu     t3, t1, a0	/* t3 = (a0 > _etext) */ +	or       t1, t2, t3 +	beqz     t1, ftrace_call +	 nop +#if defined(KBUILD_MCOUNT_RA_ADDRESS) && defined(CONFIG_32BIT) +	PTR_SUBU a0, a0, 16	/* arg1: adjust to module's recorded callsite */ +#else +	PTR_SUBU a0, a0, 12 +#endif +  	.globl ftrace_call  ftrace_call:  	nop	/* a placeholder for the call to a real tracing function */ @@ -105,9 +114,6 @@ ftrace_stub:  #else	/* ! CONFIG_DYNAMIC_FTRACE */  NESTED(_mcount, PT_SIZE, ra) -	lw	t1, function_trace_stop -	bnez	t1, ftrace_stub -	 nop  	PTR_LA	t1, ftrace_stub  	PTR_L	t2, ftrace_trace_function /* Prepare t2 for (1) */  	bne	t1, t2, static_trace @@ -123,7 +129,11 @@ NESTED(_mcount, PT_SIZE, ra)  	 nop  #endif  	b	ftrace_stub +#ifdef CONFIG_32BIT +	 addiu sp, sp, 8 +#else  	 nop +#endif  static_trace:  	MCOUNT_SAVE_REGS @@ -133,6 +143,9 @@ static_trace:  	 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 @@ -177,6 +190,11 @@ NESTED(ftrace_graph_caller, PT_SIZE, ra)  	jal	prepare_ftrace_return  	 nop  	MCOUNT_RESTORE_REGS +#ifndef CONFIG_DYNAMIC_FTRACE +#ifdef CONFIG_32BIT +	addiu sp, sp, 8 +#endif +#endif  	RETURN_BACK  	END(ftrace_graph_caller)  | 
