diff -r b6aa150091ee -r eb3d0111f868 symbian-qemu-0.9.1-12/qemu-symbian-svp/python-plugin.c --- 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\")"