symbian-qemu-0.9.1-12/qemu-symbian-svp/python-plugin.c
branchnvmemory
changeset 74 eb3d0111f868
parent 62 99ca724f9829
equal deleted inserted replaced
73:b6aa150091ee 74:eb3d0111f868
     1 /*
     1 /*
     2 *
     2 *
     3 * Contributors:
     3 * Contributors:
     4 * NTT DOCOMO, INC. -- Syborg QEMU crashes when using skin + touchscreen device
     4 * NTT DOCOMO, INC. -- Syborg QEMU crashes when using skin + touchscreen device
       
     5 * 
       
     6 * Nokia Oyj -- New memregion service added for converting guest OS addresses to host OS addresses
     5 *
     7 *
     6 */
     8 */
     7 
     9 
     8 #include "Python.h"
    10 #include "Python.h"
     9 #include "structmember.h"
    11 #include "structmember.h"
   131     0,                                    /* tp_descr_set */
   133     0,                                    /* tp_descr_set */
   132     0,                                    /* tp_dictoffset */
   134     0,                                    /* tp_dictoffset */
   133     (initproc)qemu_py_ioregion_init,      /* tp_init */
   135     (initproc)qemu_py_ioregion_init,      /* tp_init */
   134     0,                                    /* tp_alloc */
   136     0,                                    /* tp_alloc */
   135     0,                                    /* tp_new */
   137     0,                                    /* tp_new */
       
   138 };
       
   139 
       
   140 typedef struct {
       
   141     PyObject_HEAD
       
   142     uint32_t base;
       
   143     uint32_t size;
       
   144 	uint32_t *host_ram_base_ptr;
       
   145 } qemu_py_memregion;
       
   146 
       
   147 static void qemu_py_memregion_dealloc(qemu_py_ioregion *self)
       
   148 	{
       
   149     self->ob_type->tp_free((PyObject*)self);
       
   150 	}
       
   151 
       
   152 static int qemu_py_memregion_init(qemu_py_memregion *self, PyObject *args,
       
   153                                  PyObject *kwds)
       
   154 	{
       
   155     static char *kwlist[] = {"base","size", NULL};
       
   156     uint32_t base;
       
   157     uint32_t size;
       
   158 	int ret = -1;
       
   159 	int region_index = 0;
       
   160 
       
   161     if (!PyArg_ParseTupleAndKeywords(args, kwds, "ll", kwlist,
       
   162                                      &base, &size ))
       
   163 		{
       
   164         ret = -1; 
       
   165 		}
       
   166 	else
       
   167 		{
       
   168 		for( region_index = 0; region_index < devtree_ram_map_size; region_index+=1 )
       
   169 			{
       
   170 			// The created region needs to fit inside memory regions in device tree configuration
       
   171 			if( (devtree_ram_map[region_index].base <= base) && 
       
   172 				((devtree_ram_map[region_index].base + devtree_ram_map[region_index].size) >=
       
   173 				(base + size)) )
       
   174 				{
       
   175 				ret = 0;
       
   176 				self->base = base;
       
   177 				self->size = size;
       
   178 				self->host_ram_base_ptr = (uint32_t*)host_ram_addr(base);
       
   179 				break;
       
   180 				}
       
   181 			else
       
   182 				{
       
   183 				ret = -1;
       
   184 				}
       
   185 			}
       
   186 		}
       
   187 	
       
   188     return ret;
       
   189 	}
       
   190 
       
   191 static PyObject *qemu_py_memregion_get_size(qemu_py_memregion *self,
       
   192                                     PyObject *args, PyObject *kwds)
       
   193 	{
       
   194 	return PyLong_FromUnsignedLong(self->size);
       
   195 	}
       
   196 
       
   197 static PyObject *qemu_py_memregion_get_base(qemu_py_memregion *self,
       
   198                                     PyObject *args, PyObject *kwds)
       
   199 	{
       
   200 	return PyLong_FromUnsignedLong(self->base);
       
   201 	}
       
   202 
       
   203 static PyObject *qemu_py_memregion_get_host_base(qemu_py_memregion *self,
       
   204                                     PyObject *args, PyObject *kwds)
       
   205 	{
       
   206 	return PyLong_FromVoidPtr( (void*)(self->host_ram_base_ptr) );
       
   207 	}
       
   208 
       
   209 static PyMethodDef qemu_py_memregion_methods[] = {
       
   210     {"size", (PyCFunction)qemu_py_memregion_get_size, METH_VARARGS|METH_KEYWORDS,
       
   211      "Get memory region size"},
       
   212     {"region_guest_addr", (PyCFunction)qemu_py_memregion_get_base, METH_VARARGS|METH_KEYWORDS,
       
   213      "Get memory region base"},
       
   214     {"region_host_addr", (PyCFunction)qemu_py_memregion_get_host_base, METH_VARARGS|METH_KEYWORDS,
       
   215      "Get memory region host base address"},
       
   216     {NULL}  /* Sentinel */
       
   217 };
       
   218 
       
   219 static PyTypeObject qemu_py_memRegionType = {
       
   220     PyObject_HEAD_INIT(NULL)
       
   221     0,                                      /* ob_size */
       
   222     "qemu.memregion",                       /* tp_name */
       
   223     sizeof(qemu_py_memregion),              /* tp_basicsize */
       
   224     0,                                      /* tp_itemsize */
       
   225     (destructor)qemu_py_memregion_dealloc,  /* tp_dealloc */
       
   226     0,                                      /* tp_print */
       
   227     0,                                      /* tp_getattr */
       
   228     0,                                      /* tp_setattr */
       
   229     0,                                      /* tp_compare */
       
   230     0,                                      /* tp_repr */
       
   231     0,                                      /* tp_as_number */
       
   232     0,                                      /* tp_as_sequence */
       
   233     0,                                      /* tp_as_mapping */
       
   234     0,                                      /* tp_hash  */
       
   235     0,                                      /* tp_call */
       
   236     0,                                      /* tp_str */
       
   237     0,                                      /* tp_getattro */
       
   238     0,                                      /* tp_setattro */
       
   239     0,                                      /* tp_as_buffer */
       
   240     Py_TPFLAGS_DEFAULT,                     /* tp_flags */
       
   241     "QEMU MemRegion",                       /* tp_doc */
       
   242     0,                                      /* tp_traverse */
       
   243     0,                                      /* tp_clear */
       
   244     0,		                                /* tp_richcompare */
       
   245     0,		                                /* tp_weaklistoffset */
       
   246     0,		                                /* tp_iter */
       
   247     0,		                                /* tp_iternext */
       
   248     qemu_py_memregion_methods,              /* tp_methods */
       
   249     0,                                      /* tp_members */
       
   250     0,                                      /* tp_getset */
       
   251     0,                                      /* tp_base */
       
   252     0,                                      /* tp_dict */
       
   253     0,                                      /* tp_descr_get */
       
   254     0,                                      /* tp_descr_set */
       
   255     0,                                      /* tp_dictoffset */
       
   256     (initproc)qemu_py_memregion_init,       /* tp_init */
       
   257     0,                                      /* tp_alloc */
       
   258     0,                                      /* tp_new */
   136 };
   259 };
   137 
   260 
   138 typedef struct {
   261 typedef struct {
   139     PyObject_HEAD
   262     PyObject_HEAD
   140     QEMUFile *f;
   263     QEMUFile *f;
  1927     qemu_py_add_class(m, "chardev", &qemu_py_chardevType);
  2050     qemu_py_add_class(m, "chardev", &qemu_py_chardevType);
  1928     qemu_py_add_class(m, "render", &qemu_py_renderType);
  2051     qemu_py_add_class(m, "render", &qemu_py_renderType);
  1929     qemu_py_add_class(m, "palette", &qemu_py_paletteType);
  2052     qemu_py_add_class(m, "palette", &qemu_py_paletteType);
  1930     qemu_py_add_class(m, "ptimer", &qemu_py_ptimerType);
  2053     qemu_py_add_class(m, "ptimer", &qemu_py_ptimerType);
  1931     qemu_py_add_class(m, "file", &qemu_py_fileType);
  2054     qemu_py_add_class(m, "file", &qemu_py_fileType);
       
  2055     qemu_py_add_class(m, "memregion", &qemu_py_memRegionType);
  1932 }
  2056 }
  1933 
  2057 
  1934 #define PLUGIN_INIT_SCRIPT "import sys\nsys.path.insert(0, \"%s/plugins\")"
  2058 #define PLUGIN_INIT_SCRIPT "import sys\nsys.path.insert(0, \"%s/plugins\")"
  1935 void qemu_python_init(char *argv0)
  2059 void qemu_python_init(char *argv0)
  1936 {
  2060 {