12430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#include <fcntl.h> 22430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#include <inttypes.h> 32430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#include <stdbool.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 72430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#include <sys/mman.h> 82430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes 92430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#if __LP64__ 102430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#define strtoptr strtoull 112430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#else 122430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#define strtoptr strtoul 132430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes#endif 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int usage() 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"r [-b|-s] <address> [<value>]\n"); 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint r_main(int argc, char *argv[]) 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) return usage(); 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes int width = 4; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[1], "-b")) { 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project width = 1; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[1], "-s")) { 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project width = 2; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) return usage(); 372430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uintptr_t addr = strtoptr(argv[1], 0, 16); 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 392430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uintptr_t endaddr = 0; 402430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes char* end = strchr(argv[1], '-'); 412ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if (end) 422430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes endaddr = strtoptr(end + 1, 0, 16); 432ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross 442ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if (!endaddr) 452ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross endaddr = addr + width - 1; 462ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross 472ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if (endaddr <= addr) { 482430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes fprintf(stderr, "end address <= start address\n"); 492ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross return -1; 502ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross } 512ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross 522430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes bool set = false; 532430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uint32_t value = 0; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc > 2) { 552430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes set = true; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project value = strtoul(argv[2], 0, 16); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 592430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes int fd = open("/dev/mem", O_RDWR | O_SYNC); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot open /dev/mem\n"); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 642430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes 652430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes off64_t mmap_start = addr & ~(PAGE_SIZE - 1); 662430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes size_t mmap_size = endaddr - mmap_start + 1; 672ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross mmap_size = (mmap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); 682ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross 692430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes void* page = mmap64(0, mmap_size, PROT_READ | PROT_WRITE, 702430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes MAP_SHARED, fd, mmap_start); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(page == MAP_FAILED){ 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"cannot mmap region\n"); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 772ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross while (addr <= endaddr) { 782ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross switch(width){ 792ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross case 4: { 802430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uint32_t* x = (uint32_t*) (((uintptr_t) page) + (addr & 4095)); 812ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if(set) *x = value; 822430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes fprintf(stderr,"%08"PRIxPTR": %08x\n", addr, *x); 832ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross break; 842ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross } 852ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross case 2: { 862430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uint16_t* x = (uint16_t*) (((uintptr_t) page) + (addr & 4095)); 872ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if(set) *x = value; 882430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes fprintf(stderr,"%08"PRIxPTR": %04x\n", addr, *x); 892ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross break; 902ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross } 912ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross case 1: { 922430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes uint8_t* x = (uint8_t*) (((uintptr_t) page) + (addr & 4095)); 932ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross if(set) *x = value; 942430a064bd956fb2eb4f40762966315a1b12e3a8Elliott Hughes fprintf(stderr,"%08"PRIxPTR": %02x\n", addr, *x); 952ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross break; 962ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross } 972ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross } 982ad280f07a97e9ed0dfd86202abe659ad0ca9ccdColin Cross addr += width; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 102