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-monitor.h (2405B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *  (C) 2010,2011       Thomas Renninger <trenn@suse.de>, Novell Inc.
      4 */
      5
      6#ifndef __CPUIDLE_INFO_HW__
      7#define __CPUIDLE_INFO_HW__
      8
      9#include <stdarg.h>
     10#include <time.h>
     11
     12#include "idle_monitor/idle_monitors.h"
     13
     14#define MONITORS_MAX 20
     15#define MONITOR_NAME_LEN 20
     16
     17/* CSTATE_NAME_LEN is limited by header field width defined
     18 * in cpupower-monitor.c. Header field width is defined to be
     19 * sum of percent width and two spaces for padding.
     20 */
     21#ifdef __powerpc__
     22#define CSTATE_NAME_LEN 7
     23#else
     24#define CSTATE_NAME_LEN 5
     25#endif
     26#define CSTATE_DESC_LEN 60
     27
     28extern int cpu_count;
     29
     30/* Hard to define the right names ...: */
     31enum power_range_e {
     32	RANGE_THREAD,	/* Lowest in topology hierarcy, AMD: core, Intel: thread
     33			   kernel sysfs: cpu */
     34	RANGE_CORE,	/* AMD: unit, Intel: core, kernel_sysfs: core_id */
     35	RANGE_PACKAGE,	/* Package, processor socket */
     36	RANGE_MACHINE,	/* Machine, platform wide */
     37	RANGE_MAX };
     38
     39typedef struct cstate {
     40	int  id;
     41	enum power_range_e range;
     42	char name[CSTATE_NAME_LEN];
     43	char desc[CSTATE_DESC_LEN];
     44
     45	/* either provide a percentage or a general count */
     46	int (*get_count_percent)(unsigned int self_id, double *percent,
     47				 unsigned int cpu);
     48	int (*get_count)(unsigned int self_id, unsigned long long *count,
     49			 unsigned int cpu);
     50} cstate_t;
     51
     52struct cpuidle_monitor {
     53	/* Name must not contain whitespaces */
     54	char name[MONITOR_NAME_LEN];
     55	int name_len;
     56	int hw_states_num;
     57	cstate_t *hw_states;
     58	int (*start) (void);
     59	int (*stop) (void);
     60	struct cpuidle_monitor* (*do_register) (void);
     61	void (*unregister)(void);
     62	unsigned int overflow_s;
     63	struct {
     64		unsigned int needs_root:1;
     65		unsigned int per_cpu_schedule:1;
     66	} flags;
     67};
     68
     69extern long long timespec_diff_us(struct timespec start, struct timespec end);
     70
     71#define print_overflow_err(mes, ov)						\
     72{										\
     73	fprintf(stderr, gettext("Measure took %u seconds, but registers could "	\
     74				"overflow at %u seconds, results "		\
     75				"could be inaccurate\n"), mes, ov);		\
     76}
     77
     78
     79/* Taken over from x86info project sources  -> return 0 on success */
     80#include <sched.h>
     81#include <sys/types.h>
     82#include <unistd.h>
     83static inline int bind_cpu(int cpu)
     84{
     85	cpu_set_t set;
     86
     87	if (sched_getaffinity(getpid(), sizeof(set), &set) == 0) {
     88		CPU_ZERO(&set);
     89		CPU_SET(cpu, &set);
     90		return sched_setaffinity(getpid(), sizeof(set), &set);
     91	}
     92	return 1;
     93}
     94
     95#endif /* __CPUIDLE_INFO_HW__ */