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 <ganes...@linux.ibm.com> --- tools/testing/selftests/powerpc/Makefile | 3 +- tools/testing/selftests/powerpc/mce/Makefile | 6 +++ .../selftests/powerpc/mce/inject-ra-err.c | 42 +++++++++++++++++++ .../selftests/powerpc/mce/inject-ra-err.sh | 19 +++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/powerpc/mce/Makefile create mode 100644 tools/testing/selftests/powerpc/mce/inject-ra-err.c create mode 100755 tools/testing/selftests/powerpc/mce/inject-ra-err.sh diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile index 0830e63818c1..4830372d7416 100644 --- a/tools/testing/selftests/powerpc/Makefile +++ b/tools/testing/selftests/powerpc/Makefile @@ -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 index 000000000000..0f537ce86370 --- /dev/null +++ b/tools/testing/selftests/powerpc/mce/Makefile @@ -0,0 +1,6 @@ +#SPDX-License-Identifier: GPL-2.0-or-later + +TEST_PROGS := inject-ra-err.sh +TEST_GEN_FILES := inject-ra-err + +include ../../lib.mk 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..58374bc92e90 --- /dev/null +++ b/tools/testing/selftests/powerpc/mce/inject-ra-err.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <asm/vas-api.h> + +int main(void) +{ + int fd, ret; + int *paste_addr; + struct vas_tx_win_open_attr attr; + char *devname = "/dev/crypto/nx-gzip"; + + memset(&attr, 0, sizeof(attr)); + attr.version = 1; + attr.vas_id = 0; + + fd = open(devname, O_RDWR); + if (fd < 0) { + fprintf(stderr, "Failed to open device %s\n", devname); + return -errno; + } + ret = ioctl(fd, VAS_TX_WIN_OPEN, &attr); + if (ret < 0) { + fprintf(stderr, "ioctl() n %d, error %d\n", ret, errno); + ret = -errno; + goto out; + } + paste_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0ULL); + /* The following assignment triggers exception */ + *paste_addr = 1; + ret = 0; +out: + close(fd); + return ret; +} 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..0e9c8ae6ad78 --- /dev/null +++ b/tools/testing/selftests/powerpc/mce/inject-ra-err.sh @@ -0,0 +1,19 @@ +#!/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 in 5 seconds, If not handled it may run indefinitely. +timeout 5 ./inject-ra-err + +# 128 + 7 (SIGBUS) = 135, 128 is a exit Code With Special Meaning. +if [ $? -ne 135 ]; then + echo "FAILED: Control memory access error not handled" + exit $? +fi + +echo "OK: Control memory access error is handled" +exit 0 -- 2.31.1