125 lines · c
1// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note2/*3 * vdso_clock_getres.c: Sample code to test clock_getres.4 * Copyright (c) 2019 Arm Ltd.5 *6 * Compile with:7 * gcc -std=gnu99 vdso_clock_getres.c8 *9 * Tested on ARM, ARM64, MIPS32, x86 (32-bit and 64-bit),10 * Power (32-bit and 64-bit), S390x (32-bit and 64-bit).11 * Might work on other architectures.12 */13 14#define _GNU_SOURCE15#include <elf.h>16#include <err.h>17#include <fcntl.h>18#include <stdint.h>19#include <stdio.h>20#include <stdlib.h>21#include <time.h>22#include <sys/auxv.h>23#include <sys/mman.h>24#include <sys/time.h>25#include <unistd.h>26#include <sys/syscall.h>27 28#include "../kselftest.h"29 30static long syscall_clock_getres(clockid_t _clkid, struct timespec *_ts)31{32 long ret;33 34 ret = syscall(SYS_clock_getres, _clkid, _ts);35 36 return ret;37}38 39const char *vdso_clock_name[12] = {40 "CLOCK_REALTIME",41 "CLOCK_MONOTONIC",42 "CLOCK_PROCESS_CPUTIME_ID",43 "CLOCK_THREAD_CPUTIME_ID",44 "CLOCK_MONOTONIC_RAW",45 "CLOCK_REALTIME_COARSE",46 "CLOCK_MONOTONIC_COARSE",47 "CLOCK_BOOTTIME",48 "CLOCK_REALTIME_ALARM",49 "CLOCK_BOOTTIME_ALARM",50 "CLOCK_SGI_CYCLE",51 "CLOCK_TAI",52};53 54/*55 * This function calls clock_getres in vdso and by system call56 * with different values for clock_id.57 *58 * Example of output:59 *60 * clock_id: CLOCK_REALTIME [PASS]61 * clock_id: CLOCK_BOOTTIME [PASS]62 * clock_id: CLOCK_TAI [PASS]63 * clock_id: CLOCK_REALTIME_COARSE [PASS]64 * clock_id: CLOCK_MONOTONIC [PASS]65 * clock_id: CLOCK_MONOTONIC_RAW [PASS]66 * clock_id: CLOCK_MONOTONIC_COARSE [PASS]67 */68static inline int vdso_test_clock(unsigned int clock_id)69{70 struct timespec x, y;71 72 printf("clock_id: %s", vdso_clock_name[clock_id]);73 clock_getres(clock_id, &x);74 syscall_clock_getres(clock_id, &y);75 76 if ((x.tv_sec != y.tv_sec) || (x.tv_nsec != y.tv_nsec)) {77 printf(" [FAIL]\n");78 return KSFT_FAIL;79 }80 81 printf(" [PASS]\n");82 return KSFT_PASS;83}84 85int main(int argc, char **argv)86{87 int ret = 0;88 89#if _POSIX_TIMERS > 090 91#ifdef CLOCK_REALTIME92 ret += vdso_test_clock(CLOCK_REALTIME);93#endif94 95#ifdef CLOCK_BOOTTIME96 ret += vdso_test_clock(CLOCK_BOOTTIME);97#endif98 99#ifdef CLOCK_TAI100 ret += vdso_test_clock(CLOCK_TAI);101#endif102 103#ifdef CLOCK_REALTIME_COARSE104 ret += vdso_test_clock(CLOCK_REALTIME_COARSE);105#endif106 107#ifdef CLOCK_MONOTONIC108 ret += vdso_test_clock(CLOCK_MONOTONIC);109#endif110 111#ifdef CLOCK_MONOTONIC_RAW112 ret += vdso_test_clock(CLOCK_MONOTONIC_RAW);113#endif114 115#ifdef CLOCK_MONOTONIC_COARSE116 ret += vdso_test_clock(CLOCK_MONOTONIC_COARSE);117#endif118 119#endif120 if (ret > 0)121 return KSFT_FAIL;122 123 return KSFT_PASS;124}125