about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2017-01-05 16:11:32 +0100
committerAjax <commial@gmail.com>2017-01-05 16:11:32 +0100
commitefef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1 (patch)
tree4f2a29ab37f22d1ffcae3bd4c5b95d2a6d44899c
parent06461f1bd7a8c987b47381dffa3e1462cee8e44f (diff)
downloadmiasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.tar.gz
miasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.zip
LLVM: avoid going back to Python while next block are already jitted
-rw-r--r--miasm2/jitter/Jitllvm.c38
-rw-r--r--miasm2/jitter/jitcore_llvm.py3
2 files changed, 34 insertions, 7 deletions
diff --git a/miasm2/jitter/Jitllvm.c b/miasm2/jitter/Jitllvm.c
index c176a4b2..979c4f3a 100644
--- a/miasm2/jitter/Jitllvm.c
+++ b/miasm2/jitter/Jitllvm.c
@@ -12,19 +12,45 @@
 
 PyObject* llvm_exec_bloc(PyObject* self, PyObject* args)
 {
-	uint64_t func_addr;
 	uint64_t (*func)(void*, void*, void*, uint8_t*);
 	uint64_t vm;
 	uint64_t ret;
 	JitCpu* jitcpu;
 	uint8_t status;
-	
-	if (!PyArg_ParseTuple(args, "KOK", &func_addr, &jitcpu, &vm))
+	PyObject* func_py;
+	PyObject* lbl2ptr;
+	PyObject* breakpoints;
+	PyObject* retaddr = NULL;
+
+
+	if (!PyArg_ParseTuple(args, "OOKOO", &retaddr, &jitcpu, &vm, &lbl2ptr, &breakpoints))
 		return NULL;
 	vm_cpu_t* cpu = jitcpu->cpu;
-	func = (void *) (intptr_t) func_addr;
-	ret = func((void*) jitcpu, (void*)(intptr_t) cpu, (void*)(intptr_t) vm, &status);
-	return PyLong_FromUnsignedLongLong(ret);
+	/* The loop will decref retaddr always once */
+	Py_INCREF(retaddr);
+
+	for (;;) {
+		// Get the expected jitted function address
+		func_py = PyDict_GetItem(lbl2ptr, retaddr);
+		if (func_py)
+			func = PyLong_AsVoidPtr((PyObject*) func_py);
+		else
+			// retaddr is not jitted yet
+			return retaddr;
+
+		// Execute it
+		ret = func((void*) jitcpu, (void*)(intptr_t) cpu, (void*)(intptr_t) vm, &status);
+		Py_DECREF(retaddr);
+		retaddr = PyLong_FromUnsignedLongLong(ret);
+
+		// Check exception
+		if (status)
+			return retaddr;
+
+		// Check breakpoint
+		if (PyDict_Contains(breakpoints, retaddr))
+			return retaddr;
+	}
 }
 
 
diff --git a/miasm2/jitter/jitcore_llvm.py b/miasm2/jitter/jitcore_llvm.py
index 0f265073..9f9a63e4 100644
--- a/miasm2/jitter/jitcore_llvm.py
+++ b/miasm2/jitter/jitcore_llvm.py
@@ -99,4 +99,5 @@ class JitCore_LLVM(jitcore.JitCore):
         @cpu: JitCpu instance
         @breakpoints: Dict instance of used breakpoints
         """
-        return self.exec_wrapper(self.lbl2jitbloc[label], cpu, cpu.vmmngr.vmmngr)
+        return self.exec_wrapper(label, cpu, cpu.vmmngr.vmmngr,
+                                 self.lbl2jitbloc.data, breakpoints)