cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vdso_test_clock_getres.c (2536B)


      1// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
      2/*
      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.c
      8 *
      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_SOURCE
     15#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 call
     56 * 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;
     88
     89#if _POSIX_TIMERS > 0
     90
     91#ifdef CLOCK_REALTIME
     92	ret = vdso_test_clock(CLOCK_REALTIME);
     93#endif
     94
     95#ifdef CLOCK_BOOTTIME
     96	ret += vdso_test_clock(CLOCK_BOOTTIME);
     97#endif
     98
     99#ifdef CLOCK_TAI
    100	ret += vdso_test_clock(CLOCK_TAI);
    101#endif
    102
    103#ifdef CLOCK_REALTIME_COARSE
    104	ret += vdso_test_clock(CLOCK_REALTIME_COARSE);
    105#endif
    106
    107#ifdef CLOCK_MONOTONIC
    108	ret += vdso_test_clock(CLOCK_MONOTONIC);
    109#endif
    110
    111#ifdef CLOCK_MONOTONIC_RAW
    112	ret += vdso_test_clock(CLOCK_MONOTONIC_RAW);
    113#endif
    114
    115#ifdef CLOCK_MONOTONIC_COARSE
    116	ret += vdso_test_clock(CLOCK_MONOTONIC_COARSE);
    117#endif
    118
    119#endif
    120	if (ret > 0)
    121		return KSFT_FAIL;
    122
    123	return KSFT_PASS;
    124}