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