diff options
author | Markos Chandras <markos.chandras@imgtec.com> | 2015-03-09 10:54:49 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-04-10 09:41:43 -0400 |
commit | 60cd7e08e453bc6828ac4b539f949e4acd80f143 (patch) | |
tree | 8a87f321e29648704d9bd46292cb4ac32a0d9ed7 | |
parent | 872cd4c2c617bb3a203ebe18115fd0c697112b87 (diff) |
MIPS: asm: asm-eva: Introduce kernel load/store variants
Introduce new macros for kernel load/store variants which will be
used to perform regular kernel space load/store operations in EVA
mode.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Cc: <stable@vger.kernel.org> # v3.15+
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/9500/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r-- | arch/mips/include/asm/asm-eva.h | 137 |
1 files changed, 93 insertions, 44 deletions
diff --git a/arch/mips/include/asm/asm-eva.h b/arch/mips/include/asm/asm-eva.h index e41c56e375b1..1e38f0e1ea3e 100644 --- a/arch/mips/include/asm/asm-eva.h +++ b/arch/mips/include/asm/asm-eva.h | |||
@@ -11,6 +11,36 @@ | |||
11 | #define __ASM_ASM_EVA_H | 11 | #define __ASM_ASM_EVA_H |
12 | 12 | ||
13 | #ifndef __ASSEMBLY__ | 13 | #ifndef __ASSEMBLY__ |
14 | |||
15 | /* Kernel variants */ | ||
16 | |||
17 | #define kernel_cache(op, base) "cache " op ", " base "\n" | ||
18 | #define kernel_ll(reg, addr) "ll " reg ", " addr "\n" | ||
19 | #define kernel_sc(reg, addr) "sc " reg ", " addr "\n" | ||
20 | #define kernel_lw(reg, addr) "lw " reg ", " addr "\n" | ||
21 | #define kernel_lwl(reg, addr) "lwl " reg ", " addr "\n" | ||
22 | #define kernel_lwr(reg, addr) "lwr " reg ", " addr "\n" | ||
23 | #define kernel_lh(reg, addr) "lh " reg ", " addr "\n" | ||
24 | #define kernel_lb(reg, addr) "lb " reg ", " addr "\n" | ||
25 | #define kernel_lbu(reg, addr) "lbu " reg ", " addr "\n" | ||
26 | #define kernel_sw(reg, addr) "sw " reg ", " addr "\n" | ||
27 | #define kernel_swl(reg, addr) "swl " reg ", " addr "\n" | ||
28 | #define kernel_swr(reg, addr) "swr " reg ", " addr "\n" | ||
29 | #define kernel_sh(reg, addr) "sh " reg ", " addr "\n" | ||
30 | #define kernel_sb(reg, addr) "sb " reg ", " addr "\n" | ||
31 | |||
32 | #ifdef CONFIG_32BIT | ||
33 | /* | ||
34 | * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
35 | * do the correct thing | ||
36 | */ | ||
37 | #define kernel_sd(reg, addr) user_sw(reg, addr) | ||
38 | #define kernel_ld(reg, addr) user_lw(reg, addr) | ||
39 | #else | ||
40 | #define kernel_sd(reg, addr) "sd " reg", " addr "\n" | ||
41 | #define kernel_ld(reg, addr) "ld " reg", " addr "\n" | ||
42 | #endif /* CONFIG_32BIT */ | ||
43 | |||
14 | #ifdef CONFIG_EVA | 44 | #ifdef CONFIG_EVA |
15 | 45 | ||
16 | #define __BUILD_EVA_INSN(insn, reg, addr) \ | 46 | #define __BUILD_EVA_INSN(insn, reg, addr) \ |
@@ -41,37 +71,60 @@ | |||
41 | 71 | ||
42 | #else | 72 | #else |
43 | 73 | ||
44 | #define user_cache(op, base) "cache " op ", " base "\n" | 74 | #define user_cache(op, base) kernel_cache(op, base) |
45 | #define user_ll(reg, addr) "ll " reg ", " addr "\n" | 75 | #define user_ll(reg, addr) kernel_ll(reg, addr) |
46 | #define user_sc(reg, addr) "sc " reg ", " addr "\n" | 76 | #define user_sc(reg, addr) kernel_sc(reg, addr) |
47 | #define user_lw(reg, addr) "lw " reg ", " addr "\n" | 77 | #define user_lw(reg, addr) kernel_lw(reg, addr) |
48 | #define user_lwl(reg, addr) "lwl " reg ", " addr "\n" | 78 | #define user_lwl(reg, addr) kernel_lwl(reg, addr) |
49 | #define user_lwr(reg, addr) "lwr " reg ", " addr "\n" | 79 | #define user_lwr(reg, addr) kernel_lwr(reg, addr) |
50 | #define user_lh(reg, addr) "lh " reg ", " addr "\n" | 80 | #define user_lh(reg, addr) kernel_lh(reg, addr) |
51 | #define user_lb(reg, addr) "lb " reg ", " addr "\n" | 81 | #define user_lb(reg, addr) kernel_lb(reg, addr) |
52 | #define user_lbu(reg, addr) "lbu " reg ", " addr "\n" | 82 | #define user_lbu(reg, addr) kernel_lbu(reg, addr) |
53 | #define user_sw(reg, addr) "sw " reg ", " addr "\n" | 83 | #define user_sw(reg, addr) kernel_sw(reg, addr) |
54 | #define user_swl(reg, addr) "swl " reg ", " addr "\n" | 84 | #define user_swl(reg, addr) kernel_swl(reg, addr) |
55 | #define user_swr(reg, addr) "swr " reg ", " addr "\n" | 85 | #define user_swr(reg, addr) kernel_swr(reg, addr) |
56 | #define user_sh(reg, addr) "sh " reg ", " addr "\n" | 86 | #define user_sh(reg, addr) kernel_sh(reg, addr) |
57 | #define user_sb(reg, addr) "sb " reg ", " addr "\n" | 87 | #define user_sb(reg, addr) kernel_sb(reg, addr) |
58 | 88 | ||
59 | #ifdef CONFIG_32BIT | 89 | #ifdef CONFIG_32BIT |
60 | /* | 90 | #define user_sd(reg, addr) kernel_sw(reg, addr) |
61 | * No 'sd' or 'ld' instructions in 32-bit but the code will | 91 | #define user_ld(reg, addr) kernel_lw(reg, addr) |
62 | * do the correct thing | ||
63 | */ | ||
64 | #define user_sd(reg, addr) user_sw(reg, addr) | ||
65 | #define user_ld(reg, addr) user_lw(reg, addr) | ||
66 | #else | 92 | #else |
67 | #define user_sd(reg, addr) "sd " reg", " addr "\n" | 93 | #define user_sd(reg, addr) kernel_sd(reg, addr) |
68 | #define user_ld(reg, addr) "ld " reg", " addr "\n" | 94 | #define user_ld(reg, addr) kernel_ld(reg, addr) |
69 | #endif /* CONFIG_32BIT */ | 95 | #endif /* CONFIG_32BIT */ |
70 | 96 | ||
71 | #endif /* CONFIG_EVA */ | 97 | #endif /* CONFIG_EVA */ |
72 | 98 | ||
73 | #else /* __ASSEMBLY__ */ | 99 | #else /* __ASSEMBLY__ */ |
74 | 100 | ||
101 | #define kernel_cache(op, base) cache op, base | ||
102 | #define kernel_ll(reg, addr) ll reg, addr | ||
103 | #define kernel_sc(reg, addr) sc reg, addr | ||
104 | #define kernel_lw(reg, addr) lw reg, addr | ||
105 | #define kernel_lwl(reg, addr) lwl reg, addr | ||
106 | #define kernel_lwr(reg, addr) lwr reg, addr | ||
107 | #define kernel_lh(reg, addr) lh reg, addr | ||
108 | #define kernel_lb(reg, addr) lb reg, addr | ||
109 | #define kernel_lbu(reg, addr) lbu reg, addr | ||
110 | #define kernel_sw(reg, addr) sw reg, addr | ||
111 | #define kernel_swl(reg, addr) swl reg, addr | ||
112 | #define kernel_swr(reg, addr) swr reg, addr | ||
113 | #define kernel_sh(reg, addr) sh reg, addr | ||
114 | #define kernel_sb(reg, addr) sb reg, addr | ||
115 | |||
116 | #ifdef CONFIG_32BIT | ||
117 | /* | ||
118 | * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
119 | * do the correct thing | ||
120 | */ | ||
121 | #define kernel_sd(reg, addr) user_sw(reg, addr) | ||
122 | #define kernel_ld(reg, addr) user_lw(reg, addr) | ||
123 | #else | ||
124 | #define kernel_sd(reg, addr) sd reg, addr | ||
125 | #define kernel_ld(reg, addr) ld reg, addr | ||
126 | #endif /* CONFIG_32BIT */ | ||
127 | |||
75 | #ifdef CONFIG_EVA | 128 | #ifdef CONFIG_EVA |
76 | 129 | ||
77 | #define __BUILD_EVA_INSN(insn, reg, addr) \ | 130 | #define __BUILD_EVA_INSN(insn, reg, addr) \ |
@@ -101,31 +154,27 @@ | |||
101 | #define user_sd(reg, addr) user_sw(reg, addr) | 154 | #define user_sd(reg, addr) user_sw(reg, addr) |
102 | #else | 155 | #else |
103 | 156 | ||
104 | #define user_cache(op, base) cache op, base | 157 | #define user_cache(op, base) kernel_cache(op, base) |
105 | #define user_ll(reg, addr) ll reg, addr | 158 | #define user_ll(reg, addr) kernel_ll(reg, addr) |
106 | #define user_sc(reg, addr) sc reg, addr | 159 | #define user_sc(reg, addr) kernel_sc(reg, addr) |
107 | #define user_lw(reg, addr) lw reg, addr | 160 | #define user_lw(reg, addr) kernel_lw(reg, addr) |
108 | #define user_lwl(reg, addr) lwl reg, addr | 161 | #define user_lwl(reg, addr) kernel_lwl(reg, addr) |
109 | #define user_lwr(reg, addr) lwr reg, addr | 162 | #define user_lwr(reg, addr) kernel_lwr(reg, addr) |
110 | #define user_lh(reg, addr) lh reg, addr | 163 | #define user_lh(reg, addr) kernel_lh(reg, addr) |
111 | #define user_lb(reg, addr) lb reg, addr | 164 | #define user_lb(reg, addr) kernel_lb(reg, addr) |
112 | #define user_lbu(reg, addr) lbu reg, addr | 165 | #define user_lbu(reg, addr) kernel_lbu(reg, addr) |
113 | #define user_sw(reg, addr) sw reg, addr | 166 | #define user_sw(reg, addr) kernel_sw(reg, addr) |
114 | #define user_swl(reg, addr) swl reg, addr | 167 | #define user_swl(reg, addr) kernel_swl(reg, addr) |
115 | #define user_swr(reg, addr) swr reg, addr | 168 | #define user_swr(reg, addr) kernel_swr(reg, addr) |
116 | #define user_sh(reg, addr) sh reg, addr | 169 | #define user_sh(reg, addr) kernel_sh(reg, addr) |
117 | #define user_sb(reg, addr) sb reg, addr | 170 | #define user_sb(reg, addr) kernel_sb(reg, addr) |
118 | 171 | ||
119 | #ifdef CONFIG_32BIT | 172 | #ifdef CONFIG_32BIT |
120 | /* | 173 | #define user_sd(reg, addr) kernel_sw(reg, addr) |
121 | * No 'sd' or 'ld' instructions in 32-bit but the code will | 174 | #define user_ld(reg, addr) kernel_lw(reg, addr) |
122 | * do the correct thing | ||
123 | */ | ||
124 | #define user_sd(reg, addr) user_sw(reg, addr) | ||
125 | #define user_ld(reg, addr) user_lw(reg, addr) | ||
126 | #else | 175 | #else |
127 | #define user_sd(reg, addr) sd reg, addr | 176 | #define user_sd(reg, addr) kernel_sd(reg, addr) |
128 | #define user_ld(reg, addr) ld reg, addr | 177 | #define user_ld(reg, addr) kernel_sd(reg, addr) |
129 | #endif /* CONFIG_32BIT */ | 178 | #endif /* CONFIG_32BIT */ |
130 | 179 | ||
131 | #endif /* CONFIG_EVA */ | 180 | #endif /* CONFIG_EVA */ |