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