18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Basic test coverage for critical regions and rseq_current_cpu().
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#define _GNU_SOURCE
78c2ecf20Sopenharmony_ci#include <assert.h>
88c2ecf20Sopenharmony_ci#include <sched.h>
98c2ecf20Sopenharmony_ci#include <signal.h>
108c2ecf20Sopenharmony_ci#include <stdio.h>
118c2ecf20Sopenharmony_ci#include <string.h>
128c2ecf20Sopenharmony_ci#include <sys/time.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include "rseq.h"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_civoid test_cpu_pointer(void)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	cpu_set_t affinity, test_affinity;
198c2ecf20Sopenharmony_ci	int i;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	sched_getaffinity(0, sizeof(affinity), &affinity);
228c2ecf20Sopenharmony_ci	CPU_ZERO(&test_affinity);
238c2ecf20Sopenharmony_ci	for (i = 0; i < CPU_SETSIZE; i++) {
248c2ecf20Sopenharmony_ci		if (CPU_ISSET(i, &affinity)) {
258c2ecf20Sopenharmony_ci			CPU_SET(i, &test_affinity);
268c2ecf20Sopenharmony_ci			sched_setaffinity(0, sizeof(test_affinity),
278c2ecf20Sopenharmony_ci					&test_affinity);
288c2ecf20Sopenharmony_ci			assert(sched_getcpu() == i);
298c2ecf20Sopenharmony_ci			assert(rseq_current_cpu() == i);
308c2ecf20Sopenharmony_ci			assert(rseq_current_cpu_raw() == i);
318c2ecf20Sopenharmony_ci			assert(rseq_cpu_start() == i);
328c2ecf20Sopenharmony_ci			CPU_CLR(i, &test_affinity);
338c2ecf20Sopenharmony_ci		}
348c2ecf20Sopenharmony_ci	}
358c2ecf20Sopenharmony_ci	sched_setaffinity(0, sizeof(affinity), &affinity);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciint main(int argc, char **argv)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	if (rseq_register_current_thread()) {
418c2ecf20Sopenharmony_ci		fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
428c2ecf20Sopenharmony_ci			errno, strerror(errno));
438c2ecf20Sopenharmony_ci		goto init_thread_error;
448c2ecf20Sopenharmony_ci	}
458c2ecf20Sopenharmony_ci	printf("testing current cpu\n");
468c2ecf20Sopenharmony_ci	test_cpu_pointer();
478c2ecf20Sopenharmony_ci	if (rseq_unregister_current_thread()) {
488c2ecf20Sopenharmony_ci		fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
498c2ecf20Sopenharmony_ci			errno, strerror(errno));
508c2ecf20Sopenharmony_ci		goto init_thread_error;
518c2ecf20Sopenharmony_ci	}
528c2ecf20Sopenharmony_ci	return 0;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ciinit_thread_error:
558c2ecf20Sopenharmony_ci	return -1;
568c2ecf20Sopenharmony_ci}
57