1 #ifndef _ASM_X86_JUMP_LABEL_H 2 #define _ASM_X86_JUMP_LABEL_H 3 4 #ifdef __KERNEL__ 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 #endif /* __KERNEL__ */ 34 35 #ifdef CONFIG_X86_64 36 typedef u64 jump_label_t; 37 #else 38 typedef u32 jump_label_t; 39 #endif 40 41 struct jump_entry { 42 jump_label_t code; 43 jump_label_t target; 44 jump_label_t key; 45 }; 46 47 #endif 48