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 /arch/mips/include/asm | |
| 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>
Diffstat (limited to 'arch/mips/include/asm')
| -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 */ |
