/* ** mmio_rd ** ** eg mmio_rd fed01500 1 */ #include #include #include #include #include int main(int argc, char **argv) { int fd = open("/dev/mem", O_RDONLY | O_SYNC); unsigned long phys_addr, len; /* arg1, arg2 */ unsigned long i, page_addr, page_size = getpagesize(); volatile unsigned long *mem; if (fd < 0) perror("open /dev/mem"); if (argc < 3) exit(-2); phys_addr = strtoul(argv[1], NULL, 16); phys_addr &= ~(sizeof(mem[0]) - 1); len = strtoul(argv[2], NULL, 16); /* KISS, can only dump one page at a time */ if (len < 0 || (len > page_size / sizeof(mem[0]))) exit(-22); page_addr = phys_addr & ~(page_size - 1); i = (phys_addr - page_addr) / sizeof(mem[0]); mem = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, page_addr); if (mem == MAP_FAILED) { perror("mmap()"); exit(-1); } for (; len && (i < (page_size / sizeof(mem[0]))); i++, len--) { /* printf("%016lx: ", page_addr + i*sizeof(mem[0])); */ printf("0x%016lx\n", mem[i]); } return 0; }