18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * vdso_test_getcpu.c: Sample code to test parse_vdso.c and vDSO getcpu() 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2020 Arm Ltd 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <stdint.h> 98c2ecf20Sopenharmony_ci#include <elf.h> 108c2ecf20Sopenharmony_ci#include <stdio.h> 118c2ecf20Sopenharmony_ci#include <sys/auxv.h> 128c2ecf20Sopenharmony_ci#include <sys/time.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "../kselftest.h" 158c2ecf20Sopenharmony_ci#include "parse_vdso.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciconst char *version = "LINUX_2.6"; 188c2ecf20Sopenharmony_ciconst char *name = "__vdso_getcpu"; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct getcpu_cache; 218c2ecf20Sopenharmony_citypedef long (*getcpu_t)(unsigned int *, unsigned int *, 228c2ecf20Sopenharmony_ci struct getcpu_cache *); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciint main(int argc, char **argv) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci unsigned long sysinfo_ehdr; 278c2ecf20Sopenharmony_ci unsigned int cpu, node; 288c2ecf20Sopenharmony_ci getcpu_t get_cpu; 298c2ecf20Sopenharmony_ci long ret; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR); 328c2ecf20Sopenharmony_ci if (!sysinfo_ehdr) { 338c2ecf20Sopenharmony_ci printf("AT_SYSINFO_EHDR is not present!\n"); 348c2ecf20Sopenharmony_ci return KSFT_SKIP; 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR)); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci get_cpu = (getcpu_t)vdso_sym(version, name); 408c2ecf20Sopenharmony_ci if (!get_cpu) { 418c2ecf20Sopenharmony_ci printf("Could not find %s\n", name); 428c2ecf20Sopenharmony_ci return KSFT_SKIP; 438c2ecf20Sopenharmony_ci } 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci ret = get_cpu(&cpu, &node, 0); 468c2ecf20Sopenharmony_ci if (ret == 0) { 478c2ecf20Sopenharmony_ci printf("Running on CPU %u node %u\n", cpu, node); 488c2ecf20Sopenharmony_ci } else { 498c2ecf20Sopenharmony_ci printf("%s failed\n", name); 508c2ecf20Sopenharmony_ci return KSFT_FAIL; 518c2ecf20Sopenharmony_ci } 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci return 0; 548c2ecf20Sopenharmony_ci} 55