|
@@ -14,13 +14,6 @@
|
|
|
#error asm/jump_label.h included on a non-jump-label kernel
|
|
|
#endif
|
|
|
|
|
|
-#ifndef __ASSEMBLY__
|
|
|
-
|
|
|
-#include <linux/stringify.h>
|
|
|
-#include <linux/types.h>
|
|
|
-#include <asm/nops.h>
|
|
|
-#include <asm/asm.h>
|
|
|
-
|
|
|
#define JUMP_LABEL_NOP_SIZE 5
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
@@ -29,6 +22,14 @@
|
|
|
# define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC
|
|
|
#endif
|
|
|
|
|
|
+#include <asm/asm.h>
|
|
|
+#include <asm/nops.h>
|
|
|
+
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
+
|
|
|
+#include <linux/stringify.h>
|
|
|
+#include <linux/types.h>
|
|
|
+
|
|
|
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
|
|
|
{
|
|
|
asm_volatile_goto("1:"
|
|
@@ -72,5 +73,40 @@ struct jump_entry {
|
|
|
jump_label_t key;
|
|
|
};
|
|
|
|
|
|
-#endif /* __ASSEMBLY__ */
|
|
|
+#else /* __ASSEMBLY__ */
|
|
|
+
|
|
|
+.macro STATIC_JUMP_IF_TRUE target, key, def
|
|
|
+.Lstatic_jump_\@:
|
|
|
+ .if \def
|
|
|
+ /* Equivalent to "jmp.d32 \target" */
|
|
|
+ .byte 0xe9
|
|
|
+ .long \target - .Lstatic_jump_after_\@
|
|
|
+.Lstatic_jump_after_\@:
|
|
|
+ .else
|
|
|
+ .byte STATIC_KEY_INIT_NOP
|
|
|
+ .endif
|
|
|
+ .pushsection __jump_table, "aw"
|
|
|
+ _ASM_ALIGN
|
|
|
+ _ASM_PTR .Lstatic_jump_\@, \target, \key
|
|
|
+ .popsection
|
|
|
+.endm
|
|
|
+
|
|
|
+.macro STATIC_JUMP_IF_FALSE target, key, def
|
|
|
+.Lstatic_jump_\@:
|
|
|
+ .if \def
|
|
|
+ .byte STATIC_KEY_INIT_NOP
|
|
|
+ .else
|
|
|
+ /* Equivalent to "jmp.d32 \target" */
|
|
|
+ .byte 0xe9
|
|
|
+ .long \target - .Lstatic_jump_after_\@
|
|
|
+.Lstatic_jump_after_\@:
|
|
|
+ .endif
|
|
|
+ .pushsection __jump_table, "aw"
|
|
|
+ _ASM_ALIGN
|
|
|
+ _ASM_PTR .Lstatic_jump_\@, \target, \key + 1
|
|
|
+ .popsection
|
|
|
+.endm
|
|
|
+
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
+
|
|
|
#endif
|