2 #include "../JitCore.h"
3 #include "structmember.h"
7 #include "../vm_mngr.h"
8 #include "../vm_mngr_py.h"
13 {.name =
"SP", .offset = offsetof(
vm_cpu_t,
SP)},
15 {.name =
"R3", .offset = offsetof(
vm_cpu_t,
R3)},
16 {.name =
"R4", .offset = offsetof(
vm_cpu_t,
R4)},
17 {.name =
"R5", .offset = offsetof(
vm_cpu_t,
R5)},
18 {.name =
"R6", .offset = offsetof(
vm_cpu_t,
R6)},
19 {.name =
"R7", .offset = offsetof(
vm_cpu_t,
R7)},
20 {.name =
"R8", .offset = offsetof(
vm_cpu_t,
R8)},
21 {.name =
"R9", .offset = offsetof(
vm_cpu_t,
R9)},
29 {.name =
"zf", .offset = offsetof(
vm_cpu_t,
zf)},
30 {.name =
"nf", .offset = offsetof(
vm_cpu_t,
nf)},
31 {.name =
"of", .offset = offsetof(
vm_cpu_t,
of)},
32 {.name =
"cf", .offset = offsetof(
vm_cpu_t,
cf)},
34 {.name =
"cpuoff", .offset = offsetof(
vm_cpu_t,
zf)},
35 {.name =
"gie", .offset = offsetof(
vm_cpu_t,
zf)},
36 {.name =
"osc", .offset = offsetof(
vm_cpu_t,
zf)},
37 {.name =
"scg0", .offset = offsetof(
vm_cpu_t,
zf)},
38 {.name =
"scg1", .offset = offsetof(
vm_cpu_t,
zf)},
39 {.name =
"res", .offset = offsetof(
vm_cpu_t,
zf)},
49 PyObject *dict = PyDict_New();
89 PyObject *d_key, *d_value = NULL;
92 unsigned int i, found;
94 if (!PyArg_ParseTuple(args,
"O", &dict))
96 if(!PyDict_Check(dict))
97 RAISE(PyExc_TypeError,
"arg must be dict");
98 while(PyDict_Next(dict, &pos, &d_key, &d_value)){
99 if(!PyString_Check(d_key))
100 RAISE(PyExc_TypeError,
"key must be str");
106 if (strcmp(PyString_AsString(d_key), gpreg_dict[i].
name))
108 *((uint32_t*)(((
char*)(
self->cpu)) + gpreg_dict[i].
offset)) = val;
115 fprintf(stderr,
"unkown key: %s\n", PyString_AsString(d_key));
116 RAISE(PyExc_ValueError,
"unkown reg");
127 memset(self->cpu, 0,
sizeof(
vm_cpu_t));
137 printf(
"PC %.4"PRIX32
" SP %.4"PRIX32
" R3 %.4"PRIX32
" ",
138 vmcpu->
PC, vmcpu->
SP, vmcpu->
R3);
139 printf(
"R4 %.4"PRIX32
" R5 %.4"PRIX32
" R6 %.4"PRIX32
" R7 %.4"PRIX32
"\n",
140 vmcpu->
R4, vmcpu->
R5, vmcpu->
R6, vmcpu->
R7);
141 printf(
"R8 %.4"PRIX32
" R9 %.4"PRIX32
" R10 %.4"PRIX32
" R11 %.4"PRIX32
" ",
142 vmcpu->
R8, vmcpu->
R9, vmcpu->
R10, vmcpu->
R11);
143 printf(
"R12 %.4"PRIX32
" R13 %.4"PRIX32
" R14 %.4"PRIX32
" R15 %.4"PRIX32
"\n",
145 printf(
"zf %.4"PRIX32
" nf %.4"PRIX32
" of %.4"PRIX32
" cf %.4"PRIX32
"\n",
146 vmcpu->
zf, vmcpu->
nf, vmcpu->
of, vmcpu->
cf);
166 if (!PyArg_ParseTuple(args,
"O", &item1))
171 ((
vm_cpu_t*)self->cpu)->exception_flags = i;
178 return PyLong_FromUnsignedLongLong((uint64_t)(((
vm_cpu_t*)self->cpu)->exception_flags));
191 result = PyObject_CallMethod(jitcpu->
jitter,
"automod_cb",
"LL", addr, size);
225 Py_ssize_t py_length;
232 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_buffer))
237 if(!PyString_Check(py_buffer))
238 RAISE(PyExc_TypeError,
"arg must be str");
240 size = PyString_Size(py_buffer);
241 PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
245 RAISE(PyExc_TypeError,
"arg must be str");
269 {
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
271 {
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
279 self->cpu = malloc(
sizeof(
vm_cpu_t));
280 if (self->cpu == NULL) {
281 fprintf(stderr,
"cannot alloc vm_cpu_t\n");
317 PyObject *dict = PyDict_New();
470 {
"PC" , (getter)JitCpu_get_PC , (setter)JitCpu_set_PC ,
"PC" , NULL},
471 {
"SP" , (getter)JitCpu_get_SP , (setter)JitCpu_set_SP ,
"SP" , NULL},
472 {
"R3" , (getter)JitCpu_get_R3 , (setter)JitCpu_set_R3 ,
"R3" , NULL},
473 {
"R4" , (getter)JitCpu_get_R4 , (setter)JitCpu_set_R4 ,
"R4" , NULL},
474 {
"R5" , (getter)JitCpu_get_R5 , (setter)JitCpu_set_R5 ,
"R5" , NULL},
475 {
"R6" , (getter)JitCpu_get_R6 , (setter)JitCpu_set_R6 ,
"R6" , NULL},
476 {
"R7" , (getter)JitCpu_get_R7 , (setter)JitCpu_set_R7 ,
"R7" , NULL},
477 {
"R8" , (getter)JitCpu_get_R8 , (setter)JitCpu_set_R8 ,
"R8" , NULL},
478 {
"R9" , (getter)JitCpu_get_R9 , (setter)JitCpu_set_R9 ,
"R9" , NULL},
479 {
"R10" , (getter)JitCpu_get_R10 , (setter)JitCpu_set_R10 ,
"R10" , NULL},
480 {
"R11" , (getter)JitCpu_get_R11 , (setter)JitCpu_set_R11 ,
"R11" , NULL},
481 {
"R12" , (getter)JitCpu_get_R12 , (setter)JitCpu_set_R12 ,
"R12" , NULL},
482 {
"R13" , (getter)JitCpu_get_R13 , (setter)JitCpu_set_R13 ,
"R13" , NULL},
483 {
"R14" , (getter)JitCpu_get_R14 , (setter)JitCpu_set_R14 ,
"R14" , NULL},
484 {
"R15" , (getter)JitCpu_get_R15 , (setter)JitCpu_set_R15 ,
"R15" , NULL},
485 {
"zf" , (getter)JitCpu_get_zf , (setter)JitCpu_set_zf ,
"zf" , NULL},
486 {
"nf" , (getter)JitCpu_get_nf , (setter)JitCpu_set_nf ,
"nf" , NULL},
487 {
"of" , (getter)JitCpu_get_of , (setter)JitCpu_set_of ,
"of" , NULL},
488 {
"cf" , (getter)JitCpu_get_cf , (setter)JitCpu_set_cf ,
"cf" , NULL},
489 {
"cpuoff" , (getter)JitCpu_get_cpuoff , (setter)JitCpu_set_cpuoff ,
"cpuoff" , NULL},
490 {
"gie" , (getter)JitCpu_get_gie , (setter)JitCpu_set_gie ,
"gie" , NULL},
491 {
"osc" , (getter)JitCpu_get_osc , (setter)JitCpu_set_osc ,
"osc" , NULL},
492 {
"scg0" , (getter)JitCpu_get_scg0 , (setter)JitCpu_set_scg0 ,
"scg0" , NULL},
493 {
"scg1" , (getter)JitCpu_get_scg1 , (setter)JitCpu_set_scg1 ,
"scg1" , NULL},
494 {
"res" , (getter)JitCpu_get_res , (setter)JitCpu_set_res ,
"res" , NULL},
502 PyObject_HEAD_INIT(NULL)
504 "JitCore_msp430.JitCpu",
522 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
551 {NULL, NULL, 0, NULL}
562 if (PyType_Ready(&JitCpuType) < 0)
565 m = Py_InitModule(
"JitCore_msp430", JitCore_msp430_Methods);
569 JitCore_msp430_Error = PyErr_NewException(
"JitCore_msp430.error", NULL, NULL);
570 Py_INCREF(JitCore_msp430_Error);
571 PyModule_AddObject(m,
"error", JitCore_msp430_Error);
573 Py_INCREF(&JitCpuType);
574 PyModule_AddObject(m,
"JitCpu", (PyObject *)&JitCpuType);
PyObject * cpu_set_gpreg(JitCpu *self, PyObject *args)
void MEM_WRITE_16(JitCpu *jitcpu, uint64_t addr, uint16_t src)
#define EXCEPT_CODE_AUTOMOD
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
PyObject * cpu_get_exception(JitCpu *self, PyObject *args)
PyObject * cpu_init_regs(JitCpu *self)
PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
static PyMethodDef JitCpu_methods[]
static PyTypeObject JitCpuType
PyObject * vm_get_mem(JitCpu *self, PyObject *args)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
void MEM_WRITE_32(JitCpu *jitcpu, uint64_t addr, uint32_t src)
PyObject * cpu_set_exception(JitCpu *self, PyObject *args)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
static PyMethodDef JitCore_msp430_Methods[]
PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure)
void vm_MEM_WRITE_16(vm_mngr_t *vm_mngr, uint64_t addr, unsigned short src)
PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure)
PyObject * get_gpreg_offset_all(void)
PyObject_HEAD PyObject * pyvm
void dump_gpregs(vm_cpu_t *vmcpu)
PyObject * vm_set_mem(JitCpu *self, PyObject *args)
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
void MEM_WRITE_08(JitCpu *jitcpu, uint64_t addr, uint8_t src)
PyObject * cpu_dump_gpregs(JitCpu *self, PyObject *args)
static PyGetSetDef JitCpu_getseters[]
void MEM_WRITE_64(JitCpu *jitcpu, uint64_t addr, uint64_t src)
static PyObject * JitCore_msp430_Error
void JitCpu_dealloc(JitCpu *self)
PyObject * cpu_get_gpreg(JitCpu *self)
PyMODINIT_FUNC initJitCore_msp430(void)
static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds)
static PyMemberDef JitCpu_members[]
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
PyObject * JitCpu_get_jitter(JitCpu *self, void *closure)