Line data Source code
1 : #ifndef _ASM_X86_JUMP_LABEL_H
2 : #define _ASM_X86_JUMP_LABEL_H
3 :
4 : #ifdef __KERNEL__
5 :
6 : #include <linux/stringify.h>
7 : #include <linux/types.h>
8 : #include <asm/nops.h>
9 : #include <asm/asm.h>
10 :
11 : #define JUMP_LABEL_NOP_SIZE 5
12 :
13 : #ifdef CONFIG_X86_64
14 : # define STATIC_KEY_INIT_NOP P6_NOP5_ATOMIC
15 : #else
16 : # define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC
17 : #endif
18 :
19 : static __always_inline bool arch_static_branch(struct static_key *key)
20 : {
21 12750948 : asm_volatile_goto("1:"
22 : ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
23 : ".pushsection __jump_table, \"aw\" \n\t"
24 : _ASM_ALIGN "\n\t"
25 : _ASM_PTR "1b, %l[l_yes], %c0 \n\t"
26 : ".popsection \n\t"
27 : : : "i" (key) : : l_yes);
28 : return false;
29 : l_yes:
30 : return true;
31 : }
32 :
33 : #endif /* __KERNEL__ */
34 :
35 : #ifdef CONFIG_X86_64
36 : typedef u64 jump_label_t;
37 : #else
38 : typedef u32 jump_label_t;
39 : #endif
40 :
41 : struct jump_entry {
42 : jump_label_t code;
43 : jump_label_t target;
44 : jump_label_t key;
45 : };
46 :
47 : #endif
|