Home | History | Annotate | Download | only in toolbox
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <sys/mman.h>
      4 #include <fcntl.h>
      5 #include <string.h>
      6 
      7 static int usage()
      8 {
      9     fprintf(stderr,"r [-b|-s] <address> [<value>]\n");
     10     return -1;
     11 }
     12 
     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