#ifndef _LINUX_JUMP_LABEL_H #define _LINUX_JUMP_LABEL_H #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_HAVE_ARCH_JUMP_LABEL) # include # define HAVE_JUMP_LABEL #endif enum jump_label_type { JUMP_LABEL_ENABLE, JUMP_LABEL_DISABLE }; struct module; #ifdef HAVE_JUMP_LABEL extern struct jump_entry __start___jump_table[]; extern struct jump_entry __stop___jump_table[]; extern void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type type); extern void arch_jump_label_text_poke_early(jump_label_t addr); extern void jump_label_update(unsigned long key, enum jump_label_type type); extern void jump_label_apply_nops(struct module *mod); extern int jump_label_text_reserved(void *start, void *end); #define jump_label_enable(key) \ jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE); #define jump_label_disable(key) \ jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE); #else #define JUMP_LABEL(key, label) \ do { \ if (unlikely(*key)) \ goto label; \ } while (0) #define jump_label_enable(cond_var) \ do { \ *(cond_var) = 1; \ } while (0) #define jump_label_disable(cond_var) \ do { \ *(cond_var) = 0; \ } while (0) static inline int jump_label_apply_nops(struct module *mod) { return 0; } static inline int jump_label_text_reserved(void *start, void *end) { return 0; } #endif #endif