Re: [PATCH] selftests/powerpc: Fix prefixes in alignment_handler signal handler

2020-09-09 Thread Michael Ellerman
On Mon, 24 Aug 2020 23:12:31 +1000, Jordan Niethe wrote:
> The signal handler in the alignment handler self test has the ability to
> jump over the instruction that triggered the signal. It does this by
> incrementing the PT_NIP in the user context by 4. If it were a prefixed
> instruction this will mean that the suffix is then executed which is
> incorrect. Instead check if the major opcode indicates a prefixed
> instruction (e.g. it is 1) and if so increment PT_NIP by 8.
> 
> [...]

Applied to powerpc/next.

[1/1] selftests/powerpc: Fix prefixes in alignment_handler signal handler
  https://git.kernel.org/powerpc/c/db96221a683342fd4775fd820a4d5376cd2f2ed0

cheers


Re: [PATCH] selftests/powerpc: Fix prefixes in alignment_handler signal handler

2020-08-26 Thread Jordan Niethe
On Mon, Aug 24, 2020 at 11:12 PM Jordan Niethe  wrote:
>
> The signal handler in the alignment handler self test has the ability to
> jump over the instruction that triggered the signal. It does this by
> incrementing the PT_NIP in the user context by 4. If it were a prefixed
> instruction this will mean that the suffix is then executed which is
> incorrect. Instead check if the major opcode indicates a prefixed
> instruction (e.g. it is 1) and if so increment PT_NIP by 8.
>
> If ISA v3.1 is not available treat it as a word instruction even if the
> major opcode is 1.
>
> Fixes: 620a6473df36 ("selftests/powerpc: Add prefixed loads/stores to
> alignment_handler test")
> Signed-off-by: Jordan Niethe 
> ---
>  .../selftests/powerpc/alignment/alignment_handler.c   | 11 ++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/powerpc/alignment/alignment_handler.c 
> b/tools/testing/selftests/powerpc/alignment/alignment_handler.c
> index 55ef15184057..c197ff828120 100644
> --- a/tools/testing/selftests/powerpc/alignment/alignment_handler.c
> +++ b/tools/testing/selftests/powerpc/alignment/alignment_handler.c
> @@ -64,12 +64,14 @@ int bufsize;
>  int debug;
>  int testing;
>  volatile int gotsig;
> +bool haveprefixes;
>  char *cipath = "/dev/fb0";
>  long cioffset;
>
>  void sighandler(int sig, siginfo_t *info, void *ctx)
>  {
> ucontext_t *ucp = ctx;
> +   u32 inst;
Oh this should be befine __powerpc64__/CONFIG_PPC64 (thank you patchwork).
>
> if (!testing) {
> signal(sig, SIG_DFL);
> @@ -77,7 +79,12 @@ void sighandler(int sig, siginfo_t *info, void *ctx)
> }
> gotsig = sig;
>  #ifdef __powerpc64__
> -   ucp->uc_mcontext.gp_regs[PT_NIP] += 4;
> +   if (haveprefixes) {
> +   inst = *(u32 *)ucp->uc_mcontext.gp_regs[PT_NIP];
> +   ucp->uc_mcontext.gp_regs[PT_NIP] += ((inst >> 26 == 1) ? 8 : 
> 4);
> +   } else {
> +   ucp->uc_mcontext.gp_regs[PT_NIP] += 4;
> +   }
>  #else
> ucp->uc_mcontext.uc_regs->gregs[PT_NIP] += 4;
>  #endif
> @@ -648,6 +655,8 @@ int main(int argc, char *argv[])
> exit(1);
> }
>
> +   haveprefixes = have_hwcap2(PPC_FEATURE2_ARCH_3_1);
> +
> rc |= test_harness(test_alignment_handler_vsx_206,
>"test_alignment_handler_vsx_206");
> rc |= test_harness(test_alignment_handler_vsx_207,
> --
> 2.17.1
>


[PATCH] selftests/powerpc: Fix prefixes in alignment_handler signal handler

2020-08-24 Thread Jordan Niethe
The signal handler in the alignment handler self test has the ability to
jump over the instruction that triggered the signal. It does this by
incrementing the PT_NIP in the user context by 4. If it were a prefixed
instruction this will mean that the suffix is then executed which is
incorrect. Instead check if the major opcode indicates a prefixed
instruction (e.g. it is 1) and if so increment PT_NIP by 8.

If ISA v3.1 is not available treat it as a word instruction even if the
major opcode is 1.

Fixes: 620a6473df36 ("selftests/powerpc: Add prefixed loads/stores to
alignment_handler test")
Signed-off-by: Jordan Niethe 
---
 .../selftests/powerpc/alignment/alignment_handler.c   | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/powerpc/alignment/alignment_handler.c 
b/tools/testing/selftests/powerpc/alignment/alignment_handler.c
index 55ef15184057..c197ff828120 100644
--- a/tools/testing/selftests/powerpc/alignment/alignment_handler.c
+++ b/tools/testing/selftests/powerpc/alignment/alignment_handler.c
@@ -64,12 +64,14 @@ int bufsize;
 int debug;
 int testing;
 volatile int gotsig;
+bool haveprefixes;
 char *cipath = "/dev/fb0";
 long cioffset;
 
 void sighandler(int sig, siginfo_t *info, void *ctx)
 {
ucontext_t *ucp = ctx;
+   u32 inst;
 
if (!testing) {
signal(sig, SIG_DFL);
@@ -77,7 +79,12 @@ void sighandler(int sig, siginfo_t *info, void *ctx)
}
gotsig = sig;
 #ifdef __powerpc64__
-   ucp->uc_mcontext.gp_regs[PT_NIP] += 4;
+   if (haveprefixes) {
+   inst = *(u32 *)ucp->uc_mcontext.gp_regs[PT_NIP];
+   ucp->uc_mcontext.gp_regs[PT_NIP] += ((inst >> 26 == 1) ? 8 : 4);
+   } else {
+   ucp->uc_mcontext.gp_regs[PT_NIP] += 4;
+   }
 #else
ucp->uc_mcontext.uc_regs->gregs[PT_NIP] += 4;
 #endif
@@ -648,6 +655,8 @@ int main(int argc, char *argv[])
exit(1);
}
 
+   haveprefixes = have_hwcap2(PPC_FEATURE2_ARCH_3_1);
+
rc |= test_harness(test_alignment_handler_vsx_206,
   "test_alignment_handler_vsx_206");
rc |= test_harness(test_alignment_handler_vsx_207,
-- 
2.17.1