Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_ARM_JUMP_LABEL_H 3 : : #define _ASM_ARM_JUMP_LABEL_H 4 : : 5 : : #ifndef __ASSEMBLY__ 6 : : 7 : : #include <linux/types.h> 8 : : #include <asm/unified.h> 9 : : 10 : : #define JUMP_LABEL_NOP_SIZE 4 11 : : 12 : : static __always_inline bool arch_static_branch(struct static_key *key, bool branch) 13 : : { 14 : 3 : asm_volatile_goto("1:\n\t" 15 : : WASM(nop) "\n\t" 16 : : ".pushsection __jump_table, \"aw\"\n\t" 17 : : ".word 1b, %l[l_yes], %c0\n\t" 18 : : ".popsection\n\t" 19 : : : : "i" (&((char *)key)[branch]) : : l_yes); 20 : : 21 : : return false; 22 : : l_yes: 23 : : return true; 24 : : } 25 : : 26 : : static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch) 27 : : { 28 : 3 : asm_volatile_goto("1:\n\t" 29 : : WASM(b) " %l[l_yes]\n\t" 30 : : ".pushsection __jump_table, \"aw\"\n\t" 31 : : ".word 1b, %l[l_yes], %c0\n\t" 32 : : ".popsection\n\t" 33 : : : : "i" (&((char *)key)[branch]) : : l_yes); 34 : : 35 : : return false; 36 : : l_yes: 37 : : return true; 38 : : } 39 : : 40 : : typedef u32 jump_label_t; 41 : : 42 : : struct jump_entry { 43 : : jump_label_t code; 44 : : jump_label_t target; 45 : : jump_label_t key; 46 : : }; 47 : : 48 : : #endif /* __ASSEMBLY__ */ 49 : : #endif