at v3.0 2.2 kB view raw
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 9struct 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 21enum jump_label_type { 22 JUMP_LABEL_DISABLE = 0, 23 JUMP_LABEL_ENABLE, 24}; 25 26struct 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 36static __always_inline bool static_branch(struct jump_label_key *key) 37{ 38 return arch_static_branch(key); 39} 40 41extern struct jump_entry __start___jump_table[]; 42extern struct jump_entry __stop___jump_table[]; 43 44extern void jump_label_lock(void); 45extern void jump_label_unlock(void); 46extern void arch_jump_label_transform(struct jump_entry *entry, 47 enum jump_label_type type); 48extern void arch_jump_label_text_poke_early(jump_label_t addr); 49extern int jump_label_text_reserved(void *start, void *end); 50extern void jump_label_inc(struct jump_label_key *key); 51extern void jump_label_dec(struct jump_label_key *key); 52extern bool jump_label_enabled(struct jump_label_key *key); 53extern 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 61struct jump_label_key { 62 atomic_t enabled; 63}; 64 65static __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 72static inline void jump_label_inc(struct jump_label_key *key) 73{ 74 atomic_inc(&key->enabled); 75} 76 77static inline void jump_label_dec(struct jump_label_key *key) 78{ 79 atomic_dec(&key->enabled); 80} 81 82static inline int jump_label_text_reserved(void *start, void *end) 83{ 84 return 0; 85} 86 87static inline void jump_label_lock(void) {} 88static inline void jump_label_unlock(void) {} 89 90static inline bool jump_label_enabled(struct jump_label_key *key) 91{ 92 return !!atomic_read(&key->enabled); 93} 94 95static inline int jump_label_apply_nops(struct module *mod) 96{ 97 return 0; 98} 99 100#endif 101 102#endif