// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2020 Linaro Limited. All rights reserved. * Author: Viresh Kumar */ #define TST_NO_DEFAULT_MAIN #include "tst_test.h" #include "parse_vdso.h" #include "config.h" #ifdef HAVE_GETAUXVAL # include #endif /* HAVE_GETAUXVAL */ static unsigned long sysinfo_ehdr; static void vdso_init(void) { #ifdef HAVE_GETAUXVAL if (sysinfo_ehdr) return; sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR); if (!sysinfo_ehdr) { tst_res(TINFO, "Couldn't find AT_SYSINFO_EHDR"); return; } vdso_init_from_sysinfo_ehdr(sysinfo_ehdr); #else tst_res(TINFO, "getauxval() not supported"); #endif /* HAVE_GETAUXVAL */ } void find_clock_gettime_vdso(gettime_t *ptr_vdso_gettime, gettime_t *ptr_vdso_gettime64) { /* * Some vDSO exports its clock_gettime() implementation with a different * name and version from other architectures, so we need to handle it as * a special case. */ #if defined(__powerpc__) || defined(__powerpc64__) const char *version = "LINUX_2.6.15"; const char *name = "__kernel_clock_gettime"; #elif defined(__aarch64__) const char *version = "LINUX_2.6.39"; const char *name = "__kernel_clock_gettime"; #elif defined(__s390__) const char *version = "LINUX_2.6.29"; const char *name = "__kernel_clock_gettime"; #elif defined(__nds32__) const char *version = "LINUX_4"; const char *name = "__vdso_clock_gettime"; #elif defined(__riscv) const char *version = "LINUX_4.15"; const char *name = "__vdso_clock_gettime"; #else const char *version = "LINUX_2.6"; const char *name = "__vdso_clock_gettime"; #endif const char *version64 = "LINUX_2.6"; const char *name64 = "__vdso_clock_gettime64"; vdso_init(); *ptr_vdso_gettime = vdso_sym(version, name); if (!*ptr_vdso_gettime) tst_res(TINFO, "Couldn't find vdso_gettime()"); *ptr_vdso_gettime64 = vdso_sym(version64, name64); if (!*ptr_vdso_gettime64) tst_res(TINFO, "Couldn't find vdso_gettime64()"); }