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