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
)) {
32 CPU_SET(i
, &test_affinity
);
34 ret
= sched_setaffinity(0, sizeof(test_affinity
),
36 ok(ret
== 0, "Set affinity mask to CPU %d exclusively", i
);
38 ok(sched_getcpu() == i
, "sched_getcpu returns CPU %d", i
);
39 ok(rseq_current_cpu() == (unsigned int) i
, "rseq_current_cpu returns CPU %d", i
);
40 ok(rseq_current_cpu_raw() == i
, "rseq_current_cpu_raw returns CPU %d", i
);
41 ok(rseq_cpu_start() == (unsigned int) i
, "rseq_cpu_start returns CPU %d", i
);
43 CPU_CLR(i
, &test_affinity
);
47 ret
= sched_setaffinity(0, sizeof(affinity
), &affinity
);
48 ok(ret
== 0, "Restore current thread initial affinity mask");
54 * Skip all tests if the rseq syscall is unavailable
56 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL
)) {
59 plan_skip_all("The rseq syscall is unavailable");
62 if (rseq_register_current_thread()) {
63 fail("rseq_register_current_thread(...) failed(%d): %s\n",
64 errno
, strerror(errno
));
67 pass("Registered current thread with rseq");
72 if (rseq_unregister_current_thread()) {
73 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
74 errno
, strerror(errno
));
77 pass("Unregistered current thread with rseq");