jump_label.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _LINUX_JUMP_LABEL_H
  2. #define _LINUX_JUMP_LABEL_H
  3. #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_HAVE_ARCH_JUMP_LABEL)
  4. # include <asm/jump_label.h>
  5. # define HAVE_JUMP_LABEL
  6. #endif
  7. enum jump_label_type {
  8. JUMP_LABEL_ENABLE,
  9. JUMP_LABEL_DISABLE
  10. };
  11. struct module;
  12. #ifdef HAVE_JUMP_LABEL
  13. extern struct jump_entry __start___jump_table[];
  14. extern struct jump_entry __stop___jump_table[];
  15. extern void arch_jump_label_transform(struct jump_entry *entry,
  16. enum jump_label_type type);
  17. extern void arch_jump_label_text_poke_early(jump_label_t addr);
  18. extern void jump_label_update(unsigned long key, enum jump_label_type type);
  19. extern void jump_label_apply_nops(struct module *mod);
  20. extern int jump_label_text_reserved(void *start, void *end);
  21. #define jump_label_enable(key) \
  22. jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE);
  23. #define jump_label_disable(key) \
  24. jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE);
  25. #else
  26. #define JUMP_LABEL(key, label) \
  27. do { \
  28. if (unlikely(*key)) \
  29. goto label; \
  30. } while (0)
  31. #define jump_label_enable(cond_var) \
  32. do { \
  33. *(cond_var) = 1; \
  34. } while (0)
  35. #define jump_label_disable(cond_var) \
  36. do { \
  37. *(cond_var) = 0; \
  38. } while (0)
  39. static inline int jump_label_apply_nops(struct module *mod)
  40. {
  41. return 0;
  42. }
  43. static inline int jump_label_text_reserved(void *start, void *end)
  44. {
  45. return 0;
  46. }
  47. #endif
  48. #define COND_STMT(key, stmt) \
  49. do { \
  50. __label__ jl_enabled; \
  51. JUMP_LABEL(key, jl_enabled); \
  52. if (0) { \
  53. jl_enabled: \
  54. stmt; \
  55. } \
  56. } while (0)
  57. #endif