Re: [PATCH 1/3] powerpc: sstep: Add tests for compute type instructions
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2019-02-21 11:15:14
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Linus Torvalds
Sandipan Das [off-list ref] writes:
This enhances the current selftest framework for validating the in-kernel instruction emulation infrastructure by adding support for compute type instructions i.e. integer ALU-based instructions. Originally, this framework was limited to only testing load and store instructions. While most of the GPRs can be validated, support for SPRs is limited to LR, CR and XER for now. When writing the test cases, one must ensure that the Stack Pointer (GPR1) or the Thread Pointer (GPR13) are not touched by any means as these are vital non-volatile registers. Signed-off-by: Sandipan Das <redacted> --- arch/powerpc/lib/Makefile | 3 +- arch/powerpc/lib/test_emulate_step.c | 167 +++++++++++++++++- .../lib/test_emulate_step_exec_instr.S | 150 ++++++++++++++++ 3 files changed, 315 insertions(+), 5 deletions(-) create mode 100644 arch/powerpc/lib/test_emulate_step_exec_instr.S
Hi Sandipan, Thanks for the exceptionally well written asm, I wish all our asm code was that neat and well commented :) I'd like to get this merged today so I tweaked it slightly when applying to use the new patch_site helpers we added recently, see diff below. cheers
diff --git a/arch/powerpc/lib/test_emulate_step.c b/arch/powerpc/lib/test_emulate_step.c
index 1c13b3bebeca..9992c1ea7a1d 100644
--- a/arch/powerpc/lib/test_emulate_step.c
+++ b/arch/powerpc/lib/test_emulate_step.c@@ -865,14 +865,14 @@ static int __init emulate_compute_instr(struct pt_regs *regs, static int __init execute_compute_instr(struct pt_regs *regs, unsigned int instr) { - extern unsigned int exec_instr_execute[]; extern int exec_instr(struct pt_regs *regs); + extern s32 patch__exec_instr; if (!regs || !instr) return -EINVAL; /* Patch the NOP with the actual instruction */ - patch_instruction(&exec_instr_execute[0], instr); + patch_instruction_site(&patch__exec_instr, instr); if (exec_instr(regs)) { pr_info("execution failed, instruction = 0x%08x\n", instr); return -EFAULT;
diff --git a/arch/powerpc/lib/test_emulate_step_exec_instr.S b/arch/powerpc/lib/test_emulate_step_exec_instr.S
index 84cef7d78d9d..1580f34f4f4f 100644
--- a/arch/powerpc/lib/test_emulate_step_exec_instr.S
+++ b/arch/powerpc/lib/test_emulate_step_exec_instr.S@@ -8,6 +8,7 @@ #include <asm/asm-offsets.h> #include <asm/ppc_asm.h> +#include <asm/code-patching-asm.h> #include <linux/errno.h> /* int exec_instr(struct pt_regs *regs) */
@@ -78,10 +79,9 @@ _GLOBAL(exec_instr) REST_GPR(12, r31) REST_NVGPRS(r31) - .global exec_instr_execute -exec_instr_execute: /* Placeholder for the test instruction */ 1: nop + patch_site 1b patch__exec_instr /* * Since GPR3 is overwritten, temporarily restore it back to its