// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
/*
* vdso_clock_getres . c : Sample code to test clock_getres .
* Copyright ( c ) 2019 Arm Ltd .
*
* Compile with :
* gcc - std = gnu99 vdso_clock_getres . c
*
* Tested on ARM , ARM64 , MIPS32 , x86 ( 32 - bit and 64 - bit ) ,
* Power ( 32 - bit and 64 - bit ) , S390x ( 32 - bit and 64 - bit ) .
* Might work on other architectures .
*/
#define _GNU_SOURCE
#include <elf.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/auxv.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/syscall.h>
#include "../kselftest.h"
static long syscall_clock_getres(clockid_t _clkid, struct timespec *_ts)
{
long ret;
ret = syscall(SYS_clock_getres, _clkid, _ts);
return ret;
}
const char *vdso_clock_name[12 ] = {
"CLOCK_REALTIME" ,
"CLOCK_MONOTONIC" ,
"CLOCK_PROCESS_CPUTIME_ID" ,
"CLOCK_THREAD_CPUTIME_ID" ,
"CLOCK_MONOTONIC_RAW" ,
"CLOCK_REALTIME_COARSE" ,
"CLOCK_MONOTONIC_COARSE" ,
"CLOCK_BOOTTIME" ,
"CLOCK_REALTIME_ALARM" ,
"CLOCK_BOOTTIME_ALARM" ,
"CLOCK_SGI_CYCLE" ,
"CLOCK_TAI" ,
};
/*
* This function calls clock_getres in vdso and by system call
* with different values for clock_id .
*
* Example of output :
*
* clock_id : CLOCK_REALTIME [ PASS ]
* clock_id : CLOCK_BOOTTIME [ PASS ]
* clock_id : CLOCK_TAI [ PASS ]
* clock_id : CLOCK_REALTIME_COARSE [ PASS ]
* clock_id : CLOCK_MONOTONIC [ PASS ]
* clock_id : CLOCK_MONOTONIC_RAW [ PASS ]
* clock_id : CLOCK_MONOTONIC_COARSE [ PASS ]
*/
static inline int vdso_test_clock(unsigned int clock_id)
{
struct timespec x, y;
printf("clock_id: %s" , vdso_clock_name[clock_id]);
clock_getres(clock_id, &x);
syscall_clock_getres(clock_id, &y);
if ((x.tv_sec != y.tv_sec) || (x.tv_nsec != y.tv_nsec)) {
printf(" [FAIL]\n" );
return KSFT_FAIL;
}
printf(" [PASS]\n" );
return KSFT_PASS;
}
int main(int argc, char **argv)
{
int ret = 0 ;
#if _POSIX_TIMERS > 0
#ifdef CLOCK_REALTIME
ret += vdso_test_clock(CLOCK_REALTIME);
#endif
#ifdef CLOCK_BOOTTIME
ret += vdso_test_clock(CLOCK_BOOTTIME);
#endif
#ifdef CLOCK_TAI
ret += vdso_test_clock(CLOCK_TAI);
#endif
#ifdef CLOCK_REALTIME_COARSE
ret += vdso_test_clock(CLOCK_REALTIME_COARSE);
#endif
#ifdef CLOCK_MONOTONIC
ret += vdso_test_clock(CLOCK_MONOTONIC);
#endif
#ifdef CLOCK_MONOTONIC_RAW
ret += vdso_test_clock(CLOCK_MONOTONIC_RAW);
#endif
#ifdef CLOCK_MONOTONIC_COARSE
ret += vdso_test_clock(CLOCK_MONOTONIC_COARSE);
#endif
#endif
if (ret > 0 )
return KSFT_FAIL;
return KSFT_PASS;
}
Messung V0.5 in Prozent C=77 H=98 G=88
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-10-12)
¤
*© Formatika GbR, Deutschland