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 { |