blob: 70f9b9bfb1f9646a1bdfe3ab597c5b9c26e80b7e [file] [log] [blame]
Rabin Vincent09f05d82012-02-18 17:52:41 +01001#ifndef _ASM_ARM_JUMP_LABEL_H
2#define _ASM_ARM_JUMP_LABEL_H
3
4#ifdef __KERNEL__
5
6#include <linux/types.h>
Rabin Vincent09f05d82012-02-18 17:52:41 +01007
8#define JUMP_LABEL_NOP_SIZE 4
9
10#ifdef CONFIG_THUMB2_KERNEL
11#define JUMP_LABEL_NOP "nop.w"
12#else
13#define JUMP_LABEL_NOP "nop"
14#endif
15
Rabin Vincent708e59782012-04-14 21:51:32 +010016static __always_inline bool arch_static_branch(struct static_key *key)
Rabin Vincent09f05d82012-02-18 17:52:41 +010017{
Ingo Molnar3f0116c2013-10-10 10:16:30 +020018 asm_volatile_goto("1:\n\t"
Rabin Vincent09f05d82012-02-18 17:52:41 +010019 JUMP_LABEL_NOP "\n\t"
20 ".pushsection __jump_table, \"aw\"\n\t"
21 ".word 1b, %l[l_yes], %c0\n\t"
22 ".popsection\n\t"
23 : : "i" (key) : : l_yes);
24
25 return false;
26l_yes:
27 return true;
28}
29
30#endif /* __KERNEL__ */
31
32typedef u32 jump_label_t;
33
34struct jump_entry {
35 jump_label_t code;
36 jump_label_t target;
37 jump_label_t key;
38};
39
40#endif