11badac4fSMathieu Desnoyers // SPDX-License-Identifier: LGPL-2.1 21badac4fSMathieu Desnoyers /* 31badac4fSMathieu Desnoyers * Basic test coverage for critical regions and rseq_current_cpu(). 41badac4fSMathieu Desnoyers */ 51badac4fSMathieu Desnoyers 61badac4fSMathieu Desnoyers #define _GNU_SOURCE 71badac4fSMathieu Desnoyers #include <assert.h> 81badac4fSMathieu Desnoyers #include <sched.h> 91badac4fSMathieu Desnoyers #include <signal.h> 101badac4fSMathieu Desnoyers #include <stdio.h> 111badac4fSMathieu Desnoyers #include <string.h> 121badac4fSMathieu Desnoyers #include <sys/time.h> 131badac4fSMathieu Desnoyers 141badac4fSMathieu Desnoyers #include "rseq.h" 151badac4fSMathieu Desnoyers 161badac4fSMathieu Desnoyers void test_cpu_pointer(void) 171badac4fSMathieu Desnoyers { 181badac4fSMathieu Desnoyers cpu_set_t affinity, test_affinity; 191badac4fSMathieu Desnoyers int i; 201badac4fSMathieu Desnoyers 211badac4fSMathieu Desnoyers sched_getaffinity(0, sizeof(affinity), &affinity); 221badac4fSMathieu Desnoyers CPU_ZERO(&test_affinity); 231badac4fSMathieu Desnoyers for (i = 0; i < CPU_SETSIZE; i++) { 241badac4fSMathieu Desnoyers if (CPU_ISSET(i, &affinity)) { 25*99babd04SMathieu Desnoyers int node; 26*99babd04SMathieu Desnoyers 271badac4fSMathieu Desnoyers CPU_SET(i, &test_affinity); 281badac4fSMathieu Desnoyers sched_setaffinity(0, sizeof(test_affinity), 291badac4fSMathieu Desnoyers &test_affinity); 301badac4fSMathieu Desnoyers assert(sched_getcpu() == i); 311badac4fSMathieu Desnoyers assert(rseq_current_cpu() == i); 321badac4fSMathieu Desnoyers assert(rseq_current_cpu_raw() == i); 331badac4fSMathieu Desnoyers assert(rseq_cpu_start() == i); 34*99babd04SMathieu Desnoyers node = rseq_fallback_current_node(); 35*99babd04SMathieu Desnoyers assert(rseq_current_node_id() == node); 361badac4fSMathieu Desnoyers CPU_CLR(i, &test_affinity); 371badac4fSMathieu Desnoyers } 381badac4fSMathieu Desnoyers } 391badac4fSMathieu Desnoyers sched_setaffinity(0, sizeof(affinity), &affinity); 401badac4fSMathieu Desnoyers } 411badac4fSMathieu Desnoyers 421badac4fSMathieu Desnoyers int main(int argc, char **argv) 431badac4fSMathieu Desnoyers { 441badac4fSMathieu Desnoyers if (rseq_register_current_thread()) { 451badac4fSMathieu Desnoyers fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n", 461badac4fSMathieu Desnoyers errno, strerror(errno)); 471badac4fSMathieu Desnoyers goto init_thread_error; 481badac4fSMathieu Desnoyers } 491badac4fSMathieu Desnoyers printf("testing current cpu\n"); 501badac4fSMathieu Desnoyers test_cpu_pointer(); 511badac4fSMathieu Desnoyers if (rseq_unregister_current_thread()) { 521badac4fSMathieu Desnoyers fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n", 531badac4fSMathieu Desnoyers errno, strerror(errno)); 541badac4fSMathieu Desnoyers goto init_thread_error; 551badac4fSMathieu Desnoyers } 561badac4fSMathieu Desnoyers return 0; 571badac4fSMathieu Desnoyers 581badac4fSMathieu Desnoyers init_thread_error: 591badac4fSMathieu Desnoyers return -1; 601badac4fSMathieu Desnoyers } 61