Use the newly introduce read_msr and write_msr shared library functions Use them in rdmsr and wrmsr integrated msr-tools package From: Thomas Renninger Index: x86info-1.24/msr-tools-1.1.2/Makefile =================================================================== --- x86info-1.24.orig/msr-tools-1.1.2/Makefile +++ x86info-1.24/msr-tools-1.1.2/Makefile @@ -17,7 +17,7 @@ CC = gcc -Wall CFLAGS = -g -O2 -fomit-frame-pointer -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -LDFLAGS = +LDFLAGS = -L.. -lx86info BIN = wrmsr rdmsr Index: x86info-1.24/msr-tools-1.1.2/rdmsr.c =================================================================== --- x86info-1.24.orig/msr-tools-1.1.2/rdmsr.c +++ x86info-1.24/msr-tools-1.1.2/rdmsr.c @@ -27,6 +27,7 @@ #include #include "version.h" +#include "../x86_info.h" struct option long_options[] = { { "help", 0, 0, 'h' }, @@ -91,8 +92,8 @@ void usage(void) int main(int argc, char *argv[]) { uint32_t reg; - uint64_t data; - int c, fd; + unsigned long long data; + int c; int mode = mo_hex; int cpu = 0; unsigned int highbit = 63, lowbit = 0, bits; @@ -100,7 +101,6 @@ int main(int argc, char *argv[]) char *endarg; char *pat; int width; - char msr_file_name[64]; program = argv[0]; @@ -167,27 +167,8 @@ int main(int argc, char *argv[]) reg = strtoul(argv[optind], NULL, 0); - sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu); - fd = open(msr_file_name, O_RDONLY); - if ( fd < 0 ) { - if ( errno == ENXIO ) { - fprintf(stderr, "rdmsr: No CPU %d\n", cpu); - exit(2); - } else if ( errno == EIO ) { - fprintf(stderr, "rdmsr: CPU %d doesn't support MSRs\n", cpu); - exit(3); - } else { - perror("rdmsr:open"); - exit(127); - } - } - - if ( pread(fd, &data, sizeof data, reg) != sizeof data ) { - perror("rdmsr:pread"); - exit(127); - } - - close(fd); + if ( read_msr(cpu, reg, &data) == -1 ) + perror("read_msr"); bits = highbit-lowbit+1; if ( bits < 64 ) { Index: x86info-1.24/msr-tools-1.1.2/wrmsr.c =================================================================== --- x86info-1.24.orig/msr-tools-1.1.2/wrmsr.c +++ x86info-1.24/msr-tools-1.1.2/wrmsr.c @@ -27,6 +27,7 @@ #include #include "version.h" +#include "../x86_info.h" struct option long_options[] = { { "help", 0, 0, 'h' }, @@ -51,12 +52,10 @@ int main(int argc, char *argv[]) { uint32_t reg; uint64_t data; - int fd; int c; int cpu = 0; unsigned long arg; char *endarg; - char msr_file_name[64]; program = argv[0]; @@ -90,30 +89,11 @@ int main(int argc, char *argv[]) reg = strtoul(argv[optind++], NULL, 0); - sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu); - fd = open(msr_file_name, O_WRONLY); - if ( fd < 0 ) { - if ( errno == ENXIO ) { - fprintf(stderr, "wrmsr: No CPU %d\n", cpu); - exit(2); - } else if ( errno == EIO ) { - fprintf(stderr, "wrmsr: CPU %d doesn't support MSRs\n", cpu); - exit(3); - } else { - perror("wrmsr:open"); - exit(127); - } - } - while ( optind < argc ) { data = strtoull(argv[optind++], NULL, 0); - if ( pwrite(fd, &data, sizeof data, reg) != sizeof data ) { - perror("wrmsr:pwrite"); - exit(127); - } + if ( write_msr(cpu, reg, data) == -1 ) + perror("write_msr"); } - close(fd); - exit(0); }