2 #include "../JitCore.h"
3 #include "structmember.h"
7 #include "../vm_mngr.h"
8 #include "../vm_mngr_py.h"
22 {.name =
"R8", .offset = offsetof(
vm_cpu_t,
R8)},
23 {.name =
"R9", .offset = offsetof(
vm_cpu_t,
R9)},
33 {.name =
"zf", .offset = offsetof(
vm_cpu_t,
zf)},
34 {.name =
"nf", .offset = offsetof(
vm_cpu_t,
nf)},
35 {.name =
"pf", .offset = offsetof(
vm_cpu_t,
pf)},
36 {.name =
"of", .offset = offsetof(
vm_cpu_t,
of)},
37 {.name =
"cf", .offset = offsetof(
vm_cpu_t,
cf)},
38 {.name =
"af", .offset = offsetof(
vm_cpu_t,
af)},
39 {.name =
"df", .offset = offsetof(
vm_cpu_t,
df)},
41 {.name =
"ES", .offset = offsetof(
vm_cpu_t,
ES)},
42 {.name =
"CS", .offset = offsetof(
vm_cpu_t,
CS)},
43 {.name =
"SS", .offset = offsetof(
vm_cpu_t,
SS)},
44 {.name =
"DS", .offset = offsetof(
vm_cpu_t,
DS)},
45 {.name =
"FS", .offset = offsetof(
vm_cpu_t,
FS)},
46 {.name =
"GS", .offset = offsetof(
vm_cpu_t,
GS)},
60 PyObject *dict = PyDict_New();
109 PyObject *d_key, *d_value = NULL;
112 unsigned int i, found;
114 if (!PyArg_ParseTuple(args,
"O", &dict))
116 if(!PyDict_Check(dict))
117 RAISE(PyExc_TypeError,
"arg must be dict");
118 while(PyDict_Next(dict, &pos, &d_key, &d_value)){
119 if(!PyString_Check(d_key))
120 RAISE(PyExc_TypeError,
"key must be str");
126 if (strcmp(PyString_AsString(d_key), gpreg_dict[i].
name))
128 *((uint64_t*)(((
char*)(
self->cpu)) + gpreg_dict[i].
offset)) = val;
135 fprintf(stderr,
"unkown key: %s\n", PyString_AsString(d_key));
136 RAISE(PyExc_ValueError,
"unkown reg");
144 memset(self->cpu, 0,
sizeof(
vm_cpu_t));
146 ((
vm_cpu_t*)self->cpu)->tsc1 = 0x22222222;
147 ((
vm_cpu_t*)self->cpu)->tsc2 = 0x11111111;
158 printf(
"RAX %.16"PRIX64
" RBX %.16"PRIX64
" RCX %.16"PRIX64
" RDX %.16"PRIX64
"\n",
160 printf(
"RSI %.16"PRIX64
" RDI %.16"PRIX64
" RSP %.16"PRIX64
" RBP %.16"PRIX64
"\n",
162 printf(
"zf %.16"PRIX64
" nf %.16"PRIX64
" of %.16"PRIX64
" cf %.16"PRIX64
"\n",
163 vmcpu->
zf, vmcpu->
nf, vmcpu->
of, vmcpu->
cf);
164 printf(
"RIP %.16"PRIX64
"\n",
185 if (!PyArg_ParseTuple(args,
"O", &item1))
190 ((
vm_cpu_t*)self->cpu)->exception_flags = i;
197 return PyLong_FromUnsignedLongLong((uint64_t)(((
vm_cpu_t*)self->cpu)->exception_flags));
206 PyObject *item1, *item2;
207 uint64_t segm_num, segm_base;
209 if (!PyArg_ParseTuple(args,
"OO", &item1, &item2))
214 ((
vm_cpu_t*)self->cpu)->segm_base[segm_num] = segm_base;
226 if (!PyArg_ParseTuple(args,
"O", &item1))
229 v = PyInt_FromLong((
long)(((
vm_cpu_t*)self->cpu)->segm_base[segm_num]));
265 result = PyObject_CallMethod(jitcpu->jitter,
"automod_cb",
"LL", addr, size);
300 Py_ssize_t py_length;
307 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_buffer))
312 if(!PyString_Check(py_buffer))
313 RAISE(PyExc_TypeError,
"arg must be str");
315 size = PyString_Size(py_buffer);
316 PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
320 RAISE(PyExc_TypeError,
"arg must be str");
348 {
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
350 {
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
358 self->cpu = malloc(
sizeof(
vm_cpu_t));
359 if (self->cpu == NULL) {
360 fprintf(stderr,
"cannot alloc vm_cpu_t\n");
367 #define getset_reg_E_u32(regname) \
368 static PyObject *JitCpu_get_E ## regname (JitCpu *self, void *closure) \
370 return PyLong_FromUnsignedLongLong((uint32_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFFFFFF )); \
372 static int JitCpu_set_E ## regname (JitCpu *self, PyObject *value, void *closure) \
375 PyGetInt_ret0(value, val); \
377 val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFF00000000ULL; \
378 ((vm_cpu_t*)(self->cpu))->R ## regname = val; \
384 #define getset_reg_R_u16(regname) \
385 static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \
387 return PyLong_FromUnsignedLongLong((uint16_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFF )); \
389 static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \
392 PyGetInt_ret0(value, val); \
394 val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFFFFFF0000ULL; \
395 ((vm_cpu_t*)(self->cpu))->R ## regname = val; \
461 PyObject *dict = PyDict_New();
681 {
"RAX", (getter)JitCpu_get_RAX, (setter)JitCpu_set_RAX,
"RAX", NULL},
682 {
"RBX", (getter)JitCpu_get_RBX, (setter)JitCpu_set_RBX,
"RBX", NULL},
683 {
"RCX", (getter)JitCpu_get_RCX, (setter)JitCpu_set_RCX,
"RCX", NULL},
684 {
"RDX", (getter)JitCpu_get_RDX, (setter)JitCpu_set_RDX,
"RDX", NULL},
685 {
"RSI", (getter)JitCpu_get_RSI, (setter)JitCpu_set_RSI,
"RSI", NULL},
686 {
"RDI", (getter)JitCpu_get_RDI, (setter)JitCpu_set_RDI,
"RDI", NULL},
687 {
"RSP", (getter)JitCpu_get_RSP, (setter)JitCpu_set_RSP,
"RSP", NULL},
688 {
"RBP", (getter)JitCpu_get_RBP, (setter)JitCpu_set_RBP,
"RBP", NULL},
689 {
"R8", (getter)JitCpu_get_R8, (setter)JitCpu_set_R8,
"R8", NULL},
690 {
"R9", (getter)JitCpu_get_R9, (setter)JitCpu_set_R9,
"R9", NULL},
691 {
"R10", (getter)JitCpu_get_R10, (setter)JitCpu_set_R10,
"R10", NULL},
692 {
"R11", (getter)JitCpu_get_R11, (setter)JitCpu_set_R11,
"R11", NULL},
693 {
"R12", (getter)JitCpu_get_R12, (setter)JitCpu_set_R12,
"R12", NULL},
694 {
"R13", (getter)JitCpu_get_R13, (setter)JitCpu_set_R13,
"R13", NULL},
695 {
"R14", (getter)JitCpu_get_R14, (setter)JitCpu_set_R14,
"R14", NULL},
696 {
"R15", (getter)JitCpu_get_R15, (setter)JitCpu_set_R15,
"R15", NULL},
697 {
"RIP", (getter)JitCpu_get_RIP, (setter)JitCpu_set_RIP,
"RIP", NULL},
698 {
"zf", (getter)JitCpu_get_zf, (setter)JitCpu_set_zf,
"zf", NULL},
699 {
"nf", (getter)JitCpu_get_nf, (setter)JitCpu_set_nf,
"nf", NULL},
700 {
"pf", (getter)JitCpu_get_pf, (setter)JitCpu_set_pf,
"pf", NULL},
701 {
"of", (getter)JitCpu_get_of, (setter)JitCpu_set_of,
"of", NULL},
702 {
"cf", (getter)JitCpu_get_cf, (setter)JitCpu_set_cf,
"cf", NULL},
703 {
"af", (getter)JitCpu_get_af, (setter)JitCpu_set_af,
"af", NULL},
704 {
"df", (getter)JitCpu_get_df, (setter)JitCpu_set_df,
"df", NULL},
705 {
"ES", (getter)JitCpu_get_ES, (setter)JitCpu_set_ES,
"ES", NULL},
706 {
"CS", (getter)JitCpu_get_CS, (setter)JitCpu_set_CS,
"CS", NULL},
707 {
"SS", (getter)JitCpu_get_SS, (setter)JitCpu_set_SS,
"SS", NULL},
708 {
"DS", (getter)JitCpu_get_DS, (setter)JitCpu_set_DS,
"DS", NULL},
709 {
"FS", (getter)JitCpu_get_FS, (setter)JitCpu_set_FS,
"FS", NULL},
710 {
"GS", (getter)JitCpu_get_GS, (setter)JitCpu_set_GS,
"GS", NULL},
712 {
"EAX", (getter)JitCpu_get_EAX, (setter)JitCpu_set_EAX,
"EAX", NULL},
713 {
"EBX", (getter)JitCpu_get_EBX, (setter)JitCpu_set_EBX,
"EBX", NULL},
714 {
"ECX", (getter)JitCpu_get_ECX, (setter)JitCpu_set_ECX,
"ECX", NULL},
715 {
"EDX", (getter)JitCpu_get_EDX, (setter)JitCpu_set_EDX,
"EDX", NULL},
716 {
"ESI", (getter)JitCpu_get_ESI, (setter)JitCpu_set_ESI,
"ESI", NULL},
717 {
"EDI", (getter)JitCpu_get_EDI, (setter)JitCpu_set_EDI,
"EDI", NULL},
718 {
"ESP", (getter)JitCpu_get_ESP, (setter)JitCpu_set_ESP,
"ESP", NULL},
719 {
"EBP", (getter)JitCpu_get_EBP, (setter)JitCpu_set_EBP,
"EBP", NULL},
720 {
"EIP", (getter)JitCpu_get_EIP, (setter)JitCpu_set_EIP,
"EIP", NULL},
722 {
"AX", (getter)JitCpu_get_AX, (setter)JitCpu_set_AX,
"AX", NULL},
723 {
"BX", (getter)JitCpu_get_BX, (setter)JitCpu_set_BX,
"BX", NULL},
724 {
"CX", (getter)JitCpu_get_CX, (setter)JitCpu_set_CX,
"CX", NULL},
725 {
"DX", (getter)JitCpu_get_DX, (setter)JitCpu_set_DX,
"DX", NULL},
726 {
"SI", (getter)JitCpu_get_SI, (setter)JitCpu_set_SI,
"SI", NULL},
727 {
"DI", (getter)JitCpu_get_DI, (setter)JitCpu_set_DI,
"DI", NULL},
728 {
"SP", (getter)JitCpu_get_SP, (setter)JitCpu_set_SP,
"SP", NULL},
729 {
"BP", (getter)JitCpu_get_BP, (setter)JitCpu_set_BP,
"BP", NULL},
731 {
"IP", (getter)JitCpu_get_IP, (setter)JitCpu_set_IP,
"IP", NULL},
739 PyObject_HEAD_INIT(NULL)
741 "JitCore_x86.JitCpu",
759 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
788 {NULL, NULL, 0, NULL}
799 if (PyType_Ready(&JitCpuType) < 0)
802 m = Py_InitModule(
"JitCore_x86", JitCore_x86_Methods);
806 JitCore_x86_Error = PyErr_NewException(
"JitCore_x86.error", NULL, NULL);
807 Py_INCREF(JitCore_x86_Error);
808 PyModule_AddObject(m,
"error", JitCore_x86_Error);
810 Py_INCREF(&JitCpuType);
811 PyModule_AddObject(m,
"JitCpu", (PyObject *)&JitCpuType);
PyObject * cpu_set_segm_base(JitCpu *self, PyObject *args)
#define EXCEPT_CODE_AUTOMOD
void MEM_WRITE_32(JitCpu *jitcpu, uint64_t addr, uint32_t src)
static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds)
PyObject * cpu_init_regs(JitCpu *self)
void dump_gpregs(vm_cpu_t *vmcpu)
static PyMethodDef JitCpu_methods[]
PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyObject * JitCore_x86_Error
PyObject * cpu_get_segm_base(JitCpu *self, PyObject *args)
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
PyObject * cpu_get_exception(JitCpu *self, PyObject *args)
PyObject * vm_get_mem(JitCpu *self, PyObject *args)
static PyGetSetDef JitCpu_getseters[]
void MEM_WRITE_16(JitCpu *jitcpu, uint64_t addr, uint16_t src)
PyObject * cpu_set_gpreg(JitCpu *self, PyObject *args)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
static PyMemberDef JitCpu_members[]
PyObject * cpu_get_gpreg(JitCpu *self)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
PyObject * cpu_dump_gpregs(JitCpu *self, PyObject *args)
PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
#define getset_reg_R_u16(regname)
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
void MEM_WRITE_64(JitCpu *jitcpu, uint64_t addr, uint64_t src)
#define getset_reg_E_u32(regname)
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
void MEM_WRITE_08(JitCpu *jitcpu, uint64_t addr, uint8_t src)
PyObject * get_gpreg_offset_all(void)
PyObject * cpu_set_exception(JitCpu *self, PyObject *args)
uint64_t segm2addr(JitCpu *jitcpu, uint64_t segm, uint64_t addr)
void JitCpu_dealloc(JitCpu *self)
static PyMethodDef JitCore_x86_Methods[]
PyMODINIT_FUNC initJitCore_x86(void)
static PyTypeObject JitCpuType
PyObject * vm_set_mem(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)