59 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * vdso_test_gettimeofday.c: Sample code to test parse_vdso.c and4 * vDSO gettimeofday()5 * Copyright (c) 2014 Andy Lutomirski6 *7 * Compile with:8 * gcc -std=gnu99 vdso_test_gettimeofday.c parse_vdso_gettimeofday.c9 *10 * Tested on x86, 32-bit and 64-bit. It may work on other architectures, too.11 */12 13#include <stdint.h>14#include <elf.h>15#include <stdio.h>16#include <sys/auxv.h>17#include <sys/time.h>18 19#include "../kselftest.h"20#include "parse_vdso.h"21#include "vdso_config.h"22#include "vdso_call.h"23 24int main(int argc, char **argv)25{26 const char *version = versions[VDSO_VERSION];27 const char **name = (const char **)&names[VDSO_NAMES];28 29 unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);30 if (!sysinfo_ehdr) {31 printf("AT_SYSINFO_EHDR is not present!\n");32 return KSFT_SKIP;33 }34 35 vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));36 37 /* Find gettimeofday. */38 typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);39 gtod_t gtod = (gtod_t)vdso_sym(version, name[0]);40 41 if (!gtod) {42 printf("Could not find %s\n", name[0]);43 return KSFT_SKIP;44 }45 46 struct timeval tv;47 long ret = VDSO_CALL(gtod, 2, &tv, 0);48 49 if (ret == 0) {50 printf("The time is %lld.%06lld\n",51 (long long)tv.tv_sec, (long long)tv.tv_usec);52 } else {53 printf("%s failed\n", name[0]);54 return KSFT_FAIL;55 }56 57 return 0;58}59