Commit | Line | Data |
---|---|---|
ebc00dde ERB |
1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* | |
3 | * Copyright (C) 2020 Emil Renner Berthing | |
4 | * | |
5 | * Based on arch/arm64/include/asm/jump_label.h | |
6 | */ | |
7 | #ifndef __ASM_JUMP_LABEL_H | |
8 | #define __ASM_JUMP_LABEL_H | |
9 | ||
10 | #ifndef __ASSEMBLY__ | |
11 | ||
12 | #include <linux/types.h> | |
13 | #include <asm/asm.h> | |
14 | ||
15 | #define JUMP_LABEL_NOP_SIZE 4 | |
16 | ||
89fd4a1d JZ |
17 | static __always_inline bool arch_static_branch(struct static_key * const key, |
18 | const bool branch) | |
ebc00dde | 19 | { |
4356e9f8 | 20 | asm goto( |
9ddfc3cd | 21 | " .align 2 \n\t" |
ebc00dde ERB |
22 | " .option push \n\t" |
23 | " .option norelax \n\t" | |
24 | " .option norvc \n\t" | |
25 | "1: nop \n\t" | |
26 | " .option pop \n\t" | |
27 | " .pushsection __jump_table, \"aw\" \n\t" | |
28 | " .align " RISCV_LGPTR " \n\t" | |
29 | " .long 1b - ., %l[label] - . \n\t" | |
30 | " " RISCV_PTR " %0 - . \n\t" | |
31 | " .popsection \n\t" | |
32 | : : "i"(&((char *)key)[branch]) : : label); | |
33 | ||
34 | return false; | |
35 | label: | |
36 | return true; | |
37 | } | |
38 | ||
89fd4a1d JZ |
39 | static __always_inline bool arch_static_branch_jump(struct static_key * const key, |
40 | const bool branch) | |
ebc00dde | 41 | { |
4356e9f8 | 42 | asm goto( |
9ddfc3cd | 43 | " .align 2 \n\t" |
ebc00dde ERB |
44 | " .option push \n\t" |
45 | " .option norelax \n\t" | |
46 | " .option norvc \n\t" | |
47 | "1: jal zero, %l[label] \n\t" | |
48 | " .option pop \n\t" | |
49 | " .pushsection __jump_table, \"aw\" \n\t" | |
50 | " .align " RISCV_LGPTR " \n\t" | |
51 | " .long 1b - ., %l[label] - . \n\t" | |
52 | " " RISCV_PTR " %0 - . \n\t" | |
53 | " .popsection \n\t" | |
54 | : : "i"(&((char *)key)[branch]) : : label); | |
55 | ||
56 | return false; | |
57 | label: | |
58 | return true; | |
59 | } | |
60 | ||
61 | #endif /* __ASSEMBLY__ */ | |
62 | #endif /* __ASM_JUMP_LABEL_H */ |