diff options
| author | Wu Zhangjin <wuzhangjin@gmail.com> | 2011-01-20 03:28:31 +0800 | 
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2011-03-14 21:07:24 +0100 | 
| commit | 7f21a60968221eabad5c53fe760db3d094994011 (patch) | |
| tree | 0b87d690d60ff0292d0088bfee6f1b3ca7ff3910 /arch/mips/kernel/ftrace.c | |
| parent | 2816e325969396af5bd1d5f70c7360074ae1d63c (diff) | |
MIPS, Tracing: Clean up ftrace_make_nop()
This moves the comments out of ftrace_make_nop() and cleans it.  At the
same time, a macro MCOUNT_OFFSET_INSNS is defined for sharing with the
next patch.
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
Cc: Steven Rostedt <srostedt@redhat.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2008/
Signed-off-by: Ralf Baechle <ralf@duck.linux-mips.net>
Diffstat (limited to 'arch/mips/kernel/ftrace.c')
| -rw-r--r-- | arch/mips/kernel/ftrace.c | 70 | 
1 files changed, 38 insertions, 32 deletions
| diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index 40ef34ccb76b..bc91e4aa08e9 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c @@ -24,8 +24,6 @@  #define JAL 0x0c000000		/* jump & link: ip --> ra, jump to target */  #define ADDR_MASK 0x03ffffff	/*  op_code|addr : 31...26|25 ....0 */ -#define INSN_B_1F_4 0x10000004	/* b 1f; offset = 4 */ -#define INSN_B_1F_5 0x10000005	/* b 1f; offset = 5 */  #define INSN_NOP 0x00000000	/* nop */  #define INSN_JAL(addr)	\  	((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK))) @@ -84,6 +82,42 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)  	return 0;  } +/* + * The details about the calling site of mcount on MIPS + * + * 1. For kernel: + * + * move at, ra + * jal _mcount		--> nop + * + * 2. For modules: + * + * 2.1 For KBUILD_MCOUNT_RA_ADDRESS and CONFIG_32BIT + * + * lui v1, hi_16bit_of_mcount        --> b 1f (0x10000005) + * addiu v1, v1, low_16bit_of_mcount + * move at, ra + * move $12, ra_address + * jalr v1 + *  sub sp, sp, 8 + *                                  1: offset = 5 instructions + * 2.2 For the Other situations + * + * lui v1, hi_16bit_of_mcount        --> b 1f (0x10000004) + * addiu v1, v1, low_16bit_of_mcount + * move at, ra + * jalr v1 + *  nop | move $12, ra_address | sub sp, sp, 8 + *                                  1: offset = 4 instructions + */ + +#if defined(KBUILD_MCOUNT_RA_ADDRESS) && defined(CONFIG_32BIT) +#define MCOUNT_OFFSET_INSNS 5 +#else +#define MCOUNT_OFFSET_INSNS 4 +#endif +#define INSN_B_1F (0x10000000 | MCOUNT_OFFSET_INSNS) +  int ftrace_make_nop(struct module *mod,  		    struct dyn_ftrace *rec, unsigned long addr)  { @@ -94,36 +128,8 @@ int ftrace_make_nop(struct module *mod,  	 * If ip is in kernel space, no long call, otherwise, long call is  	 * needed.  	 */ -	if (in_kernel_space(ip)) { -		/* -		 * move at, ra -		 * jal _mcount		--> nop -		 */ -		new = INSN_NOP; -	} else { -#if defined(KBUILD_MCOUNT_RA_ADDRESS) && defined(CONFIG_32BIT) -		/* -		 * lui v1, hi_16bit_of_mcount        --> b 1f (0x10000005) -		 * addiu v1, v1, low_16bit_of_mcount -		 * move at, ra -		 * move $12, ra_address -		 * jalr v1 -		 *  sub sp, sp, 8 -		 *                                  1: offset = 5 instructions -		 */ -		new = INSN_B_1F_5; -#else -		/* -		 * lui v1, hi_16bit_of_mcount        --> b 1f (0x10000004) -		 * addiu v1, v1, low_16bit_of_mcount -		 * move at, ra -		 * jalr v1 -		 *  nop | move $12, ra_address | sub sp, sp, 8 -		 *                                  1: offset = 4 instructions -		 */ -		new = INSN_B_1F_4; -#endif -	} +	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F; +  	return ftrace_modify_code(ip, new);  } | 
