78 lines
2.0 KiB
C
78 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (c) 2020 Linaro Limited. All rights reserved.
|
|
* Author: Viresh Kumar<viresh.kumar@linaro.org>
|
|
*/
|
|
|
|
#define TST_NO_DEFAULT_MAIN
|
|
#include "tst_test.h"
|
|
|
|
#include "parse_vdso.h"
|
|
#include "config.h"
|
|
|
|
#ifdef HAVE_GETAUXVAL
|
|
# include <sys/auxv.h>
|
|
#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()");
|
|
}
|