aboutsummaryrefslogtreecommitdiff
path: root/arch/powerpc/lib/code-patching.c
diff options
context:
space:
mode:
authorGravatar Jordan Niethe <jniethe5@gmail.com> 2020-05-15 12:12:55 +1000
committerGravatar Michael Ellerman <mpe@ellerman.id.au> 2020-05-19 00:10:39 +1000
commit650b55b707fdfa764e9f2b81314d3eb4216fb962 (patch)
tree33027daca271c94467f02d17945afc0517929171 /arch/powerpc/lib/code-patching.c
parentpowerpc/optprobes: Add register argument to patch_imm64_load_insns() (diff)
downloadlinux-650b55b707fdfa764e9f2b81314d3eb4216fb962.tar.gz
linux-650b55b707fdfa764e9f2b81314d3eb4216fb962.tar.bz2
linux-650b55b707fdfa764e9f2b81314d3eb4216fb962.zip
powerpc: Add prefixed instructions to instruction data type
For powerpc64, redefine the ppc_inst type so both word and prefixed instructions can be represented. On powerpc32 the type will remain the same. Update places which had assumed instructions to be 4 bytes long. Signed-off-by: Jordan Niethe <jniethe5@gmail.com> Reviewed-by: Alistair Popple <alistair@popple.id.au> [mpe: Rework the get_user_inst() macros to be parameterised, and don't assign to the dest if an error occurred. Use CONFIG_PPC64 not __powerpc64__ in a few places. Address other comments from Christophe. Fix some sparse complaints.] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200506034050.24806-24-jniethe5@gmail.com
Diffstat (limited to 'arch/powerpc/lib/code-patching.c')
-rw-r--r--arch/powerpc/lib/code-patching.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index d946f7d6bb32..e9a0ea1c7ba4 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -24,7 +24,18 @@ static int __patch_instruction(struct ppc_inst *exec_addr, struct ppc_inst instr
{
int err = 0;
- __put_user_asm(ppc_inst_val(instr), patch_addr, err, "stw");
+ if (!ppc_inst_prefixed(instr)) {
+ __put_user_asm(ppc_inst_val(instr), patch_addr, err, "stw");
+ } else {
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+ __put_user_asm((u64)ppc_inst_suffix(instr) << 32 |
+ ppc_inst_val(instr), patch_addr, err, "std");
+#else
+ __put_user_asm((u64)ppc_inst_val(instr) << 32 |
+ ppc_inst_suffix(instr), patch_addr, err, "std");
+#endif
+ }
+
if (err)
return err;