FAILED: patch "[PATCH] powerpc/sstep: Fix incorrect return from analyze_instr()" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 718aae916fa6619c57c348beaedd675835cf1aa1 Mon Sep 17 00:00:00 2001
From: Ananth N Mavinakayanahalli <[email protected]>
Date: Mon, 25 Jan 2021 18:36:43 +0530
Subject: [PATCH] powerpc/sstep: Fix incorrect return from analyze_instr()
We currently just percolate the return value from analyze_instr() to the caller of emulate_step(), especially if it is a -1.
For one particular case (opcode = 4) for instructions that aren't currently emulated, we are returning 'should not be single-stepped' while we should have returned 0 which says 'did not emulate, may have to single-step'.
arch/powerpc/lib/sstep.c +6 -1
@@ -1445,6 +1445,11 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 4 : +/* +* There are very many instructions with this primary opcode +* introduced in the ISA as early as v2.03. However, the ones +* we currently emulate were all introduced with ISA 3.0 +*/ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) goto unknown_opcode;
@@ -1472,7 +1477,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,* There are other instructions from ISA 3.0 with the same * primary opcode which do not have emulation support yet. */ -return -1 ; + goto unknown_opcode;#endif case 7 :/* mulli */
PATCH 1/2 powerpc/sstep: Check instruction validity against ISA version before emulation
From: Ananth N Mavinakayanahalli <[email protected]>
[ Upstream commit 8813ff49607eab3caaf40fe8929b0ce7dc68e85f ]
We currently unconditionally try to emulate newer instructions on older Power versions that could cause issues. Gate it.
--- arch/powerpc/lib/sstep.c | 72 ++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 13 deletions(-)
arch/powerpc/lib/sstep.c +59 -13
@@ -1241,9 +1241,11 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,if ((word &0xfe2 ) ==2 ) op->type =SYSCALL ;else if (IS_ENABLED (CONFIG_PPC_BOOK3S_64 ) && - (word &0xfe3 ) ==1 ) + (word &0xfe3 ) ==1 ) {/* scv */ op->type =SYSCALL_VECTORED_0 ; -else +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; + }else op->type =UNKNOWN ;return 0 ;#endif
@@ -1347,7 +1349,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 1 :if (!cpu_has_feature (CPU_FTR_ARCH_31 )) -return -1 ; + goto unknown_opcode; prefix_r =GET_PREFIX_R (word); ra =GET_PREFIX_RA (suffix);
@@ -1381,7 +1383,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 4 :if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode;switch (word &0x3f ) {case 48 :/* maddhd */
@@ -1467,6 +1469,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 19 :if (((word >>1 ) &0x1f ) ==2 ) {/* addpcis */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; imm = (short ) (word &0xffc1 );/* d0 + d2 fields */ imm |= (word >>15 ) &0x3e ;/* d1 field */ op->val = regs->nip + (imm <<16 ) +4 ;
@@ -1779,7 +1783,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 265 :/* modud */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; op->val = regs->gpr[ra] % regs->gpr[rb]; goto compute_done;#endif
@@ -1789,7 +1793,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 267 :/* moduw */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; op->val = (unsigned int ) regs->gpr[ra] % (unsigned int ) regs->gpr[rb]; goto compute_done;
@@ -1826,7 +1830,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#endif case 755 :/* darn */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode;switch (ra &0x3 ) {case 0 :/* 32-bit conditioned */
@@ -1848,14 +1852,14 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 777 :/* modsd */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; op->val = (long int ) regs->gpr[ra] % (long int ) regs->gpr[rb]; goto compute_done;#endif case 779 :/* modsw */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; op->val = (int ) regs->gpr[ra] % (int ) regs->gpr[rb]; goto compute_done;
@@ -1932,14 +1936,14 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#endif case 538 :/* cnttzw */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; val = (unsigned int ) regs->gpr[rd]; op->val = (val ?__builtin_ctz (val) :32 ); goto logical_done;#ifdef __powerpc64__case 570 :/* cnttzd */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; val = regs->gpr[rd]; op->val = (val ?__builtin_ctzl (val) :64 ); goto logical_done;
@@ -2049,7 +2053,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 890 :/* extswsli with sh_5 = 0 */ case 891 :/* extswsli with sh_5 = 1 */ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) -return -1 ; + goto unknown_opcode; op->type =COMPUTE +SETREG ; sh = rb | ((word &2 ) <<4 ); val = (signed int ) regs->gpr[rd];
@@ -2376,6 +2380,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 268 :/* lxvx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,16 ); op->element_size =16 ;
@@ -2385,6 +2391,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 269 :/* lxvl */ case 301 : {/* lxvll */ int nb; +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->ea = ra ? regs->gpr[ra] :0 ; nb = regs->gpr[rb] &0xff ;
@@ -2404,6 +2412,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 364 :/* lxvwsx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,4 ); op->element_size =4 ;
@@ -2411,6 +2421,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 396 :/* stxvx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (STORE_VSX ,0 ,16 ); op->element_size =16 ;
@@ -2420,6 +2432,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 397 :/* stxvl */ case 429 : {/* stxvll */ int nb; +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->ea = ra ? regs->gpr[ra] :0 ; nb = regs->gpr[rb] &0xff ;
@@ -2464,6 +2478,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 781 :/* lxsibzx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,1 ); op->element_size =8 ;
@@ -2471,6 +2487,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 812 :/* lxvh8x */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,16 ); op->element_size =2 ;
@@ -2478,6 +2496,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 813 :/* lxsihzx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,2 ); op->element_size =8 ;
@@ -2491,6 +2511,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 876 :/* lxvb16x */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (LOAD_VSX ,0 ,16 ); op->element_size =1 ;
@@ -2504,6 +2526,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 909 :/* stxsibx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (STORE_VSX ,0 ,1 ); op->element_size =8 ;
@@ -2511,6 +2535,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 940 :/* stxvh8x */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (STORE_VSX ,0 ,16 ); op->element_size =2 ;
@@ -2518,6 +2544,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 941 :/* stxsihx */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (STORE_VSX ,0 ,2 ); op->element_size =8 ;
@@ -2531,6 +2559,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 1004 :/* stxvb16x */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd | ((word &1 ) <<5 ); op->type =MKOP (STORE_VSX ,0 ,16 ); op->element_size =1 ;
@@ -2639,12 +2669,16 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, op->type =MKOP (LOAD_FP ,0 ,16 );break ;case 2 :/* lxsd */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd +32 ; op->type =MKOP (LOAD_VSX ,0 ,8 ); op->element_size =8 ; op->vsx_flags =VSX_CHECK_VEC ;break ;case 3 :/* lxssp */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->reg = rd +32 ; op->type =MKOP (LOAD_VSX ,0 ,4 ); op->element_size =8 ;
@@ -2681,6 +2715,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 1 :/* lxv */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->ea =dqform_ea (word, regs);if (word &8 ) op->reg = rd +32 ;
@@ -2691,6 +2727,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 2 :/* stxsd with LSB of DS field = 0 */ case 6 :/* stxsd with LSB of DS field = 1 */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->ea =dsform_ea (word, regs); op->reg = rd +32 ; op->type =MKOP (STORE_VSX ,0 ,8 );
@@ -2700,6 +2738,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,case 3 :/* stxssp with LSB of DS field = 0 */ case 7 :/* stxssp with LSB of DS field = 1 */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->ea =dsform_ea (word, regs); op->reg = rd +32 ; op->type =MKOP (STORE_VSX ,0 ,4 );
@@ -2708,6 +2748,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 5 :/* stxv */ +if (!cpu_has_feature (CPU_FTR_ARCH_300 )) + goto unknown_opcode; op->ea =dqform_ea (word, regs);if (word &8 ) op->reg = rd +32 ;
@@ -2737,7 +2779,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,break ;case 1 :/* Prefixed instructions */ if (!cpu_has_feature (CPU_FTR_ARCH_31 )) -return -1 ; + goto unknown_opcode; prefix_r =GET_PREFIX_R (word); ra =GET_PREFIX_RA (suffix);
@@ -2872,6 +2914,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,return 0 ; + unknown_opcode: + op->type =UNKNOWN ; +return 0 ; + logical_done:if (word &1 )set_cr0 (regs, op);
base-commit: 83be32b6c9e55d5b04181fc9788591d5611d4a96
Signature · 1 line
2.25.1
PATCH 2/2 powerpc/sstep: Fix incorrect return from analyze_instr()
In reply to [email protected]From: Ananth N Mavinakayanahalli <[email protected]>
[ Upstream commit 718aae916fa6619c57c348beaedd675835cf1aa1 ]
We currently just percolate the return value from analyze_instr() to the caller of emulate_step(), especially if it is a -1.
For one particular case (opcode = 4) for instructions that aren't currently emulated, we are returning 'should not be single-stepped' while we should have returned 0 which says 'did not emulate, may have to single-step'.
--- arch/powerpc/lib/sstep.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/powerpc/lib/sstep.c +6 -1
@@ -1382,6 +1382,11 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,#ifdef __powerpc64__case 4 : +/* +* There are very many instructions with this primary opcode +* introduced in the ISA as early as v2.03. However, the ones +* we currently emulate were all introduced with ISA 3.0 +*/ if (!cpu_has_feature (CPU_FTR_ARCH_300 )) goto unknown_opcode;
@@ -1409,7 +1414,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,* There are other instructions from ISA 3.0 with the same * primary opcode which do not have emulation support yet. */ -return -1 ; + goto unknown_opcode;#endif case 7 :/* mulli */
Signature · 1 line
2.25.1