2 #include "../JitCore.h"
3 #include "structmember.h"
7 #include "../vm_mngr.h"
8 #include "../vm_mngr_py.h"
15 {.name =
"X1", .offset = offsetof(
vm_cpu_t, X1)},
16 {.name =
"X2", .offset = offsetof(
vm_cpu_t, X2)},
17 {.name =
"X3", .offset = offsetof(
vm_cpu_t, X3)},
18 {.name =
"X4", .offset = offsetof(
vm_cpu_t, X4)},
19 {.name =
"X5", .offset = offsetof(
vm_cpu_t, X5)},
20 {.name =
"X6", .offset = offsetof(
vm_cpu_t, X6)},
21 {.name =
"X7", .offset = offsetof(
vm_cpu_t, X7)},
22 {.name =
"X8", .offset = offsetof(
vm_cpu_t, X8)},
23 {.name =
"X9", .offset = offsetof(
vm_cpu_t, X9)},
24 {.name =
"X10", .offset = offsetof(
vm_cpu_t, X10)},
25 {.name =
"X11", .offset = offsetof(
vm_cpu_t, X11)},
26 {.name =
"X12", .offset = offsetof(
vm_cpu_t, X12)},
27 {.name =
"X13", .offset = offsetof(
vm_cpu_t, X13)},
28 {.name =
"X14", .offset = offsetof(
vm_cpu_t, X14)},
29 {.name =
"X15", .offset = offsetof(
vm_cpu_t, X15)},
30 {.name =
"X16", .offset = offsetof(
vm_cpu_t, X16)},
31 {.name =
"X17", .offset = offsetof(
vm_cpu_t, X17)},
32 {.name =
"X18", .offset = offsetof(
vm_cpu_t, X18)},
33 {.name =
"X19", .offset = offsetof(
vm_cpu_t, X19)},
34 {.name =
"X20", .offset = offsetof(
vm_cpu_t, X20)},
35 {.name =
"X21", .offset = offsetof(
vm_cpu_t, X21)},
36 {.name =
"X22", .offset = offsetof(
vm_cpu_t, X22)},
37 {.name =
"X23", .offset = offsetof(
vm_cpu_t, X23)},
38 {.name =
"X24", .offset = offsetof(
vm_cpu_t, X24)},
39 {.name =
"X25", .offset = offsetof(
vm_cpu_t, X25)},
40 {.name =
"X26", .offset = offsetof(
vm_cpu_t, X26)},
41 {.name =
"X27", .offset = offsetof(
vm_cpu_t, X27)},
42 {.name =
"X28", .offset = offsetof(
vm_cpu_t, X28)},
43 {.name =
"X29", .offset = offsetof(
vm_cpu_t, X29)},
44 {.name =
"LR", .offset = offsetof(
vm_cpu_t,
LR)},
46 {.name =
"SP", .offset = offsetof(
vm_cpu_t,
SP)},
47 {.name =
"PC", .offset = offsetof(
vm_cpu_t,
PC)},
49 {.name =
"zf", .offset = offsetof(
vm_cpu_t,
zf)},
50 {.name =
"nf", .offset = offsetof(
vm_cpu_t,
nf)},
51 {.name =
"of", .offset = offsetof(
vm_cpu_t,
of)},
52 {.name =
"cf", .offset = offsetof(
vm_cpu_t,
cf)},
62 PyObject *dict = PyDict_New();
112 PyObject *d_key, *d_value = NULL;
115 unsigned int i, found;
117 if (!PyArg_ParseTuple(args,
"O", &dict))
119 if(!PyDict_Check(dict))
120 RAISE(PyExc_TypeError,
"arg must be dict");
121 while(PyDict_Next(dict, &pos, &d_key, &d_value)){
122 if(!PyString_Check(d_key))
123 RAISE(PyExc_TypeError,
"key must be str");
129 if (strcmp(PyString_AsString(d_key), gpreg_dict[i].
name))
131 *((uint32_t*)(((
char*)(
self->cpu)) + gpreg_dict[i].
offset)) = val;
138 fprintf(stderr,
"unkown key: %s\n", PyString_AsString(d_key));
139 RAISE(PyExc_ValueError,
"unkown reg");
148 memset(self->cpu, 0,
sizeof(
vm_cpu_t));
156 printf(
"X0 %.16"PRIX64
" X1 %.16"PRIX64
" X2 %.16"PRIX64
" X3 %.16"PRIX64
" "\
157 "X4 %.16"PRIX64
" X5 %.16"PRIX64
" X6 %.16"PRIX64
" X7 %.16"PRIX64
"\n",
158 vmcpu->
X0, vmcpu->
X1, vmcpu->
X2, vmcpu->
X3, vmcpu->
X4, vmcpu->
X5, vmcpu->
X6, vmcpu->
X7);
159 printf(
"X8 %.16"PRIX64
" X9 %.16"PRIX64
" X10 %.16"PRIX64
" X11 %.16"PRIX64
" "\
160 "X12 %.16"PRIX64
" X13 %.16"PRIX64
" X14 %.16"PRIX64
" X15 %.16"PRIX64
"\n",
163 printf(
"X16 %.16"PRIX64
" X17 %.16"PRIX64
" X18 %.16"PRIX64
" X19 %.16"PRIX64
" "\
164 "X20 %.16"PRIX64
" X21 %.16"PRIX64
" X22 %.16"PRIX64
" X23 %.16"PRIX64
"\n",
167 printf(
"X24 %.16"PRIX64
" X25 %.16"PRIX64
" X26 %.16"PRIX64
" X27 %.16"PRIX64
" "\
168 "X28 %.16"PRIX64
" X29 %.16"PRIX64
" LR %.16"PRIX64
"\n",
173 printf(
"SP %.16"PRIX64
" PC %.16"PRIX64
" "\
174 "zf %.16"PRIX32
" nf %.16"PRIX32
" of %.16"PRIX32
" cf %.16"PRIX32
"\n",
175 vmcpu->
SP, vmcpu->
PC,
176 vmcpu->
zf, vmcpu->
nf, vmcpu->
of, vmcpu->
cf);
196 if (!PyArg_ParseTuple(args,
"O", &item1))
201 ((
vm_cpu_t*)self->cpu)->exception_flags = i;
208 return PyLong_FromUnsignedLongLong((uint64_t)(((
vm_cpu_t*)self->cpu)->exception_flags));
221 result = PyObject_CallMethod(jitcpu->
jitter,
"automod_cb",
"LL", addr, size);
259 Py_ssize_t py_length;
266 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_buffer))
271 if(!PyString_Check(py_buffer))
272 RAISE(PyExc_TypeError,
"arg must be str");
274 size = PyString_Size(py_buffer);
275 PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
279 RAISE(PyExc_TypeError,
"arg must be str");
322 {
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
324 {
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
332 self->cpu = malloc(
sizeof(
vm_cpu_t));
333 if (self->cpu == NULL) {
334 fprintf(stderr,
"cannot alloc vm_cpu_t\n");
385 PyObject *dict = PyDict_New();
578 {
"X0" , (getter)JitCpu_get_X0 , (setter)JitCpu_set_X0 ,
"X0" , NULL},
579 {
"X1" , (getter)JitCpu_get_X1 , (setter)JitCpu_set_X1 ,
"X1" , NULL},
580 {
"X2" , (getter)JitCpu_get_X2 , (setter)JitCpu_set_X2 ,
"X2" , NULL},
581 {
"X3" , (getter)JitCpu_get_X3 , (setter)JitCpu_set_X3 ,
"X3" , NULL},
582 {
"X4" , (getter)JitCpu_get_X4 , (setter)JitCpu_set_X4 ,
"X4" , NULL},
583 {
"X5" , (getter)JitCpu_get_X5 , (setter)JitCpu_set_X5 ,
"X5" , NULL},
584 {
"X6" , (getter)JitCpu_get_X6 , (setter)JitCpu_set_X6 ,
"X6" , NULL},
585 {
"X7" , (getter)JitCpu_get_X7 , (setter)JitCpu_set_X7 ,
"X7" , NULL},
586 {
"X8" , (getter)JitCpu_get_X8 , (setter)JitCpu_set_X8 ,
"X8" , NULL},
587 {
"X9" , (getter)JitCpu_get_X9 , (setter)JitCpu_set_X9 ,
"X9" , NULL},
589 {
"X10" , (getter)JitCpu_get_X10 , (setter)JitCpu_set_X10 ,
"X10" , NULL},
590 {
"X11" , (getter)JitCpu_get_X11 , (setter)JitCpu_set_X11 ,
"X11" , NULL},
591 {
"X12" , (getter)JitCpu_get_X12 , (setter)JitCpu_set_X12 ,
"X12" , NULL},
592 {
"X13" , (getter)JitCpu_get_X13 , (setter)JitCpu_set_X13 ,
"X13" , NULL},
593 {
"X14" , (getter)JitCpu_get_X14 , (setter)JitCpu_set_X14 ,
"X14" , NULL},
594 {
"X15" , (getter)JitCpu_get_X15 , (setter)JitCpu_set_X15 ,
"X15" , NULL},
595 {
"X16" , (getter)JitCpu_get_X16 , (setter)JitCpu_set_X16 ,
"X16" , NULL},
596 {
"X17" , (getter)JitCpu_get_X17 , (setter)JitCpu_set_X17 ,
"X17" , NULL},
597 {
"X18" , (getter)JitCpu_get_X18 , (setter)JitCpu_set_X18 ,
"X18" , NULL},
598 {
"X19" , (getter)JitCpu_get_X19 , (setter)JitCpu_set_X19 ,
"X19" , NULL},
600 {
"X20" , (getter)JitCpu_get_X20 , (setter)JitCpu_set_X20 ,
"X20" , NULL},
601 {
"X21" , (getter)JitCpu_get_X21 , (setter)JitCpu_set_X21 ,
"X21" , NULL},
602 {
"X22" , (getter)JitCpu_get_X22 , (setter)JitCpu_set_X22 ,
"X22" , NULL},
603 {
"X23" , (getter)JitCpu_get_X23 , (setter)JitCpu_set_X23 ,
"X23" , NULL},
604 {
"X24" , (getter)JitCpu_get_X24 , (setter)JitCpu_set_X24 ,
"X24" , NULL},
605 {
"X25" , (getter)JitCpu_get_X25 , (setter)JitCpu_set_X25 ,
"X25" , NULL},
606 {
"X26" , (getter)JitCpu_get_X26 , (setter)JitCpu_set_X26 ,
"X26" , NULL},
607 {
"X27" , (getter)JitCpu_get_X27 , (setter)JitCpu_set_X27 ,
"X27" , NULL},
608 {
"X28" , (getter)JitCpu_get_X28 , (setter)JitCpu_set_X28 ,
"X28" , NULL},
609 {
"X29" , (getter)JitCpu_get_X29 , (setter)JitCpu_set_X29 ,
"X29" , NULL},
611 {
"LR" , (getter)JitCpu_get_LR , (setter)JitCpu_set_LR ,
"LR" , NULL},
615 {
"SP" , (getter)JitCpu_get_SP , (setter)JitCpu_set_SP ,
"SP" , NULL},
616 {
"PC" , (getter)JitCpu_get_PC , (setter)JitCpu_set_PC ,
"PC" , NULL},
618 {
"zf", (getter)JitCpu_get_zf, (setter)JitCpu_set_zf,
"zf", NULL},
619 {
"nf", (getter)JitCpu_get_nf, (setter)JitCpu_set_nf,
"nf", NULL},
620 {
"of", (getter)JitCpu_get_of, (setter)JitCpu_set_of,
"of", NULL},
621 {
"cf", (getter)JitCpu_get_cf, (setter)JitCpu_set_cf,
"cf", NULL},
628 PyObject_HEAD_INIT(NULL)
630 "JitCore_aarch64.JitCpu",
648 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
673 {NULL, NULL, 0, NULL}
684 if (PyType_Ready(&JitCpuType) < 0)
687 m = Py_InitModule(
"JitCore_aarch64", JitCore_aarch64_Methods);
691 JitCore_aarch64_Error = PyErr_NewException(
"JitCore_aarch64.error", NULL, NULL);
692 Py_INCREF(JitCore_aarch64_Error);
693 PyModule_AddObject(m,
"error", JitCore_aarch64_Error);
695 Py_INCREF(&JitCpuType);
696 PyModule_AddObject(m,
"JitCpu", (PyObject *)&JitCpuType);
#define EXCEPT_CODE_AUTOMOD
void MEM_WRITE_16(JitCpu *jitcpu, uint64_t addr, uint16_t src)
PyObject * vm_set_mem(JitCpu *self, PyObject *args)
static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds)
PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
static PyGetSetDef JitCpu_getseters[]
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)
PyObject * cpu_set_exception(JitCpu *self, PyObject *args)
static PyTypeObject JitCpuType
PyMODINIT_FUNC initJitCore_aarch64(void)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
static PyObject * JitCore_aarch64_Error
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_HEAD PyObject * pyvm
PyObject * cpu_init_regs(JitCpu *self)
PyObject * cpu_get_gpreg(JitCpu *self)
PyObject * cpu_get_exception(JitCpu *self, PyObject *args)
void MEM_WRITE_32(JitCpu *jitcpu, uint64_t addr, uint32_t src)
static PyMemberDef JitCpu_members[]
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
void MEM_WRITE_64(JitCpu *jitcpu, uint64_t addr, uint64_t src)
void dump_gpregs(vm_cpu_t *vmcpu)
PyObject * cpu_set_gpreg(JitCpu *self, PyObject *args)
PyObject * cpu_dump_gpregs(JitCpu *self, PyObject *args)
static PyMethodDef JitCpu_methods[]
void MEM_WRITE_08(JitCpu *jitcpu, uint64_t addr, uint8_t src)
void JitCpu_dealloc(JitCpu *self)
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
static PyMethodDef JitCore_aarch64_Methods[]
PyObject * get_gpreg_offset_all(void)
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
PyObject * JitCpu_get_jitter(JitCpu *self, void *closure)