geode_msr.c revision 5a85740a
1#define _LARGEFILE64_SOURCE 2#include <stdio.h> 3#include <unistd.h> 4#include <fcntl.h> 5#include <sys/types.h> 6#include <errno.h> 7#include "os.h" 8#include "geode.h" 9 10#define lseek64 lseek 11 12static int 13_msr_open(void) 14{ 15 static int msrfd = 0; 16 17 if (msrfd == 0) { 18 msrfd = open("/dev/cpu/0/msr", O_RDWR); 19 if (msrfd == -1) 20 ErrorF("Unable to open /dev/cpu/0/msr: %d\n", errno); 21 } 22 23 return msrfd; 24} 25 26int 27GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi) 28{ 29 unsigned int data[2]; 30 int fd = _msr_open(); 31 int ret; 32 33 if (fd == -1) 34 return -1; 35 36 ret = lseek64(fd, (off64_t) addr, SEEK_SET); 37 38 if (ret == -1) 39 return -1; 40 41 ret = read(fd, (void *)data, sizeof(data)); 42 43 if (ret != 8) 44 return -1; 45 46 *hi = data[1]; 47 *lo = data[0]; 48 49 return 0; 50} 51 52int 53GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi) 54{ 55 unsigned int data[2]; 56 int fd = _msr_open(); 57 58 if (fd == -1) 59 return -1; 60 61 if (lseek64(fd, (off64_t) addr, SEEK_SET) == -1) 62 return -1; 63 64 data[0] = lo; 65 data[1] = hi; 66 67 if (write(fd, (void *)data, 8) != 8) 68 return -1; 69 70 return 0; 71} 72