]> granicus.if.org Git - strace/blob - tests/membarrier.c
strace: terminate itself if interrupted by a signal
[strace] / tests / membarrier.c
1 /*
2  * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
3  * Copyright (c) 2015-2018 The strace developers.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: GPL-2.0-or-later
7  */
8
9 #include "tests.h"
10 #include <asm/unistd.h>
11 #include "scno.h"
12
13 #ifdef __NR_membarrier
14
15 # include <assert.h>
16 # include <errno.h>
17 # include <stdio.h>
18 # include <unistd.h>
19
20 int
21 main(void)
22 {
23         assert(syscall(__NR_membarrier, 3, 255) == -1);
24         int saved_errno = errno;
25         printf("membarrier(0x3 /* MEMBARRIER_CMD_??? */, 255) = %s\n",
26                sprintrc(-1));
27         if (saved_errno != ENOSYS) {
28                 const char *text_global;
29                 const char *text;
30                 int rc = syscall(__NR_membarrier, 0, 0);
31
32                 assert(rc >= 0);
33
34                 text_global = rc & 1 ? "MEMBARRIER_CMD_GLOBAL" : "";
35
36                 switch (rc & ~1) {
37                 case 0:
38                         text = "";
39                         break;
40                 case 8:
41                         text = "MEMBARRIER_CMD_PRIVATE_EXPEDITED";
42                         break;
43                 case 8|16:
44                         text = "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
45                                "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
46                         break;
47
48                 case 2|4|8|16:
49                         text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
50                                "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
51                                "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
52                                "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
53                         break;
54
55                 case 2|4|8|16|32|64:
56                         text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
57                                "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
58                                "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
59                                "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
60                                "MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE|"
61                                "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE";
62                         break;
63
64                 default:
65                         error_msg_and_fail("membarrier returned %#x, does"
66                                            " the test have to be updated?", rc);
67                 }
68                 printf("membarrier(MEMBARRIER_CMD_QUERY, 0) = %#x (%s%s%s)\n",
69                        rc, text_global, text[0] && text_global[0] ? "|" : "",
70                        text);
71         }
72         puts("+++ exited with 0 +++");
73         return 0;
74 }
75
76 #else
77
78 SKIP_MAIN_UNDEFINED("__NR_membarrier")
79
80 #endif