selftests/powerpc: Add test for real address error handling
authorGanesh Goudar <ganeshgr@linux.ibm.com>
Fri, 7 Jan 2022 14:14:27 +0000 (19:44 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 7 Mar 2022 13:04:59 +0000 (00:04 +1100)
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.

Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220107141428.67862-2-ganeshgr@linux.ibm.com
tools/testing/selftests/powerpc/Makefile
tools/testing/selftests/powerpc/mce/Makefile [new file with mode: 0644]
tools/testing/selftests/powerpc/mce/inject-ra-err.c [new file with mode: 0644]
tools/testing/selftests/powerpc/mce/vas-api.h [new symlink]

index 0830e63818c1efebd232cc13a6db18e17e1c70c0..4830372d7416904afdda7b1509921f07ad027458 100644 (file)
@@ -31,7 +31,8 @@ SUB_DIRS = alignment          \
           vphn         \
           math         \
           ptrace       \
-          security
+          security     \
+          mce
 
 endif
 
diff --git a/tools/testing/selftests/powerpc/mce/Makefile b/tools/testing/selftests/powerpc/mce/Makefile
new file mode 100644 (file)
index 0000000..2424513
--- /dev/null
@@ -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 (file)
index 0000000..94323c3
--- /dev/null
@@ -0,0 +1,65 @@
+// 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");
+}
+
diff --git a/tools/testing/selftests/powerpc/mce/vas-api.h b/tools/testing/selftests/powerpc/mce/vas-api.h
new file mode 120000 (symlink)
index 0000000..1455c1b
--- /dev/null
@@ -0,0 +1 @@
+../../../../../arch/powerpc/include/uapi/asm/vas-api.h
\ No newline at end of file