<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <pre>On 8/24/21 6:18 PM, Michael Ellerman wrote:</pre>
    <blockquote type="cite" cite="mid:87a6l7c8ku.fsf@mpe.ellerman.id.au">
      <pre class="moz-quote-pre" wrap="">Ganesh Goudar <a class="moz-txt-link-rfc2396E" href="mailto:ganeshgr@linux.ibm.com"><ganeshgr@linux.ibm.com></a> writes:
</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">Add test for real address or control memory address access
error handling, using NX-GZIP engine.

The error is injected by accessing the control memory address
using illegal instruction, on successful handling the process
attempting to access control memory address using illegal
instruction receives SIGBUS.
</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">...

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">diff --git a/tools/testing/selftests/powerpc/mce/inject-ra-err.sh b/tools/testing/selftests/powerpc/mce/inject-ra-err.sh
new file mode 100755
index 000000000000..3633cdc651a1
--- /dev/null
+++ b/tools/testing/selftests/powerpc/mce/inject-ra-err.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if [[ ! -w /dev/crypto/nx-gzip ]]; then
+       echo "WARN: Can't access /dev/crypto/nx-gzip, skipping"
+       exit 0
+fi
+
+timeout 5 ./inject-ra-err
+
+# 128 + 7 (SIGBUS) = 135, 128 is a exit code with special meaning.
+if [ $? -ne 135 ]; then
+       echo "FAILED: Real address or Control memory access error not handled"
+       exit $?
+fi
+
+echo "OK: Real address or Control memory access error is handled"
+exit 0
</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">
I don't think we really need the shell script, we should be able to do
all that in the C code.

Can you try this?</pre>
    </blockquote>
    <pre>it works!, We need to set timeout, with 120 sec timeout we may flood the dmesg.
Thanks.
</pre>
    <blockquote type="cite" cite="mid:87a6l7c8ku.fsf@mpe.ellerman.id.au">
      <pre class="moz-quote-pre" wrap="">

cheers

diff --git a/tools/testing/selftests/powerpc/mce/Makefile b/tools/testing/selftests/powerpc/mce/Makefile
new file mode 100644
index 000000000000..2424513982d9
--- /dev/null
+++ b/tools/testing/selftests/powerpc/mce/Makefile
@@ -0,0 +1,7 @@
+#SPDX-License-Identifier: GPL-2.0-or-later
+
+TEST_GEN_PROGS := inject-ra-err
+
+include ../../lib.mk
+
+$(TEST_GEN_PROGS): ../harness.c
diff --git a/tools/testing/selftests/powerpc/mce/inject-ra-err.c b/tools/testing/selftests/powerpc/mce/inject-ra-err.c
new file mode 100644
index 000000000000..ba0f9c28f786
--- /dev/null
+++ b/tools/testing/selftests/powerpc/mce/inject-ra-err.c
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "vas-api.h"
+#include "utils.h"
+
+static bool faulted;
+
+static void sigbus_handler(int n, siginfo_t *info, void *ctxt_v)
+{
+       ucontext_t *ctxt = (ucontext_t *)ctxt_v;
+       struct pt_regs *regs = ctxt->uc_mcontext.regs;
+
+       faulted = true;
+       regs->nip += 4;
+}
+
+static int test_ra_error(void)
+{
+       struct vas_tx_win_open_attr attr;
+       int fd, *paste_addr;
+       char *devname = "/dev/crypto/nx-gzip";
+       struct sigaction act = {
+               .sa_sigaction = sigbus_handler,
+               .sa_flags = SA_SIGINFO,
+       };
+
+       memset(&attr, 0, sizeof(attr));
+       attr.version = 1;
+       attr.vas_id = 0;
+
+       SKIP_IF(!access(devname, F_OK));
+
+       fd = open(devname, O_RDWR);
+       FAIL_IF(fd < 0);
+       FAIL_IF(ioctl(fd, VAS_TX_WIN_OPEN, &attr) < 0);
+       FAIL_IF(sigaction(SIGBUS, &act, NULL) != 0);
+
+       paste_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0ULL);
+
+       /* The following assignment triggers exception */
+       mb();
+       *paste_addr = 1;
+       mb();
+
+       FAIL_IF(!faulted);
+
+       return 0;
+}
+
+int main(void)
+{
+       return test_harness(test_ra_error, "inject-ra-err");
+}
</pre>
    </blockquote>
  </body>
</html>