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			CPU_SET(i, &test_affinity);
26			sched_setaffinity(0, sizeof(test_affinity),
27					&test_affinity);
28			assert(sched_getcpu() == i);
29			assert(rseq_current_cpu() == i);
30			assert(rseq_current_cpu_raw() == i);
31			assert(rseq_cpu_start() == i);
32			CPU_CLR(i, &test_affinity);
33		}
34	}
35	sched_setaffinity(0, sizeof(affinity), &affinity);
36}
37
38int main(int argc, char **argv)
39{
40	if (rseq_register_current_thread()) {
41		fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
42			errno, strerror(errno));
43		goto init_thread_error;
44	}
45	printf("testing current cpu\n");
46	test_cpu_pointer();
47	if (rseq_unregister_current_thread()) {
48		fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
49			errno, strerror(errno));
50		goto init_thread_error;
51	}
52	return 0;
53
54init_thread_error:
55	return -1;
56}
57