 cc1adb5f32
			
		
	
	
	cc1adb5f32
	
	
	
		
			
			hcall tracepoints add quite a few instructions to our hcall path: plpar_hcall: mr r2,r2 mfcr r0 stw r0,8(r1) b 164 <---- start ld r12,0(r2) std r12,32(r1) cmpdi r12,0 beq 164 <---- end ... We have an unconditional branch that gets noped out during boot and a load/compare/branch. We also store the tracepoint value to the stack for the hcall_exit path to use. By using jump labels we can simplify this to just a single nop that gets replaced with a branch when the tracepoint is enabled: plpar_hcall: mr r2,r2 mfcr r0 stw r0,8(r1) nop <---- ... If jump labels are not enabled, we fall back to the old method. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_POWERPC_JUMP_LABEL_H
 | |
| #define _ASM_POWERPC_JUMP_LABEL_H
 | |
| 
 | |
| /*
 | |
|  * Copyright 2010 Michael Ellerman, IBM Corp.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version
 | |
|  * 2 of the License, or (at your option) any later version.
 | |
|  */
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| #include <linux/types.h>
 | |
| 
 | |
| #include <asm/feature-fixups.h>
 | |
| 
 | |
| #define JUMP_ENTRY_TYPE		stringify_in_c(FTR_ENTRY_LONG)
 | |
| #define JUMP_LABEL_NOP_SIZE	4
 | |
| 
 | |
| static __always_inline bool arch_static_branch(struct static_key *key)
 | |
| {
 | |
| 	asm_volatile_goto("1:\n\t"
 | |
| 		 "nop\n\t"
 | |
| 		 ".pushsection __jump_table,  \"aw\"\n\t"
 | |
| 		 JUMP_ENTRY_TYPE "1b, %l[l_yes], %c0\n\t"
 | |
| 		 ".popsection \n\t"
 | |
| 		 : :  "i" (key) : : l_yes);
 | |
| 	return false;
 | |
| l_yes:
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_PPC64
 | |
| typedef u64 jump_label_t;
 | |
| #else
 | |
| typedef u32 jump_label_t;
 | |
| #endif
 | |
| 
 | |
| struct jump_entry {
 | |
| 	jump_label_t code;
 | |
| 	jump_label_t target;
 | |
| 	jump_label_t key;
 | |
| };
 | |
| 
 | |
| #else
 | |
| #define ARCH_STATIC_BRANCH(LABEL, KEY)		\
 | |
| 1098:	nop;					\
 | |
| 	.pushsection __jump_table, "aw";	\
 | |
| 	FTR_ENTRY_LONG 1098b, LABEL, KEY;	\
 | |
| 	.popsection
 | |
| #endif
 | |
| 
 | |
| #endif /* _ASM_POWERPC_JUMP_LABEL_H */
 |