1 #ifndef _ASM_X86_JUMP_LABEL_H 2 #define _ASM_X86_JUMP_LABEL_H 3 4 #ifndef __ASSEMBLY__ 5 6 #include <linux/stringify.h> 7 #include <linux/types.h> 8 #include <asm/nops.h> 9 #include <asm/asm.h> 10 11 #define JUMP_LABEL_NOP_SIZE 5 12 13 #ifdef CONFIG_X86_64 14 # define STATIC_KEY_INIT_NOP P6_NOP5_ATOMIC 15 #else 16 # define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC 17 #endif 18 19 static __always_inline bool arch_static_branch(struct static_key *key) 20 { 21 asm_volatile_goto("1:" 22 ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t" 23 ".pushsection __jump_table, \"aw\" \n\t" 24 _ASM_ALIGN "\n\t" 25 _ASM_PTR "1b, %l[l_yes], %c0 \n\t" 26 ".popsection \n\t" 27 : : "i" (key) : : l_yes); 28 return false; 29 l_yes: 30 return true; 31 } 32 33 #ifdef CONFIG_X86_64 34 typedef u64 jump_label_t; 35 #else 36 typedef u32 jump_label_t; 37 #endif 38 39 struct jump_entry { 40 jump_label_t code; 41 jump_label_t target; 42 jump_label_t key; 43 }; 44 45 #endif /* __ASSEMBLY__ */ 46 #endif 47