On 8/24/21 6:18 PM, Michael Ellerman wrote:

Ganesh Goudar <ganes...@linux.ibm.com> writes:
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.
...

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
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?

it works!, We need to set timeout, with 120 sec timeout we may flood the dmesg.
Thanks.


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");
+}

Reply via email to