From f4882ae1a27365f25ee2989b7e96ee5bef96e28e Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 28 Nov 2015 18:26:08 +0800 Subject: [PATCH] simplify code by replacing mem_map_start()/mem_map_finish() in uc.c with mem_map() --- samples/sample_x86.c | 2 +- uc.c | 27 ++++++--------------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/samples/sample_x86.c b/samples/sample_x86.c index 99811e63..c5fb540c 100644 --- a/samples/sample_x86.c +++ b/samples/sample_x86.c @@ -250,7 +250,7 @@ static void test_i386_map_ptr(void) } // malloc 2MB memory for this emulation - mem = malloc(2 * 1024 * 1024); + mem = calloc(1, 2 * 1024 * 1024); if (mem == NULL) { printf("Failed to malloc()\n"); return; diff --git a/uc.c b/uc.c index d730f509..25ff1fb9 100644 --- a/uc.c +++ b/uc.c @@ -571,7 +571,7 @@ static uc_err _hook_mem_access(uc_engine *uc, uc_hook_type type, } // common setup/error checking shared between uc_mem_map and uc_mem_map_ptr -static uc_err mem_map_start(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) +static uc_err mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, MemoryRegion *block) { MemoryRegion **regions; @@ -591,6 +591,9 @@ static uc_err mem_map_start(uc_engine *uc, uint64_t address, size_t size, uint32 if ((perms & ~UC_PROT_ALL) != 0) return UC_ERR_ARG; + if (block == NULL) + return UC_ERR_NOMEM; + if ((uc->mapped_block_count & (MEM_BLOCK_INCR - 1)) == 0) { //time to grow regions = (MemoryRegion**)realloc(uc->mapped_blocks, sizeof(MemoryRegion*) * (uc->mapped_block_count + MEM_BLOCK_INCR)); @@ -600,16 +603,7 @@ static uc_err mem_map_start(uc_engine *uc, uint64_t address, size_t size, uint32 uc->mapped_blocks = regions; } - return UC_ERR_OK; -} - -// common final step shared by uc_mem_map and uc_mem_map_ptr -static uc_err mem_map_finish(uc_engine *uc, MemoryRegion *block) -{ uc->mapped_blocks[uc->mapped_block_count] = block; - if (uc->mapped_blocks[uc->mapped_block_count] == NULL) - return UC_ERR_NOMEM; - uc->mapped_block_count++; return UC_ERR_OK; @@ -618,25 +612,16 @@ static uc_err mem_map_finish(uc_engine *uc, MemoryRegion *block) UNICORN_EXPORT uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) { - uc_err err; - if ((err = mem_map_start(uc, address, size, perms)) != UC_ERR_OK) - return err; - - return mem_map_finish(uc, uc->memory_map(uc, address, size, perms)); + return mem_map(uc, address, size, perms, uc->memory_map(uc, address, size, perms)); } UNICORN_EXPORT uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, void *ptr) { - uc_err err; - if (ptr == NULL) return UC_ERR_ARG; - if ((err = mem_map_start(uc, address, size, UC_PROT_ALL)) != UC_ERR_OK) - return err; - - return mem_map_finish(uc, uc->memory_map_ptr(uc, address, size, ptr)); + return mem_map(uc, address, size, UC_PROT_ALL, uc->memory_map_ptr(uc, address, size, ptr)); } // Create a backup copy of the indicated MemoryRegion.