Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc: Add test for real address error handling

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

authored by

Ganesh Goudar and committed by
Michael Ellerman
0f4ef8a3 0f54bdde

+74 -1
+2 -1
tools/testing/selftests/powerpc/Makefile
··· 31 31 vphn \ 32 32 math \ 33 33 ptrace \ 34 - security 34 + security \ 35 + mce 35 36 36 37 endif 37 38
+7
tools/testing/selftests/powerpc/mce/Makefile
··· 1 + #SPDX-License-Identifier: GPL-2.0-or-later 2 + 3 + TEST_GEN_PROGS := inject-ra-err 4 + 5 + include ../../lib.mk 6 + 7 + $(TEST_GEN_PROGS): ../harness.c
+65
tools/testing/selftests/powerpc/mce/inject-ra-err.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + 3 + #include <errno.h> 4 + #include <fcntl.h> 5 + #include <signal.h> 6 + #include <stdio.h> 7 + #include <string.h> 8 + #include <sys/ioctl.h> 9 + #include <sys/mman.h> 10 + #include <sys/stat.h> 11 + #include <sys/types.h> 12 + #include <unistd.h> 13 + 14 + #include "vas-api.h" 15 + #include "utils.h" 16 + 17 + static bool faulted; 18 + 19 + static void sigbus_handler(int n, siginfo_t *info, void *ctxt_v) 20 + { 21 + ucontext_t *ctxt = (ucontext_t *)ctxt_v; 22 + struct pt_regs *regs = ctxt->uc_mcontext.regs; 23 + 24 + faulted = true; 25 + regs->nip += 4; 26 + } 27 + 28 + static int test_ra_error(void) 29 + { 30 + struct vas_tx_win_open_attr attr; 31 + int fd, *paste_addr; 32 + char *devname = "/dev/crypto/nx-gzip"; 33 + struct sigaction act = { 34 + .sa_sigaction = sigbus_handler, 35 + .sa_flags = SA_SIGINFO, 36 + }; 37 + 38 + memset(&attr, 0, sizeof(attr)); 39 + attr.version = 1; 40 + attr.vas_id = 0; 41 + 42 + SKIP_IF(access(devname, F_OK)); 43 + 44 + fd = open(devname, O_RDWR); 45 + FAIL_IF(fd < 0); 46 + FAIL_IF(ioctl(fd, VAS_TX_WIN_OPEN, &attr) < 0); 47 + FAIL_IF(sigaction(SIGBUS, &act, NULL) != 0); 48 + 49 + paste_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0ULL); 50 + 51 + /* The following assignment triggers exception */ 52 + mb(); 53 + *paste_addr = 1; 54 + mb(); 55 + 56 + FAIL_IF(!faulted); 57 + 58 + return 0; 59 + } 60 + 61 + int main(void) 62 + { 63 + return test_harness(test_ra_error, "inject-ra-err"); 64 + } 65 +