Skip the tests if the rseq syscall is unavailable
[librseq.git] / tests / basic_test.c
1 // SPDX-License-Identifier: LGPL-2.1-only
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
18 #include "tap.h"
19
20 void test_cpu_pointer(void)
21 {
22 cpu_set_t affinity, test_affinity;
23 int ret, i;
24
25 ret = sched_getaffinity(0, sizeof(affinity), &affinity);
26 ok(ret == 0, "Get current thread affinity mask");
27
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);
32
33 ret = sched_setaffinity(0, sizeof(test_affinity),
34 &test_affinity);
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
42 CPU_CLR(i, &test_affinity);
43 }
44 }
45
46 ret = sched_setaffinity(0, sizeof(affinity), &affinity);
47 ok(ret == 0, "Restore current thread initial affinity mask");
48 }
49
50 int main(void)
51 {
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 }
60
61 if (rseq_register_current_thread()) {
62 fail("rseq_register_current_thread(...) failed(%d): %s\n",
63 errno, strerror(errno));
64 goto end;
65 } else {
66 pass("Registered current thread with rseq");
67 }
68
69 test_cpu_pointer();
70
71 if (rseq_unregister_current_thread()) {
72 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
73 errno, strerror(errno));
74 goto end;
75 } else {
76 pass("Unregistered current thread with rseq");
77 }
78
79 end:
80 exit(exit_status());
81 }
This page took 0.051644 seconds and 4 git commands to generate.