高通平台的寄存器读工具

来源:互联网 发布:天猫淘宝网商城午蹈鞋 编辑:程序博客网 时间:2024/05/21 05:55
      高通平台自带寄存器的读工具/system/bin/r,使用时只需

/system/bin/r+寄存器就可获取寄存器的值。这两个工具的源码位于/system/core目录下r.c。

#include <fcntl.h>#include <inttypes.h>#include <stdbool.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/mman.h>#if __LP64__#define strtoptr strtoull#else#define strtoptr strtoul#endifstatic int usage(){    fprintf(stderr,"r [-b|-s] <address> [<value>]\n");    return -1;}int r_main(int argc, char *argv[]){    if(argc < 2) return usage();    int width = 4;    if(!strcmp(argv[1], "-b")) {        width = 1;        argc--;        argv++;    } else if(!strcmp(argv[1], "-s")) {        width = 2;        argc--;        argv++;    }    if(argc < 2) return usage();    uintptr_t addr = strtoptr(argv[1], 0, 16);    uintptr_t endaddr = 0;    char* end = strchr(argv[1], '-');    if (end)        endaddr = strtoptr(end + 1, 0, 16);    if (!endaddr)        endaddr = addr + width - 1;    if (endaddr <= addr) {        fprintf(stderr, "end address <= start address\n");        return -1;    }    bool set = false;    uint32_t value = 0;    if(argc > 2) {        set = true;        value = strtoul(argv[2], 0, 16);    }    int fd = open("/dev/mem", O_RDWR | O_SYNC);    if(fd < 0) {        fprintf(stderr,"cannot open /dev/mem\n");        return -1;    }    off64_t mmap_start = addr & ~(PAGE_SIZE - 1);    size_t mmap_size = endaddr - mmap_start + 1;    mmap_size = (mmap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);    void* page = mmap64(0, mmap_size, PROT_READ | PROT_WRITE,                        MAP_SHARED, fd, mmap_start);    if(page == MAP_FAILED){        fprintf(stderr,"cannot mmap region\n");        return -1;    }    while (addr <= endaddr) {        switch(width){        case 4: {            uint32_t* x = (uint32_t*) (((uintptr_t) page) + (addr & 4095));            if(set) *x = value;            fprintf(stderr,"%08"PRIxPTR": %08x\n", addr, *x);            break;        }        case 2: {            uint16_t* x = (uint16_t*) (((uintptr_t) page) + (addr & 4095));            if(set) *x = value;            fprintf(stderr,"%08"PRIxPTR": %04x\n", addr, *x);            break;        }        case 1: {            uint8_t* x = (uint8_t*) (((uintptr_t) page) + (addr & 4095));            if(set) *x = value;            fprintf(stderr,"%08"PRIxPTR": %02x\n", addr, *x);            break;        }        }        addr += width;    }    return 0;}

第一次用的时候报无法打开/dev/mem节点(没有该节点),这时只需在内核配置中选上CONFIG_DEVMEM,重新编译内核重烧即可。

1 0
原创粉丝点击