162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * vdso_test_getcpu.c: Sample code to test parse_vdso.c and vDSO getcpu() 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2020 Arm Ltd 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <stdint.h> 962306a36Sopenharmony_ci#include <elf.h> 1062306a36Sopenharmony_ci#include <stdio.h> 1162306a36Sopenharmony_ci#include <sys/auxv.h> 1262306a36Sopenharmony_ci#include <sys/time.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "../kselftest.h" 1562306a36Sopenharmony_ci#include "parse_vdso.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#if defined(__riscv) 1862306a36Sopenharmony_ciconst char *version = "LINUX_4.15"; 1962306a36Sopenharmony_ci#else 2062306a36Sopenharmony_ciconst char *version = "LINUX_2.6"; 2162306a36Sopenharmony_ci#endif 2262306a36Sopenharmony_ciconst char *name = "__vdso_getcpu"; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct getcpu_cache; 2562306a36Sopenharmony_citypedef long (*getcpu_t)(unsigned int *, unsigned int *, 2662306a36Sopenharmony_ci struct getcpu_cache *); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciint main(int argc, char **argv) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci unsigned long sysinfo_ehdr; 3162306a36Sopenharmony_ci unsigned int cpu, node; 3262306a36Sopenharmony_ci getcpu_t get_cpu; 3362306a36Sopenharmony_ci long ret; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR); 3662306a36Sopenharmony_ci if (!sysinfo_ehdr) { 3762306a36Sopenharmony_ci printf("AT_SYSINFO_EHDR is not present!\n"); 3862306a36Sopenharmony_ci return KSFT_SKIP; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR)); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci get_cpu = (getcpu_t)vdso_sym(version, name); 4462306a36Sopenharmony_ci if (!get_cpu) { 4562306a36Sopenharmony_ci printf("Could not find %s\n", name); 4662306a36Sopenharmony_ci return KSFT_SKIP; 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci ret = get_cpu(&cpu, &node, 0); 5062306a36Sopenharmony_ci if (ret == 0) { 5162306a36Sopenharmony_ci printf("Running on CPU %u node %u\n", cpu, node); 5262306a36Sopenharmony_ci } else { 5362306a36Sopenharmony_ci printf("%s failed\n", name); 5462306a36Sopenharmony_ci return KSFT_FAIL; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return 0; 5862306a36Sopenharmony_ci} 59