1 #ifndef _LINUX_JUMP_LABEL_H 2 #define _LINUX_JUMP_LABEL_H 3 4 #include <linux/types.h> 5 #include <linux/compiler.h> 6 7 #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) 8 9 struct jump_label_key { 10 atomic_t enabled; 11 struct jump_entry *entries; 12 #ifdef CONFIG_MODULES 13 struct jump_label_mod *next; 14 #endif 15 }; 16 17 # include <asm/jump_label.h> 18 # define HAVE_JUMP_LABEL 19 #endif 20 21 enum jump_label_type { 22 JUMP_LABEL_DISABLE = 0, 23 JUMP_LABEL_ENABLE, 24 }; 25 26 struct module; 27 28 #ifdef HAVE_JUMP_LABEL 29 30 #ifdef CONFIG_MODULES 31 #define JUMP_LABEL_INIT {{ 0 }, NULL, NULL} 32 #else 33 #define JUMP_LABEL_INIT {{ 0 }, NULL} 34 #endif 35 36 static __always_inline bool static_branch(struct jump_label_key *key) 37 { 38 return arch_static_branch(key); 39 } 40 41 extern struct jump_entry __start___jump_table[]; 42 extern struct jump_entry __stop___jump_table[]; 43 44 extern void jump_label_lock(void); 45 extern void jump_label_unlock(void); 46 extern void arch_jump_label_transform(struct jump_entry *entry, 47 enum jump_label_type type); 48 extern void arch_jump_label_text_poke_early(jump_label_t addr); 49 extern int jump_label_text_reserved(void *start, void *end); 50 extern void jump_label_inc(struct jump_label_key *key); 51 extern void jump_label_dec(struct jump_label_key *key); 52 extern bool jump_label_enabled(struct jump_label_key *key); 53 extern void jump_label_apply_nops(struct module *mod); 54 55 #else 56 57 #include <asm/atomic.h> 58 59 #define JUMP_LABEL_INIT {ATOMIC_INIT(0)} 60 61 struct jump_label_key { 62 atomic_t enabled; 63 }; 64 65 static __always_inline bool static_branch(struct jump_label_key *key) 66 { 67 if (unlikely(atomic_read(&key->enabled))) 68 return true; 69 return false; 70 } 71 72 static inline void jump_label_inc(struct jump_label_key *key) 73 { 74 atomic_inc(&key->enabled); 75 } 76 77 static inline void jump_label_dec(struct jump_label_key *key) 78 { 79 atomic_dec(&key->enabled); 80 } 81 82 static inline int jump_label_text_reserved(void *start, void *end) 83 { 84 return 0; 85 } 86 87 static inline void jump_label_lock(void) {} 88 static inline void jump_label_unlock(void) {} 89 90 static inline bool jump_label_enabled(struct jump_label_key *key) 91 { 92 return !!atomic_read(&key->enabled); 93 } 94 95 static inline int jump_label_apply_nops(struct module *mod) 96 { 97 return 0; 98 } 99 100 #endif 101 102 #endif 103