xref: /linux-6.15/include/linux/jump_label.h (revision 71ccc212)
1 #ifndef _LINUX_JUMP_LABEL_H
2 #define _LINUX_JUMP_LABEL_H
3 
4 #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_HAVE_ARCH_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 arch_jump_label_transform(struct jump_entry *entry,
22 				 enum jump_label_type type);
23 extern void arch_jump_label_text_poke_early(jump_label_t addr);
24 extern void jump_label_update(unsigned long key, enum jump_label_type type);
25 extern void jump_label_apply_nops(struct module *mod);
26 extern int jump_label_text_reserved(void *start, void *end);
27 
28 #define jump_label_enable(key) \
29 	jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE);
30 
31 #define jump_label_disable(key) \
32 	jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE);
33 
34 #else
35 
36 #define JUMP_LABEL(key, label)			\
37 do {						\
38 	if (unlikely(*key))			\
39 		goto label;			\
40 } while (0)
41 
42 #define jump_label_enable(cond_var)	\
43 do {					\
44        *(cond_var) = 1;			\
45 } while (0)
46 
47 #define jump_label_disable(cond_var)	\
48 do {					\
49        *(cond_var) = 0;			\
50 } while (0)
51 
52 static inline int jump_label_apply_nops(struct module *mod)
53 {
54 	return 0;
55 }
56 
57 static inline int jump_label_text_reserved(void *start, void *end)
58 {
59 	return 0;
60 }
61 
62 #endif
63 
64 #define COND_STMT(key, stmt)					\
65 do {								\
66 	__label__ jl_enabled;					\
67 	JUMP_LABEL(key, jl_enabled);				\
68 	if (0) {						\
69 jl_enabled:							\
70 		stmt;						\
71 	}							\
72 } while (0)
73 
74 #endif
75