about summary refs log tree commit diff stats
path: root/miasm2/jitter/arch/JitCore_msp430.c
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter/arch/JitCore_msp430.c')
-rw-r--r--miasm2/jitter/arch/JitCore_msp430.c200
1 files changed, 166 insertions, 34 deletions
diff --git a/miasm2/jitter/arch/JitCore_msp430.c b/miasm2/jitter/arch/JitCore_msp430.c
index b52ad5d0..94a1b4e2 100644
--- a/miasm2/jitter/arch/JitCore_msp430.c
+++ b/miasm2/jitter/arch/JitCore_msp430.c
@@ -3,44 +3,13 @@
 #include "structmember.h"
 #include <stdint.h>
 #include <inttypes.h>
+#include "../queue.h"
+#include "../vm_mngr.h"
+#include "../vm_mngr_py.h"
 #include "JitCore_msp430.h"
 
 #define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;}
 
-/*
-void check_align(uint64_t addr)
-{
-	if (addr & 1) {
-		printf("unaligned mem lookup %X\n", addr);
-		exit(0);
-	}
-}
-
-void VM_MEM_WRITE_08(vm_mngr_t* vm_mngr, uint64_t addr, unsigned char src)
-{
-	//check_align(addr);
-	MEM_WRITE_08(vm_mngr, addr, src);
-}
-
-void VM_MEM_WRITE_16(vm_mngr_t* vm_mngr, uint64_t addr, unsigned short src)
-{
-	check_align(addr);
-	MEM_WRITE_16(vm_mngr, addr, src);
-}
-
-void VM_MEM_WRITE_32(vm_mngr_t* vm_mngr, uint64_t addr, unsigned int src)
-{
-	check_align(addr);
-	MEM_WRITE_32(vm_mngr, addr, src);
-}
-
-void VM_MEM_WRITE_64(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t src)
-{
-	check_align(addr);
-	MEM_WRITE_64(vm_mngr, addr, src);
-}
-*/
-
 typedef struct _reg_dict{
     char* name;
     unsigned long offset;
@@ -518,6 +487,156 @@ JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure)
 	return -1;
 }
 
+
+
+static PyObject *
+JitCpu_get_vmmngr(JitCpu *self, void *closure)
+{
+	return self->vmcpu.pyvm;
+}
+
+static PyObject *
+JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
+{
+	self->vmcpu.pyvm = value;
+	return 0;
+}
+
+static PyObject *
+JitCpu_get_jitter(JitCpu *self, void *closure)
+{
+	return self->vmcpu.jitter;
+}
+
+static PyObject *
+JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure)
+{
+	self->vmcpu.jitter = value;
+	return 0;
+}
+
+uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr)
+{
+	return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr);
+}
+
+uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr)
+{
+	return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr);
+}
+
+uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr)
+{
+	return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr);
+}
+
+uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr)
+{
+	return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr);
+}
+
+
+
+void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size)
+{
+	PyObject *result;
+
+	if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD))
+		return;
+	result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size);
+	Py_DECREF(result);
+
+}
+
+void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src)
+{
+	vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src);
+	check_automod(vmcpu, addr, 8);
+}
+
+void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src)
+{
+	vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src);
+	check_automod(vmcpu, addr, 16);
+}
+
+void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src)
+{
+	vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src);
+	check_automod(vmcpu, addr, 32);
+}
+
+void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src)
+{
+	vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src);
+	check_automod(vmcpu, addr, 64);
+}
+
+
+
+
+PyObject* vm_set_mem(JitCpu *self, PyObject* args)
+{
+       PyObject *py_addr;
+       PyObject *py_buffer;
+       Py_ssize_t py_length;
+
+       char * buffer;
+       uint64_t size;
+       uint64_t addr;
+       int ret = 0x1337;
+
+       if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer))
+	       return NULL;
+
+       PyGetInt(py_addr, addr);
+
+       if(!PyString_Check(py_buffer))
+	       RAISE(PyExc_TypeError,"arg must be str");
+
+       size = PyString_Size(py_buffer);
+       PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
+
+       ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size);
+       if (ret < 0)
+	       RAISE(PyExc_TypeError,"arg must be str");
+       check_automod(&self->vmcpu, addr, size*8);
+
+       Py_INCREF(Py_None);
+       return Py_None;
+}
+
+PyObject* vm_get_mem(JitCpu *self, PyObject* args)
+{
+       PyObject *py_addr;
+       PyObject *py_len;
+
+       uint64_t addr;
+       uint64_t size;
+       PyObject *obj_out;
+       char * buf_out;
+       int ret;
+
+       if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len))
+	       return NULL;
+
+       PyGetInt(py_addr, addr);
+       PyGetInt(py_len, size);
+
+       ret = vm_read_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, &buf_out, size);
+       if (ret < 0) {
+	       free(buf_out);
+	       PyErr_SetString(PyExc_RuntimeError, "cannot find address");
+	       return NULL;
+       }
+
+       obj_out = PyString_FromStringAndSize(buf_out, size);
+       free(buf_out);
+       return obj_out;
+}
+
+
+
 static PyMemberDef JitCpu_members[] = {
     {NULL}  /* Sentinel */
 };
@@ -535,6 +654,10 @@ static PyMethodDef JitCpu_methods[] = {
 	 "X"},
 	{"set_exception", (PyCFunction)cpu_set_exception, METH_VARARGS,
 	 "X"},
+	{"set_mem", (PyCFunction)vm_set_mem, METH_VARARGS,
+	 "X"},
+	{"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS,
+	 "X"},
 	{NULL}  /* Sentinel */
 };
 
@@ -578,6 +701,15 @@ static PyGetSetDef JitCpu_getseters[] = {
      (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu,
      "first name",
      NULL},
+    {"vmmngr",
+     (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr,
+     "vmmngr",
+     NULL},
+
+    {"jitter",
+     (getter)JitCpu_get_jitter, (setter)JitCpu_set_jitter,
+     "jitter",
+     NULL},
 
 
     {"PC" , (getter)JitCpu_get_PC      , (setter)JitCpu_set_PC     , "PC" , NULL},