From 4a16646c959159e92684e049d8fd1e5be151c91e Mon Sep 17 00:00:00 2001 From: Chris Fries Date: Thu, 2 Nov 2017 10:03:10 -0500 Subject: [PATCH] Revert "delete toolbox/r.c" This utility is always useful during device bringup, so let's bring it back for debug builds. This reverts commit 8a475f7e4ae72db0a6cfe31ab46f588e89e0fc34. Change-Id: Ic4041afe538663f1e201ee1341dee247ab0d5ba2 --- toolbox/Android.mk | 9 ++++ toolbox/r.c | 102 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 toolbox/r.c diff --git a/toolbox/Android.mk b/toolbox/Android.mk index 94029d8d2..c4795a73a 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -59,3 +59,12 @@ $(INPUT_H_LABELS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_LOCAL_PATH)/generate-input. $(INPUT_H_LABELS_H): $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/generate-input.h-labels.py $(UAPI_INPUT_EVENT_CODES_H) $(INPUT_H_LABELS_H): $(transform-generated-source) + +# We only want 'r' on userdebug and eng builds. +include $(CLEAR_VARS) +LOCAL_SRC_FILES := r.c +LOCAL_CFLAGS += $(common_cflags) +LOCAL_C_INCLUDES += $(LOCAL_PATH)/upstream-netbsd/include/ +LOCAL_MODULE := r +LOCAL_MODULE_TAGS := debug +include $(BUILD_EXECUTABLE) diff --git a/toolbox/r.c b/toolbox/r.c new file mode 100644 index 000000000..b96cdb279 --- /dev/null +++ b/toolbox/r.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#if __LP64__ +#define strtoptr strtoull +#else +#define strtoptr strtoul +#endif + +static int usage() +{ + fprintf(stderr,"r [-b|-s]
[]\n"); + return -1; +} + +int 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; +}