diff options
Diffstat (limited to 'include/linux/jump_label.h')
-rw-r--r-- | include/linux/jump_label.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h new file mode 100644 index 000000000000..7880f18e4b86 --- /dev/null +++ b/include/linux/jump_label.h | |||
@@ -0,0 +1,79 @@ | |||
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 | |||
9 | enum jump_label_type { | ||
10 | JUMP_LABEL_ENABLE, | ||
11 | JUMP_LABEL_DISABLE | ||
12 | }; | ||
13 | |||
14 | struct module; | ||
15 | |||
16 | #ifdef HAVE_JUMP_LABEL | ||
17 | |||
18 | extern struct jump_entry __start___jump_table[]; | ||
19 | extern struct jump_entry __stop___jump_table[]; | ||
20 | |||
21 | extern void jump_label_lock(void); | ||
22 | extern void jump_label_unlock(void); | ||
23 | extern void arch_jump_label_transform(struct jump_entry *entry, | ||
24 | enum jump_label_type type); | ||
25 | extern void arch_jump_label_text_poke_early(jump_label_t addr); | ||
26 | extern void jump_label_update(unsigned long key, enum jump_label_type type); | ||
27 | extern void jump_label_apply_nops(struct module *mod); | ||
28 | extern 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) \ | ||
39 | do { \ | ||
40 | if (unlikely(*key)) \ | ||
41 | goto label; \ | ||
42 | } while (0) | ||
43 | |||
44 | #define jump_label_enable(cond_var) \ | ||
45 | do { \ | ||
46 | *(cond_var) = 1; \ | ||
47 | } while (0) | ||
48 | |||
49 | #define jump_label_disable(cond_var) \ | ||
50 | do { \ | ||
51 | *(cond_var) = 0; \ | ||
52 | } while (0) | ||
53 | |||
54 | static inline int jump_label_apply_nops(struct module *mod) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static inline int jump_label_text_reserved(void *start, void *end) | ||
60 | { | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static inline void jump_label_lock(void) {} | ||
65 | static inline void jump_label_unlock(void) {} | ||
66 | |||
67 | #endif | ||
68 | |||
69 | #define COND_STMT(key, stmt) \ | ||
70 | do { \ | ||
71 | __label__ jl_enabled; \ | ||
72 | JUMP_LABEL(key, jl_enabled); \ | ||
73 | if (0) { \ | ||
74 | jl_enabled: \ | ||
75 | stmt; \ | ||
76 | } \ | ||
77 | } while (0) | ||
78 | |||
79 | #endif | ||