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

msr.c (1852B)


      1// SPDX-License-Identifier: GPL-2.0
      2#if defined(__i386__) || defined(__x86_64__)
      3
      4#include <fcntl.h>
      5#include <stdio.h>
      6#include <unistd.h>
      7#include <stdint.h>
      8
      9#include "helpers/helpers.h"
     10
     11/* Intel specific MSRs */
     12#define MSR_IA32_PERF_STATUS		0x198
     13#define MSR_IA32_MISC_ENABLES		0x1a0
     14#define MSR_NEHALEM_TURBO_RATIO_LIMIT	0x1ad
     15
     16/*
     17 * read_msr
     18 *
     19 * Will return 0 on success and -1 on failure.
     20 * Possible errno values could be:
     21 * EFAULT -If the read/write did not fully complete
     22 * EIO    -If the CPU does not support MSRs
     23 * ENXIO  -If the CPU does not exist
     24 */
     25
     26int read_msr(int cpu, unsigned int idx, unsigned long long *val)
     27{
     28	int fd;
     29	char msr_file_name[64];
     30
     31	sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
     32	fd = open(msr_file_name, O_RDONLY);
     33	if (fd < 0)
     34		return -1;
     35	if (lseek(fd, idx, SEEK_CUR) == -1)
     36		goto err;
     37	if (read(fd, val, sizeof *val) != sizeof *val)
     38		goto err;
     39	close(fd);
     40	return 0;
     41 err:
     42	close(fd);
     43	return -1;
     44}
     45
     46/*
     47 * write_msr
     48 *
     49 * Will return 0 on success and -1 on failure.
     50 * Possible errno values could be:
     51 * EFAULT -If the read/write did not fully complete
     52 * EIO    -If the CPU does not support MSRs
     53 * ENXIO  -If the CPU does not exist
     54 */
     55int write_msr(int cpu, unsigned int idx, unsigned long long val)
     56{
     57	int fd;
     58	char msr_file_name[64];
     59
     60	sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
     61	fd = open(msr_file_name, O_WRONLY);
     62	if (fd < 0)
     63		return -1;
     64	if (lseek(fd, idx, SEEK_CUR) == -1)
     65		goto err;
     66	if (write(fd, &val, sizeof val) != sizeof val)
     67		goto err;
     68	close(fd);
     69	return 0;
     70 err:
     71	close(fd);
     72	return -1;
     73}
     74
     75unsigned long long msr_intel_get_turbo_ratio(unsigned int cpu)
     76{
     77	unsigned long long val;
     78	int ret;
     79
     80	if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_HAS_TURBO_RATIO))
     81		return -1;
     82
     83	ret = read_msr(cpu, MSR_NEHALEM_TURBO_RATIO_LIMIT, &val);
     84	if (ret)
     85		return ret;
     86	return val;
     87}
     88#endif