xref: /openbmc/linux/arch/arm/include/asm/jump_label.h (revision c595db6d7c8bcf87ef42204391fa890e5950e566)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
209f05d85SRabin Vincent #ifndef _ASM_ARM_JUMP_LABEL_H
309f05d85SRabin Vincent #define _ASM_ARM_JUMP_LABEL_H
409f05d85SRabin Vincent 
555dd0df7SAnton Blanchard #ifndef __ASSEMBLY__
609f05d85SRabin Vincent 
709f05d85SRabin Vincent #include <linux/types.h>
811276d53SPeter Zijlstra #include <asm/unified.h>
909f05d85SRabin Vincent 
1009f05d85SRabin Vincent #define JUMP_LABEL_NOP_SIZE 4
1109f05d85SRabin Vincent 
arch_static_branch(struct static_key * key,bool branch)1211276d53SPeter Zijlstra static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
1309f05d85SRabin Vincent {
14*aaff74d8SLinus Torvalds 	asm goto("1:\n\t"
1511276d53SPeter Zijlstra 		 WASM(nop) "\n\t"
1609f05d85SRabin Vincent 		 ".pushsection __jump_table,  \"aw\"\n\t"
1709f05d85SRabin Vincent 		 ".word 1b, %l[l_yes], %c0\n\t"
1809f05d85SRabin Vincent 		 ".popsection\n\t"
1911276d53SPeter Zijlstra 		 : :  "i" (&((char *)key)[branch]) :  : l_yes);
2011276d53SPeter Zijlstra 
2111276d53SPeter Zijlstra 	return false;
2211276d53SPeter Zijlstra l_yes:
2311276d53SPeter Zijlstra 	return true;
2411276d53SPeter Zijlstra }
2511276d53SPeter Zijlstra 
arch_static_branch_jump(struct static_key * key,bool branch)2611276d53SPeter Zijlstra static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
2711276d53SPeter Zijlstra {
28*aaff74d8SLinus Torvalds 	asm goto("1:\n\t"
2911276d53SPeter Zijlstra 		 WASM(b) " %l[l_yes]\n\t"
3011276d53SPeter Zijlstra 		 ".pushsection __jump_table,  \"aw\"\n\t"
3111276d53SPeter Zijlstra 		 ".word 1b, %l[l_yes], %c0\n\t"
3211276d53SPeter Zijlstra 		 ".popsection\n\t"
3311276d53SPeter Zijlstra 		 : :  "i" (&((char *)key)[branch]) :  : l_yes);
3409f05d85SRabin Vincent 
3509f05d85SRabin Vincent 	return false;
3609f05d85SRabin Vincent l_yes:
3709f05d85SRabin Vincent 	return true;
3809f05d85SRabin Vincent }
3909f05d85SRabin Vincent 
4009f05d85SRabin Vincent typedef u32 jump_label_t;
4109f05d85SRabin Vincent 
4209f05d85SRabin Vincent struct jump_entry {
4309f05d85SRabin Vincent 	jump_label_t code;
4409f05d85SRabin Vincent 	jump_label_t target;
4509f05d85SRabin Vincent 	jump_label_t key;
4609f05d85SRabin Vincent };
4709f05d85SRabin Vincent 
4855dd0df7SAnton Blanchard #endif  /* __ASSEMBLY__ */
4909f05d85SRabin Vincent #endif
50