symbian-qemu-0.9.1-12/qemu-symbian-svp/python-plugin.c
branchnvmemory
changeset 74 eb3d0111f868
parent 62 99ca724f9829
--- a/symbian-qemu-0.9.1-12/qemu-symbian-svp/python-plugin.c	Fri May 14 16:38:13 2010 +0100
+++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/python-plugin.c	Thu May 27 00:38:17 2010 +0300
@@ -2,6 +2,8 @@
 *
 * Contributors:
 * NTT DOCOMO, INC. -- Syborg QEMU crashes when using skin + touchscreen device
+* 
+* Nokia Oyj -- New memregion service added for converting guest OS addresses to host OS addresses
 *
 */
 
@@ -137,6 +139,127 @@
 
 typedef struct {
     PyObject_HEAD
+    uint32_t base;
+    uint32_t size;
+	uint32_t *host_ram_base_ptr;
+} qemu_py_memregion;
+
+static void qemu_py_memregion_dealloc(qemu_py_ioregion *self)
+	{
+    self->ob_type->tp_free((PyObject*)self);
+	}
+
+static int qemu_py_memregion_init(qemu_py_memregion *self, PyObject *args,
+                                 PyObject *kwds)
+	{
+    static char *kwlist[] = {"base","size", NULL};
+    uint32_t base;
+    uint32_t size;
+	int ret = -1;
+	int region_index = 0;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "ll", kwlist,
+                                     &base, &size ))
+		{
+        ret = -1; 
+		}
+	else
+		{
+		for( region_index = 0; region_index < devtree_ram_map_size; region_index+=1 )
+			{
+			// The created region needs to fit inside memory regions in device tree configuration
+			if( (devtree_ram_map[region_index].base <= base) && 
+				((devtree_ram_map[region_index].base + devtree_ram_map[region_index].size) >=
+				(base + size)) )
+				{
+				ret = 0;
+				self->base = base;
+				self->size = size;
+				self->host_ram_base_ptr = (uint32_t*)host_ram_addr(base);
+				break;
+				}
+			else
+				{
+				ret = -1;
+				}
+			}
+		}
+	
+    return ret;
+	}
+
+static PyObject *qemu_py_memregion_get_size(qemu_py_memregion *self,
+                                    PyObject *args, PyObject *kwds)
+	{
+	return PyLong_FromUnsignedLong(self->size);
+	}
+
+static PyObject *qemu_py_memregion_get_base(qemu_py_memregion *self,
+                                    PyObject *args, PyObject *kwds)
+	{
+	return PyLong_FromUnsignedLong(self->base);
+	}
+
+static PyObject *qemu_py_memregion_get_host_base(qemu_py_memregion *self,
+                                    PyObject *args, PyObject *kwds)
+	{
+	return PyLong_FromVoidPtr( (void*)(self->host_ram_base_ptr) );
+	}
+
+static PyMethodDef qemu_py_memregion_methods[] = {
+    {"size", (PyCFunction)qemu_py_memregion_get_size, METH_VARARGS|METH_KEYWORDS,
+     "Get memory region size"},
+    {"region_guest_addr", (PyCFunction)qemu_py_memregion_get_base, METH_VARARGS|METH_KEYWORDS,
+     "Get memory region base"},
+    {"region_host_addr", (PyCFunction)qemu_py_memregion_get_host_base, METH_VARARGS|METH_KEYWORDS,
+     "Get memory region host base address"},
+    {NULL}  /* Sentinel */
+};
+
+static PyTypeObject qemu_py_memRegionType = {
+    PyObject_HEAD_INIT(NULL)
+    0,                                      /* ob_size */
+    "qemu.memregion",                       /* tp_name */
+    sizeof(qemu_py_memregion),              /* tp_basicsize */
+    0,                                      /* tp_itemsize */
+    (destructor)qemu_py_memregion_dealloc,  /* tp_dealloc */
+    0,                                      /* tp_print */
+    0,                                      /* tp_getattr */
+    0,                                      /* tp_setattr */
+    0,                                      /* tp_compare */
+    0,                                      /* tp_repr */
+    0,                                      /* tp_as_number */
+    0,                                      /* tp_as_sequence */
+    0,                                      /* tp_as_mapping */
+    0,                                      /* tp_hash  */
+    0,                                      /* tp_call */
+    0,                                      /* tp_str */
+    0,                                      /* tp_getattro */
+    0,                                      /* tp_setattro */
+    0,                                      /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT,                     /* tp_flags */
+    "QEMU MemRegion",                       /* tp_doc */
+    0,                                      /* tp_traverse */
+    0,                                      /* tp_clear */
+    0,		                                /* tp_richcompare */
+    0,		                                /* tp_weaklistoffset */
+    0,		                                /* tp_iter */
+    0,		                                /* tp_iternext */
+    qemu_py_memregion_methods,              /* tp_methods */
+    0,                                      /* tp_members */
+    0,                                      /* tp_getset */
+    0,                                      /* tp_base */
+    0,                                      /* tp_dict */
+    0,                                      /* tp_descr_get */
+    0,                                      /* tp_descr_set */
+    0,                                      /* tp_dictoffset */
+    (initproc)qemu_py_memregion_init,       /* tp_init */
+    0,                                      /* tp_alloc */
+    0,                                      /* tp_new */
+};
+
+typedef struct {
+    PyObject_HEAD
     QEMUFile *f;
 } qemu_py_file;
 
@@ -1929,6 +2052,7 @@
     qemu_py_add_class(m, "palette", &qemu_py_paletteType);
     qemu_py_add_class(m, "ptimer", &qemu_py_ptimerType);
     qemu_py_add_class(m, "file", &qemu_py_fileType);
+    qemu_py_add_class(m, "memregion", &qemu_py_memRegionType);
 }
 
 #define PLUGIN_INIT_SCRIPT "import sys\nsys.path.insert(0, \"%s/plugins\")"