powerpc: Test prefixed code patching
authorJordan Niethe <jniethe5@gmail.com>
Wed, 6 May 2020 03:40:44 +0000 (13:40 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 18 May 2020 14:11:02 +0000 (00:11 +1000)
Expand the code-patching self-tests to includes tests for patching
prefixed instructions.

Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
[mpe: Use CONFIG_PPC64 not __powerpc64__]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200506034050.24806-25-jniethe5@gmail.com
arch/powerpc/lib/Makefile
arch/powerpc/lib/code-patching.c
arch/powerpc/lib/test_code-patching.S [new file with mode: 0644]

index 5465918..5e994cd 100644 (file)
@@ -16,7 +16,7 @@ CFLAGS_code-patching.o += -DDISABLE_BRANCH_PROFILING
 CFLAGS_feature-fixups.o += -DDISABLE_BRANCH_PROFILING
 endif
 
-obj-y += alloc.o code-patching.o feature-fixups.o pmem.o inst.o
+obj-y += alloc.o code-patching.o feature-fixups.o pmem.o inst.o test_code-patching.o
 
 ifndef CONFIG_KASAN
 obj-y  +=      string.o memcmp_$(BITS).o
index e9a0ea1..64cf621 100644 (file)
@@ -708,6 +708,26 @@ static void __init test_translate_branch(void)
        vfree(buf);
 }
 
+#ifdef CONFIG_PPC64
+static void __init test_prefixed_patching(void)
+{
+       extern unsigned int code_patching_test1[];
+       extern unsigned int code_patching_test1_expected[];
+       extern unsigned int end_code_patching_test1[];
+
+       __patch_instruction((struct ppc_inst *)code_patching_test1,
+                           ppc_inst_prefix(OP_PREFIX << 26, 0x00000000),
+                           (struct ppc_inst *)code_patching_test1);
+
+       check(!memcmp(code_patching_test1,
+                     code_patching_test1_expected,
+                     sizeof(unsigned int) *
+                     (end_code_patching_test1 - code_patching_test1)));
+}
+#else
+static inline void test_prefixed_patching(void) {}
+#endif
+
 static int __init test_code_patching(void)
 {
        printk(KERN_DEBUG "Running code patching self-tests ...\n");
@@ -716,6 +736,7 @@ static int __init test_code_patching(void)
        test_branch_bform();
        test_create_function_call();
        test_translate_branch();
+       test_prefixed_patching();
 
        return 0;
 }
diff --git a/arch/powerpc/lib/test_code-patching.S b/arch/powerpc/lib/test_code-patching.S
new file mode 100644 (file)
index 0000000..a9be610
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 IBM Corporation
+ */
+#include <asm/ppc-opcode.h>
+
+       .text
+
+#define globl(x)               \
+       .globl x;       \
+x:
+
+globl(code_patching_test1)
+       nop
+       nop
+globl(end_code_patching_test1)
+
+globl(code_patching_test1_expected)
+       .long OP_PREFIX << 26
+       .long 0x0000000