Commit | Line | Data |
---|---|---|
544cdc88 | 1 | // SPDX-License-Identifier: LGPL-2.1-only |
93da3184 MD |
2 | /* |
3 | * Basic test coverage for critical regions and rseq_current_cpu(). | |
4 | */ | |
5 | ||
6 | #ifndef _GNU_SOURCE | |
7 | #define _GNU_SOURCE | |
8 | #endif | |
9 | #include <assert.h> | |
10 | #include <sched.h> | |
11 | #include <signal.h> | |
12 | #include <stdio.h> | |
13 | #include <string.h> | |
14 | #include <sys/time.h> | |
15 | ||
16 | #include <rseq/rseq.h> | |
17 | ||
544cdc88 MJ |
18 | #include "tap.h" |
19 | ||
93da3184 MD |
20 | void test_cpu_pointer(void) |
21 | { | |
22 | cpu_set_t affinity, test_affinity; | |
544cdc88 MJ |
23 | int ret, i; |
24 | ||
544cdc88 MJ |
25 | ret = sched_getaffinity(0, sizeof(affinity), &affinity); |
26 | ok(ret == 0, "Get current thread affinity mask"); | |
93da3184 | 27 | |
93da3184 MD |
28 | CPU_ZERO(&test_affinity); |
29 | for (i = 0; i < CPU_SETSIZE; i++) { | |
30 | if (CPU_ISSET(i, &affinity)) { | |
31 | CPU_SET(i, &test_affinity); | |
544cdc88 MJ |
32 | |
33 | ret = sched_setaffinity(0, sizeof(test_affinity), | |
93da3184 | 34 | &test_affinity); |
544cdc88 MJ |
35 | ok(ret == 0, "Set affinity mask to CPU %d exclusively", i); |
36 | ||
37 | ok(sched_getcpu() == i, "sched_getcpu returns CPU %d", i); | |
38 | ok(rseq_current_cpu() == (unsigned int) i, "rseq_current_cpu returns CPU %d", i); | |
39 | ok(rseq_current_cpu_raw() == i, "rseq_current_cpu_raw returns CPU %d", i); | |
40 | ok(rseq_cpu_start() == (unsigned int) i, "rseq_cpu_start returns CPU %d", i); | |
41 | ||
93da3184 MD |
42 | CPU_CLR(i, &test_affinity); |
43 | } | |
44 | } | |
544cdc88 MJ |
45 | |
46 | ret = sched_setaffinity(0, sizeof(affinity), &affinity); | |
47 | ok(ret == 0, "Restore current thread initial affinity mask"); | |
93da3184 MD |
48 | } |
49 | ||
50 | int main(void) | |
51 | { | |
d1cdec98 MJ |
52 | /* |
53 | * Skip all tests if the rseq syscall is unavailable | |
54 | */ | |
55 | if (rseq_available()) { | |
56 | plan_no_plan(); | |
57 | } else { | |
58 | plan_skip_all("The rseq syscall is unavailable"); | |
59 | } | |
544cdc88 | 60 | |
93da3184 | 61 | if (rseq_register_current_thread()) { |
d1cdec98 | 62 | fail("rseq_register_current_thread(...) failed(%d): %s\n", |
93da3184 | 63 | errno, strerror(errno)); |
d1cdec98 MJ |
64 | goto end; |
65 | } else { | |
66 | pass("Registered current thread with rseq"); | |
93da3184 | 67 | } |
544cdc88 | 68 | |
93da3184 | 69 | test_cpu_pointer(); |
544cdc88 | 70 | |
93da3184 | 71 | if (rseq_unregister_current_thread()) { |
d1cdec98 | 72 | fail("rseq_unregister_current_thread(...) failed(%d): %s\n", |
93da3184 | 73 | errno, strerror(errno)); |
d1cdec98 MJ |
74 | goto end; |
75 | } else { | |
76 | pass("Unregistered current thread with rseq"); | |
93da3184 | 77 | } |
544cdc88 | 78 | |
d1cdec98 MJ |
79 | end: |
80 | exit(exit_status()); | |
93da3184 | 81 | } |