diff options
| author | serpilliere <fabrice.desclaux@cea.fr> | 2015-04-05 22:50:43 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-04-22 11:07:00 +0200 |
| commit | e6676c92ea2ea3e1f69c10902313094c1b83e375 (patch) | |
| tree | 2869f9bcf96fcb68da757c91a902df0b8af8c3a5 /miasm2/jitter/vm_mngr.c | |
| parent | 9039f508b2e2d407495d1ab6f74cc78cc891f822 (diff) | |
| download | miasm-e6676c92ea2ea3e1f69c10902313094c1b83e375.tar.gz miasm-e6676c92ea2ea3e1f69c10902313094c1b83e375.zip | |
Vm_mngr: move get/set mem into vmmngr
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index f74830fd..a9bdd8ca 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -537,6 +537,66 @@ uint64_t MEM_LOOKUP_64(vm_mngr_t* vm_mngr, uint64_t addr) return ret; } + +int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size) +{ + char* buffer; + uint64_t len; + struct memory_page_node * mpn; + + buffer = malloc(size); + *buffer_ptr = buffer; + if (!buffer){ + fprintf(stderr, "cannot alloc read\n"); + exit(-1); + } + + /* read is multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr); + if (!mpn){ + free(*buffer_ptr); + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return -1; + } + + len = MIN(size, mpn->size - (addr - mpn->ad)); + memcpy(buffer, (char*)(mpn->ad_hp + (addr - mpn->ad)), len); + buffer += len; + addr += len; + size -= len; + } + + return 0; +} + +int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) +{ + uint64_t len; + struct memory_page_node * mpn; + + check_write_code_bloc(vm_mngr, size * 8, addr); + + /* write is multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr); + if (!mpn){ + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return -1; + } + + len = MIN(size, mpn->size - (addr - mpn->ad)); + memcpy(mpn->ad_hp + (addr-mpn->ad), buffer, len); + buffer += len; + addr += len; + size -= len; + } + + return 0; +} + + + unsigned int parity(unsigned int a) { #if defined(__builtin_parity) |