Skip the tests if the rseq syscall is unavailable
[librseq.git] / tests / basic_test.c
CommitLineData
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
20void 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
50int 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
79end:
80 exit(exit_status());
93da3184 81}
This page took 0.030966 seconds and 4 git commands to generate.