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