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