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

syscall.c (1761B)


      1/*
      2 *
      3 * syscall.c
      4 *
      5 * syscall: Benchmark for system call performance
      6 */
      7#include "../perf.h"
      8#include "../util/util.h"
      9#include <subcmd/parse-options.h>
     10#include "../builtin.h"
     11#include "bench.h"
     12
     13#include <stdio.h>
     14#include <sys/time.h>
     15#include <sys/syscall.h>
     16#include <sys/types.h>
     17#include <unistd.h>
     18#include <stdlib.h>
     19
     20#define LOOPS_DEFAULT 10000000
     21static	int loops = LOOPS_DEFAULT;
     22
     23static const struct option options[] = {
     24	OPT_INTEGER('l', "loop",	&loops,		"Specify number of loops"),
     25	OPT_END()
     26};
     27
     28static const char * const bench_syscall_usage[] = {
     29	"perf bench syscall <options>",
     30	NULL
     31};
     32
     33int bench_syscall_basic(int argc, const char **argv)
     34{
     35	struct timeval start, stop, diff;
     36	unsigned long long result_usec = 0;
     37	int i;
     38
     39	argc = parse_options(argc, argv, options, bench_syscall_usage, 0);
     40
     41	gettimeofday(&start, NULL);
     42
     43	for (i = 0; i < loops; i++)
     44		getppid();
     45
     46	gettimeofday(&stop, NULL);
     47	timersub(&stop, &start, &diff);
     48
     49	switch (bench_format) {
     50	case BENCH_FORMAT_DEFAULT:
     51		printf("# Executed %'d getppid() calls\n", loops);
     52
     53		result_usec = diff.tv_sec * 1000000;
     54		result_usec += diff.tv_usec;
     55
     56		printf(" %14s: %lu.%03lu [sec]\n\n", "Total time",
     57		       (unsigned long) diff.tv_sec,
     58		       (unsigned long) (diff.tv_usec/1000));
     59
     60		printf(" %14lf usecs/op\n",
     61		       (double)result_usec / (double)loops);
     62		printf(" %'14d ops/sec\n",
     63		       (int)((double)loops /
     64			     ((double)result_usec / (double)1000000)));
     65		break;
     66
     67	case BENCH_FORMAT_SIMPLE:
     68		printf("%lu.%03lu\n",
     69		       (unsigned long) diff.tv_sec,
     70		       (unsigned long) (diff.tv_usec / 1000));
     71		break;
     72
     73	default:
     74		/* reaching here is something disaster */
     75		fprintf(stderr, "Unknown format:%d\n", bench_format);
     76		exit(1);
     77		break;
     78	}
     79
     80	return 0;
     81}