1// SPDX-License-Identifier: LGPL-2.1
2/*
3 * Basic test coverage for critical regions and rseq_current_cpu().
4 */
5
6#define _GNU_SOURCE
7#include <assert.h>
8#include <sched.h>
9#include <signal.h>
10#include <stdio.h>
11#include <string.h>
12#include <sys/time.h>
13
14#include "rseq.h"
15
16void test_cpu_pointer(void)
17{
18	cpu_set_t affinity, test_affinity;
19	int i;
20
21	sched_getaffinity(0, sizeof(affinity), &affinity);
22	CPU_ZERO(&test_affinity);
23	for (i = 0; i < CPU_SETSIZE; i++) {
24		if (CPU_ISSET(i, &affinity)) {
25			int node;
26
27			CPU_SET(i, &test_affinity);
28			sched_setaffinity(0, sizeof(test_affinity),
29					&test_affinity);
30			assert(sched_getcpu() == i);
31			assert(rseq_current_cpu() == i);
32			assert(rseq_current_cpu_raw() == i);
33			assert(rseq_cpu_start() == i);
34			node = rseq_fallback_current_node();
35			assert(rseq_current_node_id() == node);
36			CPU_CLR(i, &test_affinity);
37		}
38	}
39	sched_setaffinity(0, sizeof(affinity), &affinity);
40}
41
42int main(int argc, char **argv)
43{
44	if (rseq_register_current_thread()) {
45		fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
46			errno, strerror(errno));
47		goto init_thread_error;
48	}
49	printf("testing current cpu\n");
50	test_cpu_pointer();
51	if (rseq_unregister_current_thread()) {
52		fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
53			errno, strerror(errno));
54		goto init_thread_error;
55	}
56	return 0;
57
58init_thread_error:
59	return -1;
60}
61