at v2.6.39 79 lines 1.7 kB view raw
1#ifndef _LINUX_JUMP_LABEL_H 2#define _LINUX_JUMP_LABEL_H 3 4#if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) 5# include <asm/jump_label.h> 6# define HAVE_JUMP_LABEL 7#endif 8 9enum jump_label_type { 10 JUMP_LABEL_ENABLE, 11 JUMP_LABEL_DISABLE 12}; 13 14struct module; 15 16#ifdef HAVE_JUMP_LABEL 17 18extern struct jump_entry __start___jump_table[]; 19extern struct jump_entry __stop___jump_table[]; 20 21extern void jump_label_lock(void); 22extern void jump_label_unlock(void); 23extern void arch_jump_label_transform(struct jump_entry *entry, 24 enum jump_label_type type); 25extern void arch_jump_label_text_poke_early(jump_label_t addr); 26extern void jump_label_update(unsigned long key, enum jump_label_type type); 27extern void jump_label_apply_nops(struct module *mod); 28extern int jump_label_text_reserved(void *start, void *end); 29 30#define jump_label_enable(key) \ 31 jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE); 32 33#define jump_label_disable(key) \ 34 jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE); 35 36#else 37 38#define JUMP_LABEL(key, label) \ 39do { \ 40 if (unlikely(*key)) \ 41 goto label; \ 42} while (0) 43 44#define jump_label_enable(cond_var) \ 45do { \ 46 *(cond_var) = 1; \ 47} while (0) 48 49#define jump_label_disable(cond_var) \ 50do { \ 51 *(cond_var) = 0; \ 52} while (0) 53 54static inline int jump_label_apply_nops(struct module *mod) 55{ 56 return 0; 57} 58 59static inline int jump_label_text_reserved(void *start, void *end) 60{ 61 return 0; 62} 63 64static inline void jump_label_lock(void) {} 65static inline void jump_label_unlock(void) {} 66 67#endif 68 69#define COND_STMT(key, stmt) \ 70do { \ 71 __label__ jl_enabled; \ 72 JUMP_LABEL(key, jl_enabled); \ 73 if (0) { \ 74jl_enabled: \ 75 stmt; \ 76 } \ 77} while (0) 78 79#endif