2 #include "../JitCore.h"
3 #include "structmember.h"
7 #include "../vm_mngr.h"
8 #include "../vm_mngr_py.h"
14 {.name =
"R1", .offset = offsetof(
vm_cpu_t,
R1)},
15 {.name =
"R2", .offset = offsetof(
vm_cpu_t,
R2)},
16 {.name =
"R3", .offset = offsetof(
vm_cpu_t,
R3)},
17 {.name =
"R4", .offset = offsetof(
vm_cpu_t,
R4)},
18 {.name =
"R5", .offset = offsetof(
vm_cpu_t,
R5)},
19 {.name =
"R6", .offset = offsetof(
vm_cpu_t,
R6)},
20 {.name =
"R7", .offset = offsetof(
vm_cpu_t,
R7)},
21 {.name =
"R8", .offset = offsetof(
vm_cpu_t,
R8)},
22 {.name =
"R9", .offset = offsetof(
vm_cpu_t,
R9)},
26 {.name =
"SP", .offset = offsetof(
vm_cpu_t,
SP)},
27 {.name =
"LR", .offset = offsetof(
vm_cpu_t,
LR)},
28 {.name =
"PC", .offset = offsetof(
vm_cpu_t,
PC)},
30 {.name =
"zf", .offset = offsetof(
vm_cpu_t,
zf)},
31 {.name =
"nf", .offset = offsetof(
vm_cpu_t,
nf)},
32 {.name =
"of", .offset = offsetof(
vm_cpu_t,
of)},
33 {.name =
"cf", .offset = offsetof(
vm_cpu_t,
cf)},
43 PyObject *dict = PyDict_New();
76 PyObject *d_key, *d_value = NULL;
79 unsigned int i, found;
81 if (!PyArg_ParseTuple(args,
"O", &dict))
83 if(!PyDict_Check(dict))
84 RAISE(PyExc_TypeError,
"arg must be dict");
85 while(PyDict_Next(dict, &pos, &d_key, &d_value)){
86 if(!PyString_Check(d_key))
87 RAISE(PyExc_TypeError,
"key must be str");
93 if (strcmp(PyString_AsString(d_key), gpreg_dict[i].
name))
95 *((uint32_t*)(((
char*)(
self->cpu)) + gpreg_dict[i].
offset)) = val;
102 fprintf(stderr,
"unkown key: %s\n", PyString_AsString(d_key));
103 RAISE(PyExc_ValueError,
"unkown reg");
112 memset(self->cpu, 0,
sizeof(
vm_cpu_t));
120 printf(
"R0 %.16"PRIX32
" R1 %.16"PRIX32
" R2 %.16"PRIX32
" R3 %.16"PRIX32
"\n",
121 vmcpu->
R0, vmcpu->
R1, vmcpu->
R2, vmcpu->
R3);
122 printf(
"R4 %.16"PRIX32
" R5 %.16"PRIX32
" R6 %.16"PRIX32
" R7 %.16"PRIX32
"\n",
123 vmcpu->
R4, vmcpu->
R5, vmcpu->
R6, vmcpu->
R7);
124 printf(
"R8 %.16"PRIX32
" R9 %.16"PRIX32
" R10 %.16"PRIX32
" R11 %.16"PRIX32
"\n",
125 vmcpu->
R8, vmcpu->
R9, vmcpu->
R10, vmcpu->
R11);
126 printf(
"R12 %.16"PRIX32
" SP %.16"PRIX32
" LR %.16"PRIX32
" PC %.16"PRIX32
"\n",
127 vmcpu->
R12, vmcpu->
SP, vmcpu->
LR, vmcpu->
PC);
128 printf(
"zf %.16"PRIX32
" nf %.16"PRIX32
" of %.16"PRIX32
" cf %.16"PRIX32
"\n",
129 vmcpu->
zf, vmcpu->
nf, vmcpu->
of, vmcpu->
cf);
149 if (!PyArg_ParseTuple(args,
"O", &item1))
154 ((
vm_cpu_t*)self->cpu)->exception_flags = i;
161 return PyLong_FromUnsignedLongLong((uint64_t)(((
vm_cpu_t*)self->cpu)->exception_flags));
174 result = PyObject_CallMethod(jitcpu->
jitter,
"automod_cb",
"LL", addr, size);
212 Py_ssize_t py_length;
219 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_buffer))
224 if(!PyString_Check(py_buffer))
225 RAISE(PyExc_TypeError,
"arg must be str");
227 size = PyString_Size(py_buffer);
228 PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
232 RAISE(PyExc_TypeError,
"arg must be str");
256 {
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
258 {
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
266 self->cpu = malloc(
sizeof(
vm_cpu_t));
267 if (self->cpu == NULL) {
268 fprintf(stderr,
"cannot alloc vm_cpu_t\n");
299 PyObject *dict = PyDict_New();
456 {
"R0" , (getter)JitCpu_get_R0 , (setter)JitCpu_set_R0 ,
"R0" , NULL},
457 {
"R1" , (getter)JitCpu_get_R1 , (setter)JitCpu_set_R1 ,
"R1" , NULL},
458 {
"R2" , (getter)JitCpu_get_R2 , (setter)JitCpu_set_R2 ,
"R2" , NULL},
459 {
"R3" , (getter)JitCpu_get_R3 , (setter)JitCpu_set_R3 ,
"R3" , NULL},
460 {
"R4" , (getter)JitCpu_get_R4 , (setter)JitCpu_set_R4 ,
"R4" , NULL},
461 {
"R5" , (getter)JitCpu_get_R5 , (setter)JitCpu_set_R5 ,
"R5" , NULL},
462 {
"R6" , (getter)JitCpu_get_R6 , (setter)JitCpu_set_R6 ,
"R6" , NULL},
463 {
"R7" , (getter)JitCpu_get_R7 , (setter)JitCpu_set_R7 ,
"R7" , NULL},
464 {
"R8" , (getter)JitCpu_get_R8 , (setter)JitCpu_set_R8 ,
"R8" , NULL},
465 {
"R9" , (getter)JitCpu_get_R9 , (setter)JitCpu_set_R9 ,
"R9" , NULL},
466 {
"R10", (getter)JitCpu_get_R10, (setter)JitCpu_set_R10,
"R10", NULL},
467 {
"R11", (getter)JitCpu_get_R11, (setter)JitCpu_set_R11,
"R11", NULL},
468 {
"R12", (getter)JitCpu_get_R12, (setter)JitCpu_set_R12,
"R12", NULL},
469 {
"SP" , (getter)JitCpu_get_SP , (setter)JitCpu_set_SP ,
"SP" , NULL},
470 {
"LR" , (getter)JitCpu_get_LR , (setter)JitCpu_set_LR ,
"LR" , NULL},
471 {
"PC" , (getter)JitCpu_get_PC , (setter)JitCpu_set_PC ,
"PC" , NULL},
473 {
"zf", (getter)JitCpu_get_zf, (setter)JitCpu_set_zf,
"zf", NULL},
474 {
"nf", (getter)JitCpu_get_nf, (setter)JitCpu_set_nf,
"nf", NULL},
475 {
"of", (getter)JitCpu_get_of, (setter)JitCpu_set_of,
"of", NULL},
476 {
"cf", (getter)JitCpu_get_cf, (setter)JitCpu_set_cf,
"cf", NULL},
483 PyObject_HEAD_INIT(NULL)
485 "JitCore_arm.JitCpu",
503 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
532 {NULL, NULL, 0, NULL}
543 if (PyType_Ready(&JitCpuType) < 0)
546 m = Py_InitModule(
"JitCore_arm", JitCore_arm_Methods);
550 JitCore_arm_Error = PyErr_NewException(
"JitCore_arm.error", NULL, NULL);
551 Py_INCREF(JitCore_arm_Error);
552 PyModule_AddObject(m,
"error", JitCore_arm_Error);
554 Py_INCREF(&JitCpuType);
555 PyModule_AddObject(m,
"JitCpu", (PyObject *)&JitCpuType);
static PyMethodDef JitCore_arm_Methods[]
#define EXCEPT_CODE_AUTOMOD
static PyMethodDef JitCpu_methods[]
static PyTypeObject JitCpuType
PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
void MEM_WRITE_16(JitCpu *jitcpu, uint64_t addr, uint16_t src)
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
void MEM_WRITE_64(JitCpu *jitcpu, uint64_t addr, uint64_t src)
void dump_gpregs(vm_cpu_t *vmcpu)
PyObject * vm_get_mem(JitCpu *self, PyObject *args)
static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds)
static PyGetSetDef JitCpu_getseters[]
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
PyObject * cpu_init_regs(JitCpu *self)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
void MEM_WRITE_32(JitCpu *jitcpu, uint64_t addr, uint32_t src)
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)
static PyMemberDef JitCpu_members[]
PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure)
PyObject_HEAD PyObject * pyvm
static PyObject * JitCore_arm_Error
PyObject * cpu_dump_gpregs(JitCpu *self, PyObject *args)
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
PyMODINIT_FUNC initJitCore_arm(void)
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
PyObject * cpu_get_gpreg(JitCpu *self)
PyObject * get_gpreg_offset_all(void)
void MEM_WRITE_08(JitCpu *jitcpu, uint64_t addr, uint8_t src)
void JitCpu_dealloc(JitCpu *self)
PyObject * vm_set_mem(JitCpu *self, PyObject *args)
PyObject * cpu_set_exception(JitCpu *self, PyObject *args)
PyObject * cpu_set_gpreg(JitCpu *self, PyObject *args)
PyObject * cpu_get_exception(JitCpu *self, PyObject *args)
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
PyObject * JitCpu_get_jitter(JitCpu *self, void *closure)