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

sched-pelt.c (2000B)


      1/*
      2 * The following program is used to generate the constants for
      3 * computing sched averages.
      4 *
      5 * ==============================================================
      6 *		C program (compile with -lm)
      7 * ==============================================================
      8 */
      9
     10#include <math.h>
     11#include <stdio.h>
     12
     13#define HALFLIFE 32
     14#define SHIFT 32
     15
     16double y;
     17
     18void calc_runnable_avg_yN_inv(void)
     19{
     20	int i;
     21	unsigned int x;
     22
     23	/* To silence -Wunused-but-set-variable warnings. */
     24	printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {");
     25	for (i = 0; i < HALFLIFE; i++) {
     26		x = ((1UL<<32)-1)*pow(y, i);
     27
     28		if (i % 6 == 0) printf("\n\t");
     29		printf("0x%8x, ", x);
     30	}
     31	printf("\n};\n\n");
     32}
     33
     34int sum = 1024;
     35
     36void calc_runnable_avg_yN_sum(void)
     37{
     38	int i;
     39
     40	printf("static const u32 runnable_avg_yN_sum[] = {\n\t    0,");
     41	for (i = 1; i <= HALFLIFE; i++) {
     42		if (i == 1)
     43			sum *= y;
     44		else
     45			sum = sum*y + 1024*y;
     46
     47		if (i % 11 == 0)
     48			printf("\n\t");
     49
     50		printf("%5d,", sum);
     51	}
     52	printf("\n};\n\n");
     53}
     54
     55int n = -1;
     56/* first period */
     57long max = 1024;
     58
     59void calc_converged_max(void)
     60{
     61	long last = 0, y_inv = ((1UL<<32)-1)*y;
     62
     63	for (; ; n++) {
     64		if (n > -1)
     65			max = ((max*y_inv)>>SHIFT) + 1024;
     66			/*
     67			 * This is the same as:
     68			 * max = max*y + 1024;
     69			 */
     70
     71		if (last == max)
     72			break;
     73
     74		last = max;
     75	}
     76	n--;
     77	printf("#define LOAD_AVG_PERIOD %d\n", HALFLIFE);
     78	printf("#define LOAD_AVG_MAX %ld\n", max);
     79//	printf("#define LOAD_AVG_MAX_N %d\n\n", n);
     80}
     81
     82void calc_accumulated_sum_32(void)
     83{
     84	int i, x = sum;
     85
     86	printf("static const u32 __accumulated_sum_N32[] = {\n\t     0,");
     87	for (i = 1; i <= n/HALFLIFE+1; i++) {
     88		if (i > 1)
     89			x = x/2 + sum;
     90
     91		if (i % 6 == 0)
     92			printf("\n\t");
     93
     94		printf("%6d,", x);
     95	}
     96	printf("\n};\n\n");
     97}
     98
     99void main(void)
    100{
    101	printf("/* Generated by Documentation/scheduler/sched-pelt; do not modify. */\n\n");
    102
    103	y = pow(0.5, 1/(double)HALFLIFE);
    104
    105	calc_runnable_avg_yN_inv();
    106//	calc_runnable_avg_yN_sum();
    107	calc_converged_max();
    108//	calc_accumulated_sum_32();
    109}