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

skew_consistency.c (1851B)


      1/* ADJ_FREQ Skew consistency test
      2 *		by: john stultz (johnstul@us.ibm.com)
      3 *		(C) Copyright IBM 2012
      4 *		Licensed under the GPLv2
      5 *
      6 *  NOTE: This is a meta-test which cranks the ADJ_FREQ knob back
      7 *  and forth and watches for consistency problems. Thus this test requires
      8 *  that the inconsistency-check tests be present in the same directory it
      9 *  is run from.
     10 *
     11 *  To build:
     12 *	$ gcc skew_consistency.c -o skew_consistency -lrt
     13 *
     14 *   This program is free software: you can redistribute it and/or modify
     15 *   it under the terms of the GNU General Public License as published by
     16 *   the Free Software Foundation, either version 2 of the License, or
     17 *   (at your option) any later version.
     18 *
     19 *   This program is distributed in the hope that it will be useful,
     20 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     21 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22 *   GNU General Public License for more details.
     23 */
     24
     25
     26#include <stdio.h>
     27#include <stdlib.h>
     28#include <unistd.h>
     29#include <sys/time.h>
     30#include <sys/timex.h>
     31#include <time.h>
     32#include <sys/types.h>
     33#include <sys/stat.h>
     34#include <fcntl.h>
     35#include <string.h>
     36#include <sys/wait.h>
     37#include "../kselftest.h"
     38
     39#define NSEC_PER_SEC 1000000000LL
     40
     41int main(int argv, char **argc)
     42{
     43	struct timex tx;
     44	int ret, ppm;
     45	pid_t pid;
     46
     47
     48	printf("Running Asynchronous Frequency Changing Tests...\n");
     49
     50	pid = fork();
     51	if (!pid)
     52		return system("./inconsistency-check -c 1 -t 600");
     53
     54	ppm = 500;
     55	ret = 0;
     56
     57	while (pid != waitpid(pid, &ret, WNOHANG)) {
     58		ppm = -ppm;
     59		tx.modes = ADJ_FREQUENCY;
     60		tx.freq = ppm << 16;
     61		adjtimex(&tx);
     62		usleep(500000);
     63	}
     64
     65	/* Set things back */
     66	tx.modes = ADJ_FREQUENCY;
     67	tx.offset = 0;
     68	adjtimex(&tx);
     69
     70
     71	if (ret) {
     72		printf("[FAILED]\n");
     73		return ksft_exit_fail();
     74	}
     75	printf("[OK]\n");
     76	return ksft_exit_pass();
     77}