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