about summary refs log tree commit diff stats
path: root/miasm2/jitter/vm_mngr.c
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2016-07-08 15:33:21 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2016-08-30 13:54:06 +0200
commita5e64ddb5630be1fecf8878a0f5a10855c27ac63 (patch)
tree346226460a10208e717ba29b754aa3c7c8124660 /miasm2/jitter/vm_mngr.c
parente50f003dd1be98bab0e10666d45e666d9600d442 (diff)
downloadmiasm-a5e64ddb5630be1fecf8878a0f5a10855c27ac63.tar.gz
miasm-a5e64ddb5630be1fecf8878a0f5a10855c27ac63.zip
Jitter: use list of write
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
-rw-r--r--miasm2/jitter/vm_mngr.c40
1 files changed, 16 insertions, 24 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 67599c39..5cf6f162 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -395,20 +395,14 @@ void dump_code_bloc(vm_mngr_t* vm_mngr)
 
 void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size)
 {
-	if (vm_mngr->code_bloc_valid == 0) {
-		vm_mngr->code_bloc_valid = 1;
-		vm_mngr->code_bloc_memory_w_start = addr;
-		vm_mngr->code_bloc_memory_w_stop = addr + size;
-	} else {
-		if (vm_mngr->code_bloc_memory_w_stop != addr) {
-			fprintf(stderr,
-				"Error: sparse write %"PRIx64" %"PRIx64"\n",
-				vm_mngr->code_bloc_memory_w_stop,
-				addr);
-			exit(-1);
-		}
-		vm_mngr->code_bloc_memory_w_stop = addr + size;
-	}
+	PyObject* range;
+
+
+	range = PyTuple_New(2);
+	PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr));
+	PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr+size));
+
+	PyList_Append(vm_mngr->code_bloc_memory_w, range);
 }
 
 void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
@@ -427,6 +421,8 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 				fprintf(stderr, "**********************************\n");
 #endif
 				vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD;
+				printf("self modifying code %"PRIX64" %"PRIX64"\n",
+				       addr, my_size);
 				code_bloc_add_write(vm_mngr, addr, my_size/8);
 				break;
 			}
@@ -436,16 +432,14 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 
 void reset_code_bloc_write(vm_mngr_t* vm_mngr)
 {
-	vm_mngr->code_bloc_valid = 0;
-	vm_mngr->code_bloc_memory_w_start = 0;
-	vm_mngr->code_bloc_memory_w_stop = 0;
+	Py_DECREF(vm_mngr->code_bloc_memory_w);
+	vm_mngr->code_bloc_memory_w = PyList_New(0);
+
 }
 
-int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop)
+PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr)
 {
-	*start = vm_mngr->code_bloc_memory_w_start;
-	*stop = vm_mngr->code_bloc_memory_w_stop;
-	return vm_mngr->code_bloc_valid;
+	return vm_mngr->code_bloc_memory_w;
 }
 
 PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr)
@@ -1423,9 +1417,7 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr)
 	vm_mngr->code_bloc_pool_ad_min = 0xffffffff;
 	vm_mngr->code_bloc_pool_ad_max = 0;
 
-	vm_mngr->code_bloc_valid = 0;
-	vm_mngr->code_bloc_memory_w_start = 0;
-	vm_mngr->code_bloc_memory_w_stop = 0;
+	vm_mngr->code_bloc_memory_w = PyList_New(0);
 
 
 }