diff options
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index a0c2f5a3..1bb58a17 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -84,6 +84,9 @@ inline int midpoint(int imin, int imax) int find_page_node(struct memory_page_node * array, uint64_t key, int imin, int imax) { + if (imax < 1) + return -1; + imax--; // continue searching while [imin,imax] is not empty while (imin <= imax) { // calculate the midpoint for roughly equal partition @@ -103,7 +106,7 @@ int find_page_node(struct memory_page_node * array, uint64_t key, int imin, int return -1; } -struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint64_t ad) +struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint64_t ad, int raise_exception) { struct memory_page_node * mpn; int i; @@ -117,8 +120,10 @@ struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint6 if ((mpn->ad <= ad) && (ad < mpn->ad + mpn->size)) return mpn; } - fprintf(stderr, "WARNING: address 0x%"PRIX64" is not mapped in virtual memory:\n", ad); - vm_mngr->exception_flags |= EXCEPT_ACCESS_VIOL; + if (raise_exception) { + fprintf(stderr, "WARNING: address 0x%"PRIX64" is not mapped in virtual memory:\n", ad); + vm_mngr->exception_flags |= EXCEPT_ACCESS_VIOL; + } return NULL; } @@ -133,7 +138,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6 struct memory_breakpoint_info * b; - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return 0; @@ -182,7 +187,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6 unsigned int new_size = my_size; int index = 0; while (new_size){ - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return 0; addr = &((unsigned char*)mpn->ad_hp)[ad - mpn->ad]; @@ -219,7 +224,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size, unsigned char * addr; struct memory_breakpoint_info * b; - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return; @@ -283,7 +288,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size, break; } while (my_size){ - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return; @@ -459,7 +464,7 @@ int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t s /* read is multiple page wide */ while (size){ - mpn = get_memory_page_from_address(vm_mngr, addr); + mpn = get_memory_page_from_address(vm_mngr, addr, 1); if (!mpn){ free(*buffer_ptr); PyErr_SetString(PyExc_RuntimeError, "Error: cannot find address"); @@ -485,7 +490,7 @@ int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) /* write is multiple page wide */ while (size){ - mpn = get_memory_page_from_address(vm_mngr, addr); + mpn = get_memory_page_from_address(vm_mngr, addr, 1); if (!mpn){ PyErr_SetString(PyExc_RuntimeError, "Error: cannot find address"); return -1; @@ -503,6 +508,27 @@ int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) +int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size) +{ + uint64_t len; + struct memory_page_node * mpn; + + /* test multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr, 0); + if (!mpn) + return 0; + + len = MIN(size, mpn->size - (addr - mpn->ad)); + addr += len; + size -= len; + } + + return 1; +} + + + unsigned int parity(unsigned int a) { #if defined(__builtin_parity) |