1#include <errno.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/mman.h>
5#include <unistd.h>
6#include <fcntl.h>
7
8static void *map_memory(const char *fn, unsigned base, unsigned size)
9{
10    int fd;
11    void *ptr;
12
13    fd = open(fn, O_RDWR | O_SYNC);
14    if(fd < 0) {
15        perror("cannot open %s for mapping");
16        return MAP_FAILED;
17    }
18
19    ptr = mmap(0, size, PROT_READ | PROT_WRITE,
20               MAP_SHARED, fd, base);
21    close(fd);
22
23    if(ptr == MAP_FAILED) {
24        fprintf(stderr,"cannot map %s (@%08x,%08x)\n", fn, base, size);
25    }
26    return ptr;
27}
28
29
30int main(int argc, char** argv)
31{
32    void *grp_regs = map_memory("/dev/hw3d", 0, 1024 * 1024);
33    printf("GPU base mapped at %p\n", grp_regs);
34    int state_offset = 0x10140;
35    printf("GPU state = %08lx\n",
36            *((long*)((char*)grp_regs + state_offset))  );
37
38    return 0;
39}
40