• 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, endaddr = 0;
17     unsigned long mmap_start, mmap_size;
18     void *page;
19     char *end;
20 
21     if(argc < 2) return usage();
22 
23     if(!strcmp(argv[1], "-b")) {
24         width = 1;
25         argc--;
26         argv++;
27     } else if(!strcmp(argv[1], "-s")) {
28         width = 2;
29         argc--;
30         argv++;
31     }
32 
33     if(argc < 2) return usage();
34     addr = strtoul(argv[1], 0, 16);
35 
36     end = strchr(argv[1], '-');
37     if (end)
38         endaddr = strtoul(end + 1, 0, 16);
39 
40     if (!endaddr)
41         endaddr = addr + width - 1;
42 
43     if (endaddr <= addr) {
44         fprintf(stderr, "invalid end address\n");
45         return -1;
46     }
47 
48     if(argc > 2) {
49         set = 1;
50         value = strtoul(argv[2], 0, 16);
51     }
52 
53     fd = open("/dev/mem", O_RDWR | O_SYNC);
54     if(fd < 0) {
55         fprintf(stderr,"cannot open /dev/mem\n");
56         return -1;
57     }
58 
59     mmap_start = addr & ~(PAGE_SIZE - 1);
60     mmap_size = endaddr - mmap_start + 1;
61     mmap_size = (mmap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
62 
63     page = mmap(0, mmap_size, PROT_READ | PROT_WRITE,
64                 MAP_SHARED, fd, mmap_start);
65 
66     if(page == MAP_FAILED){
67         fprintf(stderr,"cannot mmap region\n");
68         return -1;
69     }
70 
71     while (addr <= endaddr) {
72         switch(width){
73         case 4: {
74             unsigned *x = (unsigned*) (((unsigned) page) + (addr & 4095));
75             if(set) *x = value;
76             fprintf(stderr,"%08x: %08x\n", addr, *x);
77             break;
78         }
79         case 2: {
80             unsigned short *x = (unsigned short*) (((unsigned) page) + (addr & 4095));
81             if(set) *x = value;
82             fprintf(stderr,"%08x: %04x\n", addr, *x);
83             break;
84         }
85         case 1: {
86             unsigned char *x = (unsigned char*) (((unsigned) page) + (addr & 4095));
87             if(set) *x = value;
88             fprintf(stderr,"%08x: %02x\n", addr, *x);
89             break;
90         }
91         }
92         addr += width;
93     }
94     return 0;
95 }
96