diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2020-04-03 20:18:57 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2020-04-03 20:33:38 +0200 |
| commit | d86b3788c75b8b7c8b1b0bdddd3dada29e3a5649 (patch) | |
| tree | 1fde451272054ea7c99167d315f554d68a73fa15 | |
| parent | 7f0410a5e9b70070fa9187b5613dc3b1692908a2 (diff) | |
| download | miasm-d86b3788c75b8b7c8b1b0bdddd3dada29e3a5649.tar.gz miasm-d86b3788c75b8b7c8b1b0bdddd3dada29e3a5649.zip | |
Updt vm_read_ret_buf api
| -rw-r--r-- | miasm/jitter/vm_mngr.c | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/miasm/jitter/vm_mngr.c b/miasm/jitter/vm_mngr.c index 026c9bfc..d0e49213 100644 --- a/miasm/jitter/vm_mngr.c +++ b/miasm/jitter/vm_mngr.c @@ -551,17 +551,46 @@ int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, size_t siz return 0; } -char *vm_read_mem_ret_buf(vm_mngr_t* vm_mngr, uint64_t addr, size_t size) + +/* + Try to read @size bytes from vm mmemory + Return the number of bytes consecutively read +*/ +uint64_t vm_read_mem_ret_buf(vm_mngr_t* vm_mngr, uint64_t addr, size_t size, char *buffer) { - int ret; - char *buffer; - ret = vm_read_mem(vm_mngr, addr, &buffer, size); - if (ret == 0 ) { - return buffer; + size_t len; + uint64_t addr_diff; + uint64_t size_out; + size_t addr_diff_st; + + struct memory_page_node * mpn; + + size_out = 0; + /* read is multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr, 0); + if (!mpn){ + return size_out; + } + + addr_diff = addr - mpn->ad; + if (addr_diff > SIZE_MAX) { + fprintf(stderr, "Size too big\n"); + exit(EXIT_FAILURE); + } + addr_diff_st = (size_t) addr_diff; + len = MIN(size, mpn->size - addr_diff_st); + memcpy(buffer, (char*)mpn->ad_hp + (addr_diff_st), len); + buffer += len; + size_out += len; + addr += len; + size -= len; } - return NULL; + + return size_out; } + int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, size_t size) { size_t len; |