Split out read_msr and create write_msr into a separate .c file These should get library functions and should have a separate file. They are now in msr.c dumpmsr and dumpmsr_bin are moved into the newly created to dumpmsr.c and rdmsr.c (where they lived before) is deleted. Also remove read_msr definition from x86info.h and move it into the new x86_info.h file. This will get the published /usr/include/x86_info.h file to be used by shared library users. Implement write_msr in msr.c From: Thomas Renninger Index: x86info-1.24/dumpmsr.c =================================================================== --- /dev/null +++ x86info-1.24/dumpmsr.c @@ -0,0 +1,36 @@ +#include + +#include "x86info.h" +#include "x86_info.h" + +void dumpmsr(int cpu, unsigned int msr, int size) +{ + unsigned long long val=0; + + if (read_msr(cpu, msr, &val) == 1) { + if (size==32){ + printf("MSR: 0x%08x=0x%08lx : ", msr, (unsigned long) val); + binary32(val); + } + if (size==64) { + printf("MSR: 0x%08x=0x%016llx : ", msr, val); + binary64(val); + } + return; + } + printf("Couldn't read MSR 0x%x\n", msr); +} + +void dumpmsr_bin(int cpu, unsigned int msr, int size) +{ + unsigned long long val=0; + + if (read_msr(cpu, msr, &val) == 1) { + if (size==32) + binary32(val); + if (size==64) + binary64(val); + return; + } + printf("Couldn't read MSR 0x%x\n", msr); +} Index: x86info-1.24/msr.c =================================================================== --- /dev/null +++ x86info-1.24/msr.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include + +#if defined(__FreeBSD__) +# include +# include +#endif + +#include "x86_info.h" + +#if defined(__FreeBSD__) +int read_msr(int cpu, unsigned int idx, unsigned long long *val) +{ + char cpuname[16]; + unsigned char buffer[8]; + unsigned long lo, hi; + int fh; + static int nodriver=0; + cpu_msr_args_t args; + + if (nodriver==1) + return 0; + + (void)snprintf(cpuname, sizeof(cpuname), "/dev/cpu%d", cpu); + + fh = open(cpuname, O_RDONLY); + if (fh==-1) { + if (!silent) + perror(cpuname); + nodriver=1; + return 0; + } + + args.msr = idx; + if (ioctl(fh, CPU_RDMSR, &args) != 0) { + if (close(fh) == -1) { + perror("close"); + exit(EXIT_FAILURE); + } + + return 0; + } + + *val = args.data; + + if (close(fh)==-1) { + perror("close"); + exit(EXIT_FAILURE); + } + return 1; +} + +#else /* !__FreeBSD__ */ + +/* + * read_msr + * + * Will return 0 on success and -1 on failure. + * Possible errno values could be: + * EFAULT -> If the read/write did not fully complete + * EIO -> If the CPU does not support MSRs + * ENXIO -> If the CPU does not exist + */ + +int read_msr(int cpu, unsigned int idx, unsigned long long *val) +{ + int fd; + char msr_file_name[64]; + + sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu); + fd = open(msr_file_name, O_RDONLY); + if (fd < 0) + return -1; + if (lseek(fd, idx, SEEK_CUR) == -1) + goto err; + if (read(fd, val, sizeof val) != sizeof *val) + goto err; + close(fd); + return 0; + err: + close(fd); + return -1; +} + +int write_msr(int cpu, unsigned int idx, unsigned long long val) +{ + int fd; + char msr_file_name[64]; + sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu); + fd = open(msr_file_name, O_WRONLY); + if (fd < 0) + return -1; + if (lseek(fd, idx, SEEK_CUR) == -1) + goto err; + if (write(fd, &val, sizeof val) != sizeof val) + goto err; + close(fd); + return 0; + err: + close(fd); + return -1; +} +#endif /* __FreeBSD__ */ Index: x86info-1.24/x86_info.h =================================================================== --- /dev/null +++ x86info-1.24/x86_info.h @@ -0,0 +1,8 @@ +#ifndef _X86_INFO_H +#define _X86_INFO_H 1 + + +extern int read_msr(int cpu, unsigned int idx, unsigned long long *val); +extern int write_msr(int cpu, unsigned int idx, unsigned long long val); + +#endif Index: x86info-1.24/rdmsr.c =================================================================== --- x86info-1.24.orig/rdmsr.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * (C) 2001 Dave Jones. - * - * Licensed under the terms of the GNU GPL License version 2. - * - * Contributions by Arjan van de Ven & Philipp Rumpf. - * - * Routines for reading MSRs. - */ - -#include -#include -#include -#include -#include -#include -#include "x86info.h" - -#if defined(__FreeBSD__) -# include -# include -#endif - -#if defined(__FreeBSD__) - -int read_msr(int cpu, unsigned int idx, unsigned long long *val) -{ - char cpuname[16]; - unsigned char buffer[8]; - unsigned long lo, hi; - int fh; - static int nodriver=0; - cpu_msr_args_t args; - - if (nodriver==1) - return 0; - - (void)snprintf(cpuname, sizeof(cpuname), "/dev/cpu%d", cpu); - - fh = open(cpuname, O_RDONLY); - if (fh==-1) { - if (!silent) - perror(cpuname); - nodriver=1; - return 0; - } - - args.msr = idx; - if (ioctl(fh, CPU_RDMSR, &args) != 0) { - if (close(fh) == -1) { - perror("close"); - exit(EXIT_FAILURE); - } - - return 0; - } - - *val = args.data; - - if (close(fh)==-1) { - perror("close"); - exit(EXIT_FAILURE); - } - return 1; -} - -#else /* !__FreeBSD__ */ - -int read_msr(int cpu, unsigned int idx, unsigned long long *val) -{ - char cpuname[16]; - unsigned char buffer[8]; - unsigned long lo, hi; - int fh; - static int nodriver=0; - - if (nodriver==1) - return 0; - - (void)snprintf(cpuname, sizeof(cpuname), "/dev/cpu/%d/msr", cpu); - - fh = open(cpuname, O_RDONLY); - if (fh==-1) { - if (!silent) - perror(cpuname); - nodriver=1; - return 0; - } - - if (lseek(fh, idx, SEEK_CUR)==-1) { - perror("lseek"); - exit(EXIT_FAILURE); - } - - if (fh != -1) { - if (read(fh, &buffer[0], 8) != 8) { - if (close(fh) == -1) { - perror("close"); - exit(EXIT_FAILURE); - } - return 0; - } - - lo = (*(unsigned long *)buffer); - hi = (*(unsigned long *)(buffer+4)); - *val = hi; - *val = (*val<<32) | lo; - } - if (close(fh)==-1) { - perror("close"); - exit(EXIT_FAILURE); - } - return 1; -} - -#endif /* __FreeBSD__ */ - - -void dumpmsr(int cpu, unsigned int msr, int size) -{ - unsigned long long val=0; - - if (read_msr(cpu, msr, &val) == 1) { - if (size==32){ - printf("MSR: 0x%08x=0x%08lx : ", msr, (unsigned long) val); - binary32(val); - } - if (size==64) { - printf("MSR: 0x%08x=0x%016llx : ", msr, val); - binary64(val); - } - return; - } - printf("Couldn't read MSR 0x%x\n", msr); -} - -void dumpmsr_bin(int cpu, unsigned int msr, int size) -{ - unsigned long long val=0; - - if (read_msr(cpu, msr, &val) == 1) { - if (size==32) - binary32(val); - if (size==64) - binary64(val); - return; - } - printf("Couldn't read MSR 0x%x\n", msr); -} Index: x86info-1.24/AMD/MSR-K6.c =================================================================== --- x86info-1.24.orig/AMD/MSR-K6.c +++ x86info-1.24/AMD/MSR-K6.c @@ -11,6 +11,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "AMD.h" void dump_k6_MSR (struct cpudata *cpu) Index: x86info-1.24/AMD/bluesmoke.c =================================================================== --- x86info-1.24.orig/AMD/bluesmoke.c +++ x86info-1.24/AMD/bluesmoke.c @@ -9,6 +9,7 @@ #include #include #include +#include "../x86_info.h" #include "../x86info.h" #include "AMD.h" Index: x86info-1.24/AMD/bugs.c =================================================================== --- x86info-1.24.orig/AMD/bugs.c +++ x86info-1.24/AMD/bugs.c @@ -10,6 +10,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "AMD.h" static void show_k7_bugs(struct cpudata *cpu) Index: x86info-1.24/AMD/powernow.c =================================================================== --- x86info-1.24.orig/AMD/powernow.c +++ x86info-1.24/AMD/powernow.c @@ -10,6 +10,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "AMD.h" #include "powernow.h" Index: x86info-1.24/Centaur/longhaul.c =================================================================== --- x86info-1.24.orig/Centaur/longhaul.c +++ x86info-1.24/Centaur/longhaul.c @@ -7,6 +7,7 @@ */ #include #include "../x86info.h" +#include "../x86_info.h" #include "centaur.h" union msr_longhaul { Index: x86info-1.24/Centaur/powersaver.c =================================================================== --- x86info-1.24.orig/Centaur/powersaver.c +++ x86info-1.24/Centaur/powersaver.c @@ -10,6 +10,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "centaur.h" #include "powersaver.h" Index: x86info-1.24/Intel/MSR-P4.c =================================================================== --- x86info-1.24.orig/Intel/MSR-P4.c +++ x86info-1.24/Intel/MSR-P4.c @@ -11,6 +11,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" void dump_p4_MSRs (struct cpudata *cpu) Index: x86info-1.24/Intel/MSR-P6.c =================================================================== --- x86info-1.24.orig/Intel/MSR-P6.c +++ x86info-1.24/Intel/MSR-P6.c @@ -11,6 +11,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" void dump_p6_MSRs (struct cpudata *cpu) Index: x86info-1.24/Intel/MSR-PM.c =================================================================== --- x86info-1.24.orig/Intel/MSR-PM.c +++ x86info-1.24/Intel/MSR-PM.c @@ -11,6 +11,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" void dump_centrino_MSRs (struct cpudata *cpu) Index: x86info-1.24/Intel/bluesmoke.c =================================================================== --- x86info-1.24.orig/Intel/bluesmoke.c +++ x86info-1.24/Intel/bluesmoke.c @@ -10,6 +10,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" #define MCG_CAP 0x0179 Index: x86info-1.24/Intel/info.c =================================================================== --- x86info-1.24.orig/Intel/info.c +++ x86info-1.24/Intel/info.c @@ -13,6 +13,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" /* Decode Pentium III CPU serial number */ Index: x86info-1.24/Intel/microcode.c =================================================================== --- x86info-1.24.orig/Intel/microcode.c +++ x86info-1.24/Intel/microcode.c @@ -10,6 +10,7 @@ #include #include #include "../x86info.h" +#include "../x86_info.h" #include "Intel.h" void decode_microcode(struct cpudata *cpu) Index: x86info-1.24/Makefile =================================================================== --- x86info-1.24.orig/Makefile +++ x86info-1.24/Makefile @@ -77,7 +77,8 @@ X86INFO_SRC =\ dumpregs.c\ features.c\ identify.c\ - rdmsr.c\ + msr.c\ + dumpmsr.c\ binary.c\ mptable.c\ get_model_name.c\ Index: x86info-1.24/mtrr.c =================================================================== --- x86info-1.24.orig/mtrr.c +++ x86info-1.24/mtrr.c @@ -9,6 +9,7 @@ #include #include "x86info.h" +#include "x86_info.h" static void dump_mtrr(int cpu, int msr) { Index: x86info-1.24/x86info.h =================================================================== --- x86info-1.24.orig/x86info.h +++ x86info-1.24/x86info.h @@ -128,7 +128,6 @@ extern void get_cpu_info_basics(struct c extern void identify(struct cpudata *cpu); extern void show_info(struct cpudata *cpu); -extern int read_msr(int cpu, unsigned int idx, unsigned long long *val); extern void binary(unsigned int n, unsigned long value); extern void binary32(unsigned long value); extern void binary64(unsigned long long value);