]> granicus.if.org Git - strace/blob - tests/io_uring_enter.c
Remove XLAT_END
[strace] / tests / io_uring_enter.c
1 /*
2  * Check decoding of io_uring_enter syscall.
3  *
4  * Copyright (c) 2019 Dmitry V. Levin <ldv@altlinux.org>
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9
10 #include "tests.h"
11 #include <unistd.h>
12 #include "scno.h"
13
14 #ifdef __NR_io_uring_enter
15
16 # include <fcntl.h>
17 # include <signal.h>
18 # include <stdio.h>
19 # include <string.h>
20
21 static const char *errstr;
22
23 static long
24 sys_io_uring_enter(unsigned int fd, unsigned int to_submit,
25                    unsigned int min_complete, unsigned int flags,
26                    const void *sigset_addr, kernel_ulong_t sigset_size)
27
28 {
29         kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
30         kernel_ulong_t arg1 = fill | fd;
31         kernel_ulong_t arg2 = fill | to_submit;
32         kernel_ulong_t arg3 = fill | min_complete;
33         kernel_ulong_t arg4 = fill | flags;
34         kernel_ulong_t arg5 = (unsigned long) sigset_addr;
35         kernel_ulong_t arg6 = sigset_size;
36
37         long rc = syscall(__NR_io_uring_enter,
38                           arg1, arg2, arg3, arg4, arg5, arg6);
39         errstr = sprintrc(rc);
40         return rc;
41 }
42
43 int
44 main(void)
45 {
46         static const char path[] = "/dev/null";
47
48         skip_if_unavailable("/proc/self/fd/");
49
50         int fd = open(path, O_RDONLY);
51         if (fd < 0)
52                 perror_msg_and_fail("open: %s", path);
53
54         const unsigned int size = get_sigset_size();
55         void *const sigmask = tail_alloc(size);
56         sigset_t mask;
57
58         memset(&mask, -1, sizeof(mask));
59         sigdelset(&mask, SIGHUP);
60         sigdelset(&mask, SIGKILL);
61         sigdelset(&mask, SIGSTOP);
62         memcpy(sigmask, &mask, size);
63
64         const unsigned int to_submit = 0xdeadbeef;
65         const unsigned int min_complete = 0xcafef00d;
66
67         sys_io_uring_enter(fd, to_submit, min_complete, -1U, sigmask, size);
68         printf("io_uring_enter(%u<%s>, %u, %u"
69                ", IORING_ENTER_GETEVENTS|IORING_ENTER_SQ_WAKEUP|%#x"
70                ", %s, %u) = %s\n",
71                fd, path, to_submit, min_complete, -1U - 3,
72                "~[HUP KILL STOP]", size, errstr);
73
74         puts("+++ exited with 0 +++");
75         return 0;
76 }
77
78 #else
79
80 SKIP_MAIN_UNDEFINED("__NR_io_uring_enter")
81
82 #endif