1 // SPDX-License-Identifier: MIT
2 // SPDX-FileCopyrightText: 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 * Basic test coverage for critical regions and rseq_current_cpu().
17 #include <rseq/rseq.h>
21 static void test_cpu_pointer(void)
23 cpu_set_t affinity
, test_affinity
;
26 ret
= sched_getaffinity(0, sizeof(affinity
), &affinity
);
27 ok(ret
== 0, "Get current thread affinity mask");
29 CPU_ZERO(&test_affinity
);
30 for (i
= 0; i
< CPU_SETSIZE
; i
++) {
31 if (CPU_ISSET(i
, &affinity
)) {
34 CPU_SET(i
, &test_affinity
);
36 ret
= sched_setaffinity(0, sizeof(test_affinity
),
38 ok(ret
== 0, "Set affinity mask to CPU %d exclusively", i
);
40 ok(sched_getcpu() == i
, "sched_getcpu returns CPU %d", i
);
41 ok(rseq_current_cpu() == (unsigned int) i
, "rseq_current_cpu returns CPU %d", i
);
42 ok(rseq_current_cpu_raw() == i
, "rseq_current_cpu_raw returns CPU %d", i
);
43 ok(rseq_cpu_start() == (unsigned int) i
, "rseq_cpu_start returns CPU %d", i
);
44 node
= rseq_fallback_current_node();
45 ok(rseq_fallback_current_node() == node
, "rseq_fallback_current_node returns node %d", node
);
46 CPU_CLR(i
, &test_affinity
);
50 ret
= sched_setaffinity(0, sizeof(affinity
), &affinity
);
51 ok(ret
== 0, "Restore current thread initial affinity mask");
57 * Skip all tests if the rseq syscall is unavailable
59 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL
)) {
62 plan_skip_all("The rseq syscall is unavailable");
65 if (rseq_register_current_thread()) {
66 fail("rseq_register_current_thread(...) failed(%d): %s\n",
67 errno
, strerror(errno
));
70 pass("Registered current thread with rseq");
75 if (rseq_unregister_current_thread()) {
76 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
77 errno
, strerror(errno
));
80 pass("Unregistered current thread with rseq");