Sandipan Das <sandi...@linux.ibm.com> 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 <sandi...@linux.ibm.com>
> ---
>  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

Reply via email to