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