about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2011-10-19 14:49:26 +0200
committerserpilliere <devnull@localhost>2011-10-19 14:49:26 +0200
commitaba5eb87173a4dfc8247df7799b4be9fd55df81b (patch)
treee35d00b2a18a92d3e7013a37a7278601e132ac12
parent6422cca2e70fe7806850b49d040e57f771b53901 (diff)
downloadmiasm-aba5eb87173a4dfc8247df7799b4be9fd55df81b.tar.gz
miasm-aba5eb87173a4dfc8247df7799b4be9fd55df81b.zip
add float getter/setter
-rw-r--r--miasm/tools/emul_lib/libcodenat_interface.c157
1 files changed, 140 insertions, 17 deletions
diff --git a/miasm/tools/emul_lib/libcodenat_interface.c b/miasm/tools/emul_lib/libcodenat_interface.c
index 6bb04fb1..2bf78de3 100644
--- a/miasm/tools/emul_lib/libcodenat_interface.c
+++ b/miasm/tools/emul_lib/libcodenat_interface.c
@@ -140,6 +140,7 @@ PyObject* _vm_get_gpreg(void)
     return dict;
 }
 
+
 reg_dict gpreg_dict[] = { {.name = "eax", .ptr = &(vmcpu.eax)},
 			  {.name = "ebx", .ptr = &(vmcpu.ebx)},
 			  {.name = "ecx", .ptr = &(vmcpu.ecx)},
@@ -161,6 +162,9 @@ reg_dict gpreg_dict[] = { {.name = "eax", .ptr = &(vmcpu.eax)},
 
 };
 
+
+
+
 PyObject* _vm_set_gpreg(PyObject *dict)
 {
     PyObject *d_key, *d_value = NULL;
@@ -202,6 +206,105 @@ PyObject* _vm_set_gpreg(PyObject *dict)
 }
 
 
+
+
+PyObject* _vm_get_float(void)
+{
+    PyObject *dict = PyDict_New();
+    PyObject *o;
+
+    o = PyFloat_FromDouble((double)vmcpu.float_st0);
+    PyDict_SetItemString(dict, "st0", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st1);
+    PyDict_SetItemString(dict, "st1", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st2);
+    PyDict_SetItemString(dict, "st2", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st3);
+    PyDict_SetItemString(dict, "st3", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st4);
+    PyDict_SetItemString(dict, "st4", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st5);
+    PyDict_SetItemString(dict, "st5", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st6);
+    PyDict_SetItemString(dict, "st6", o);
+    Py_DECREF(o);
+    o = PyFloat_FromDouble((double)vmcpu.float_st7);
+    PyDict_SetItemString(dict, "st7", o);
+    Py_DECREF(o);
+    o = PyInt_FromLong((long)vmcpu.float_stack_ptr);
+    PyDict_SetItemString(dict, "stack_ptr", o);
+    Py_DECREF(o);
+    o = PyInt_FromLong((long)vmcpu.reg_float_control);
+    PyDict_SetItemString(dict, "float_control", o);
+    Py_DECREF(o);
+    return dict;
+}
+
+reg_float_dict float_dict[] = { {.name = "st0", .ptr = &(vmcpu.float_st0)},
+				{.name = "st1", .ptr = &(vmcpu.float_st1)},
+				{.name = "st2", .ptr = &(vmcpu.float_st2)},
+				{.name = "st3", .ptr = &(vmcpu.float_st3)},
+				{.name = "st4", .ptr = &(vmcpu.float_st4)},
+				{.name = "st5", .ptr = &(vmcpu.float_st5)},
+				{.name = "st6", .ptr = &(vmcpu.float_st6)},
+				{.name = "st7", .ptr = &(vmcpu.float_st7)},
+				{.name = "stack_ptr", .ptr = &(vmcpu.float_stack_ptr)},
+				{.name = "float_control", .ptr = &(vmcpu.reg_float_control)},
+};
+
+PyObject* _vm_set_float(PyObject *dict)
+{
+    PyObject *d_key, *d_value = NULL;
+    Py_ssize_t pos = 0;
+    double d;
+    unsigned int i, found;
+
+    if(!PyDict_Check(dict))
+	    RAISE(PyExc_TypeError, "arg must be dict");
+    while(PyDict_Next(dict, &pos, &d_key, &d_value)){
+	    if(!PyString_Check(d_key))
+		    RAISE(PyExc_TypeError, "key must be str");
+
+	    if (PyInt_Check(d_value)){
+		    d = (double)PyInt_AsLong(d_value);
+	    }
+	    else if (PyLong_Check(d_value)){
+		    d = (double)PyInt_AsUnsignedLongLongMask(d_value);
+	    }
+	    else if (PyFloat_Check(d_value)){
+		    d = PyFloat_AsDouble(d_value);
+	    }
+	    else{
+		    RAISE(PyExc_TypeError,"value must be int/long/float");
+	    }
+
+	    found = 0;
+	    for (i=0; i < sizeof(float_dict)/sizeof(reg_float_dict); i++){
+		    if (strcmp(PyString_AsString(d_key), float_dict[i].name))
+			    continue;
+		    if (!strncmp(float_dict[i].name, "st", 2))
+			    *((double*)float_dict[i].ptr) = d;
+		    else
+			    *((uint32_t*)float_dict[i].ptr) = (uint32_t)d;
+		    found = 1;
+		    break;
+	    }
+
+	    if (found)
+		    continue;
+	    fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key));
+	    RAISE(PyExc_ValueError, "unkown reg");
+    }
+    return NULL;
+}
+
+
 PyObject* _vm_add_memory_page(PyObject *item, PyObject *access, PyObject *item_str)
 {
     unsigned int buf_size;
@@ -348,21 +451,9 @@ PyObject* _vm_get_cpu_state(void)
 	return o;
 }
 
-PyObject*  _vm_set_cpu_state(PyObject * s_cpustate)
+PyObject*  _vm_set_cpu_state(char* buf, int buf_size)
 {
-	unsigned int buf_size;
-	Py_ssize_t length;
-	char* buf;
-
-	if(!PyString_Check(s_cpustate))
-		RAISE(PyExc_TypeError,"arg must be str");
-
-	buf_size = PyString_Size(s_cpustate);
-	if (buf_size != sizeof(vmcpu))
-		RAISE(PyExc_TypeError,"bad str len");
-
-	PyString_AsStringAndSize(s_cpustate, (char**)&buf, &length);
-	memcpy(&vmcpu, buf, length);
+	memcpy(&vmcpu, buf, sizeof(vmcpu));
 	return PyInt_FromLong((long)0);
 
 }
@@ -631,6 +722,24 @@ PyObject* vm_set_gpreg(PyObject *self, PyObject *args)
 
 }
 
+PyObject* vm_get_float(PyObject* self, PyObject* args)
+{
+    PyObject* p;
+    p = _vm_get_float();
+    return p;
+}
+
+PyObject* vm_set_float(PyObject *self, PyObject *args)
+{
+	PyObject* dict;
+	if (!PyArg_ParseTuple(args, "O", &dict))
+		return NULL;
+	_vm_set_float(dict);
+	Py_INCREF(Py_None);
+	return Py_None;
+
+}
+
 PyObject* init_memory_page_pool_py(PyObject* self, PyObject* args)
 {
     init_memory_page_pool();
@@ -763,17 +872,23 @@ PyObject* dump_code_bloc_pool_py(void)
 
 
 
-PyObject* vm_get_cpu_state(void)
+PyObject* vm_get_cpu_state(PyObject* self, PyObject* args)
 {
 	PyObject* o;
 	o = _vm_get_cpu_state();
 	return o;
 }
 
-PyObject*  vm_set_cpu_state(PyObject * s_cpustate)
+PyObject*  vm_set_cpu_state(PyObject* self, PyObject* args)
 {
 	PyObject *o;
-	o = _vm_set_cpu_state(s_cpustate);
+	char* buf;
+	int buf_size;
+
+	if (!PyArg_ParseTuple(args, "s#", &buf, &buf_size))
+		RAISE(PyExc_TypeError,"arg must be str");
+
+	o = _vm_set_cpu_state(buf, buf_size);
 	return o;
 }
 
@@ -962,6 +1077,10 @@ static PyMethodDef CodenatMethods[] = {
      "X"},
     {"vm_set_gpreg",vm_set_gpreg, METH_VARARGS,
      "X"},
+    {"vm_get_float", vm_get_float, METH_VARARGS,
+     "X"},
+    {"vm_set_float",vm_set_float, METH_VARARGS,
+     "X"},
     {"vm_init_regs",vm_init_regs, METH_VARARGS,
      "X"},
     {"dump_gpregs_py", dump_gpregs_py, METH_VARARGS,
@@ -1008,6 +1127,10 @@ static PyMethodDef CodenatMethods[] = {
      "X"},
     {"vm_get_memory_page_max_address",vm_get_memory_page_max_address, METH_VARARGS,
      "X"},
+    {"vm_get_cpu_state",vm_get_cpu_state, METH_VARARGS,
+     "X"},
+    {"vm_set_cpu_state",vm_set_cpu_state, METH_VARARGS,
+     "X"},
 
     {NULL, NULL, 0, NULL}        /* Sentinel */