mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 22:26:12 +00:00 
			
		
		
		
	 bf528a3a9b
			
		
	
	
		bf528a3a9b
		
	
	
	
	
		
			
			Impact: clean up Use a macro to save and restore the registers for PowerPC32, since that code is duplicated. This is similar to the work done by Cyrill Gorcunov for the mcount code in x86_64. Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_POWERPC_FTRACE
 | |
| #define _ASM_POWERPC_FTRACE
 | |
| 
 | |
| #ifdef CONFIG_FUNCTION_TRACER
 | |
| #define MCOUNT_ADDR		((long)(_mcount))
 | |
| #define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */
 | |
| 
 | |
| #ifdef __ASSEMBLY__
 | |
| 
 | |
| /* Based off of objdump optput from glibc */
 | |
| 
 | |
| #define MCOUNT_SAVE_FRAME			\
 | |
| 	stwu	r1,-48(r1);			\
 | |
| 	stw	r3, 12(r1);			\
 | |
| 	stw	r4, 16(r1);			\
 | |
| 	stw	r5, 20(r1);			\
 | |
| 	stw	r6, 24(r1);			\
 | |
| 	mflr	r3;				\
 | |
| 	lwz	r4, 52(r1);			\
 | |
| 	mfcr	r5;				\
 | |
| 	stw	r7, 28(r1);			\
 | |
| 	stw	r8, 32(r1);			\
 | |
| 	stw	r9, 36(r1);			\
 | |
| 	stw	r10,40(r1);			\
 | |
| 	stw	r3, 44(r1);			\
 | |
| 	stw	r5, 8(r1)
 | |
| 
 | |
| #define MCOUNT_RESTORE_FRAME			\
 | |
| 	lwz	r6, 8(r1);			\
 | |
| 	lwz	r0, 44(r1);			\
 | |
| 	lwz	r3, 12(r1);			\
 | |
| 	mtctr	r0;				\
 | |
| 	lwz	r4, 16(r1);			\
 | |
| 	mtcr	r6;				\
 | |
| 	lwz	r5, 20(r1);			\
 | |
| 	lwz	r6, 24(r1);			\
 | |
| 	lwz	r0, 52(r1);			\
 | |
| 	lwz	r7, 28(r1);			\
 | |
| 	lwz	r8, 32(r1);			\
 | |
| 	mtlr	r0;				\
 | |
| 	lwz	r9, 36(r1);			\
 | |
| 	lwz	r10,40(r1);			\
 | |
| 	addi	r1, r1, 48
 | |
| 
 | |
| #else /* !__ASSEMBLY__ */
 | |
| extern void _mcount(void);
 | |
| 
 | |
| #ifdef CONFIG_DYNAMIC_FTRACE
 | |
| static inline unsigned long ftrace_call_adjust(unsigned long addr)
 | |
| {
 | |
|        /* reloction of mcount call site is the same as the address */
 | |
|        return addr;
 | |
| }
 | |
| 
 | |
| struct dyn_arch_ftrace {
 | |
| 	struct module *mod;
 | |
| };
 | |
| #endif /*  CONFIG_DYNAMIC_FTRACE */
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif /* _ASM_POWERPC_FTRACE */
 |