• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/mman.h>
4 #include <fcntl.h>
5 #include <string.h>
6 
usage()7 static int usage()
8 {
9     fprintf(stderr,"r [-b|-s] <address> [<value>]\n");
10     return -1;
11 }
12 
r_main(int argc,char * argv[])13 int r_main(int argc, char *argv[])
14 {
15     int width = 4, set = 0, fd;
16     unsigned addr, value;
17     void *page;
18 
19     if(argc < 2) return usage();
20 
21     if(!strcmp(argv[1], "-b")) {
22         width = 1;
23         argc--;
24         argv++;
25     } else if(!strcmp(argv[1], "-s")) {
26         width = 2;
27         argc--;
28         argv++;
29     }
30 
31     if(argc < 2) return usage();
32     addr = strtoul(argv[1], 0, 16);
33 
34     if(argc > 2) {
35         set = 1;
36         value = strtoul(argv[2], 0, 16);
37     }
38 
39     fd = open("/dev/mem", O_RDWR | O_SYNC);
40     if(fd < 0) {
41         fprintf(stderr,"cannot open /dev/mem\n");
42         return -1;
43     }
44 
45     page = mmap(0, 8192, PROT_READ | PROT_WRITE,
46                 MAP_SHARED, fd, addr & (~4095));
47 
48     if(page == MAP_FAILED){
49         fprintf(stderr,"cannot mmap region\n");
50         return -1;
51     }
52 
53     switch(width){
54     case 4: {
55         unsigned *x = (unsigned*) (((unsigned) page) + (addr & 4095));
56         if(set) *x = value;
57         fprintf(stderr,"%08x: %08x\n", addr, *x);
58         break;
59     }
60     case 2: {
61         unsigned short *x = (unsigned short*) (((unsigned) page) + (addr & 4095));
62         if(set) *x = value;
63         fprintf(stderr,"%08x: %04x\n", addr, *x);
64         break;
65     }
66     case 1: {
67         unsigned char *x = (unsigned char*) (((unsigned) page) + (addr & 4095));
68         if(set) *x = value;
69         fprintf(stderr,"%08x: %02x\n", addr, *x);
70         break;
71     }
72     }
73     return 0;
74 }
75