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

cpupower-set.c (2173B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  (C) 2011 Thomas Renninger <trenn@suse.de>, Novell Inc.
      4 */
      5
      6
      7#include <unistd.h>
      8#include <stdio.h>
      9#include <stdlib.h>
     10#include <errno.h>
     11#include <string.h>
     12#include <getopt.h>
     13#include <sys/utsname.h>
     14
     15#include "helpers/helpers.h"
     16#include "helpers/sysfs.h"
     17#include "helpers/bitmask.h"
     18
     19static struct option set_opts[] = {
     20	{"perf-bias", required_argument, NULL, 'b'},
     21	{ },
     22};
     23
     24static void print_wrong_arg_exit(void)
     25{
     26	printf(_("invalid or unknown argument\n"));
     27	exit(EXIT_FAILURE);
     28}
     29
     30int cmd_set(int argc, char **argv)
     31{
     32	extern char *optarg;
     33	extern int optind, opterr, optopt;
     34	unsigned int cpu;
     35	struct utsname uts;
     36
     37	union {
     38		struct {
     39			int perf_bias:1;
     40		};
     41		int params;
     42	} params;
     43	int perf_bias = 0;
     44	int ret = 0;
     45
     46	ret = uname(&uts);
     47	if (!ret && (!strcmp(uts.machine, "ppc64le") ||
     48		     !strcmp(uts.machine, "ppc64"))) {
     49		fprintf(stderr, _("Subcommand not supported on POWER.\n"));
     50		return ret;
     51	}
     52
     53	setlocale(LC_ALL, "");
     54	textdomain(PACKAGE);
     55
     56	params.params = 0;
     57	/* parameter parsing */
     58	while ((ret = getopt_long(argc, argv, "b:",
     59						set_opts, NULL)) != -1) {
     60		switch (ret) {
     61		case 'b':
     62			if (params.perf_bias)
     63				print_wrong_arg_exit();
     64			perf_bias = atoi(optarg);
     65			if (perf_bias < 0 || perf_bias > 15) {
     66				printf(_("--perf-bias param out "
     67					 "of range [0-%d]\n"), 15);
     68				print_wrong_arg_exit();
     69			}
     70			params.perf_bias = 1;
     71			break;
     72		default:
     73			print_wrong_arg_exit();
     74		}
     75	}
     76
     77	if (!params.params)
     78		print_wrong_arg_exit();
     79
     80	/* Default is: set all CPUs */
     81	if (bitmask_isallclear(cpus_chosen))
     82		bitmask_setall(cpus_chosen);
     83
     84	/* loop over CPUs */
     85	for (cpu = bitmask_first(cpus_chosen);
     86	     cpu <= bitmask_last(cpus_chosen); cpu++) {
     87
     88		if (!bitmask_isbitset(cpus_chosen, cpu))
     89			continue;
     90
     91		if (sysfs_is_cpu_online(cpu) != 1){
     92			fprintf(stderr, _("Cannot set values on CPU %d:"), cpu);
     93			fprintf(stderr, _(" *is offline\n"));
     94			continue;
     95		}
     96
     97		if (params.perf_bias) {
     98			ret = cpupower_intel_set_perf_bias(cpu, perf_bias);
     99			if (ret) {
    100				fprintf(stderr, _("Error setting perf-bias "
    101						  "value on CPU %d\n"), cpu);
    102				break;
    103			}
    104		}
    105	}
    106	return ret;
    107}