#include <Python.h>
#include "../JitCore.h"
#include "structmember.h"
#include <stdint.h>
#include <inttypes.h>
#include "../queue.h"
#include "../vm_mngr.h"
#include "../vm_mngr_py.h"
#include "JitCore_x86.h"
Go to the source code of this file.
|
PyObject * | cpu_get_gpreg (JitCpu *self) |
|
PyObject * | cpu_set_gpreg (JitCpu *self, PyObject *args) |
|
PyObject * | cpu_init_regs (JitCpu *self) |
|
void | dump_gpregs (vm_cpu_t *vmcpu) |
|
PyObject * | cpu_dump_gpregs (JitCpu *self, PyObject *args) |
|
PyObject * | cpu_set_exception (JitCpu *self, PyObject *args) |
|
PyObject * | cpu_get_exception (JitCpu *self, PyObject *args) |
|
PyObject * | cpu_set_segm_base (JitCpu *self, PyObject *args) |
|
PyObject * | cpu_get_segm_base (JitCpu *self, PyObject *args) |
|
uint64_t | segm2addr (JitCpu *jitcpu, uint64_t segm, uint64_t addr) |
|
void | check_automod (JitCpu *jitcpu, uint64_t addr, uint64_t size) |
|
void | MEM_WRITE_08 (JitCpu *jitcpu, uint64_t addr, uint8_t src) |
|
void | MEM_WRITE_16 (JitCpu *jitcpu, uint64_t addr, uint16_t src) |
|
void | MEM_WRITE_32 (JitCpu *jitcpu, uint64_t addr, uint32_t src) |
|
void | MEM_WRITE_64 (JitCpu *jitcpu, uint64_t addr, uint64_t src) |
|
PyObject * | vm_set_mem (JitCpu *self, PyObject *args) |
|
static int | JitCpu_init (JitCpu *self, PyObject *args, PyObject *kwds) |
|
| getset_reg_u64 (RAX) |
|
| getset_reg_u64 (RBX) |
|
| getset_reg_u64 (RCX) |
|
| getset_reg_u64 (RDX) |
|
| getset_reg_u64 (RSI) |
|
| getset_reg_u64 (RDI) |
|
| getset_reg_u64 (RSP) |
|
| getset_reg_u64 (RBP) |
|
| getset_reg_u64 (R8) |
|
| getset_reg_u64 (R9) |
|
| getset_reg_u64 (R10) |
|
| getset_reg_u64 (R11) |
|
| getset_reg_u64 (R12) |
|
| getset_reg_u64 (R13) |
|
| getset_reg_u64 (R14) |
|
| getset_reg_u64 (R15) |
|
| getset_reg_u64 (RIP) |
|
| getset_reg_u64 (zf) |
|
| getset_reg_u64 (nf) |
|
| getset_reg_u64 (pf) |
|
| getset_reg_u64 (of) |
|
| getset_reg_u64 (cf) |
|
| getset_reg_u64 (af) |
|
| getset_reg_u64 (df) |
|
| getset_reg_u64 (ES) |
|
| getset_reg_u64 (CS) |
|
| getset_reg_u64 (SS) |
|
| getset_reg_u64 (DS) |
|
| getset_reg_u64 (FS) |
|
| getset_reg_u64 (GS) |
|
| getset_reg_E_u32 (AX) |
|
| getset_reg_E_u32 (BX) |
|
| getset_reg_E_u32 (CX) |
|
| getset_reg_E_u32 (DX) |
|
| getset_reg_E_u32 (SI) |
|
| getset_reg_E_u32 (DI) |
|
| getset_reg_E_u32 (SP) |
|
| getset_reg_E_u32 (BP) |
|
| getset_reg_E_u32 (IP) |
|
| getset_reg_R_u16 (AX) |
|
| getset_reg_R_u16 (BX) |
|
| getset_reg_R_u16 (CX) |
|
| getset_reg_R_u16 (DX) |
|
| getset_reg_R_u16 (SI) |
|
| getset_reg_R_u16 (DI) |
|
| getset_reg_R_u16 (SP) |
|
| getset_reg_R_u16 (BP) |
|
| getset_reg_R_u16 (IP) |
|
PyObject * | get_gpreg_offset_all (void) |
|
PyMODINIT_FUNC | initJitCore_x86 (void) |
|
#define getset_reg_E_u32 |
( |
|
regname | ) |
|
Value:static PyObject *JitCpu_get_E ## regname (
JitCpu *
self,
void *closure) \
{ \
return PyLong_FromUnsignedLongLong((uint32_t)(((
vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFFFFFF )); \
} \
static
int JitCpu_set_E ## regname (
JitCpu *
self, PyObject *value,
void *closure) \
{ \
val &= 0xFFFFFFFF; \
val |= ((
vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFF00000000ULL; \
((
vm_cpu_t*)(self->cpu))->R ## regname = val; \
return 0; \
}
#define PyGetInt_ret0(item, value)
Definition at line 367 of file JitCore_x86.c.
#define getset_reg_R_u16 |
( |
|
regname | ) |
|
Value:static PyObject *JitCpu_get_ ## regname (
JitCpu *
self,
void *closure) \
{ \
return PyLong_FromUnsignedLongLong((uint16_t)(((
vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFF )); \
} \
static
int JitCpu_set_ ## regname (
JitCpu *
self, PyObject *value,
void *closure) \
{ \
val &= 0xFFFF; \
val |= ((
vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFFFFFF0000ULL; \
((
vm_cpu_t*)(self->cpu))->R ## regname = val; \
return 0; \
}
#define PyGetInt_ret0(item, value)
Definition at line 384 of file JitCore_x86.c.
void check_automod |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
addr, |
|
|
uint64_t |
size |
|
) |
| |
Definition at line 259 of file JitCore_x86.c.
265 result = PyObject_CallMethod(jitcpu->
jitter,
"automod_cb",
"LL", addr, size);
#define EXCEPT_CODE_AUTOMOD
PyObject_HEAD PyObject * pyvm
PyObject* cpu_dump_gpregs |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
PyObject* cpu_get_exception |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 195 of file JitCore_x86.c.
197 return PyLong_FromUnsignedLongLong((uint64_t)(((
vm_cpu_t*)self->
cpu)->exception_flags));
PyObject* cpu_get_gpreg |
( |
JitCpu * |
self | ) |
|
Definition at line 58 of file JitCore_x86.c.
60 PyObject *dict = PyDict_New();
PyObject* cpu_get_segm_base |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 220 of file JitCore_x86.c.
226 if (!PyArg_ParseTuple(args,
"O", &item1))
229 v = PyInt_FromLong((
long)(((
vm_cpu_t*)self->
cpu)->segm_base[segm_num]));
#define PyGetInt(item, value)
PyObject* cpu_init_regs |
( |
JitCpu * |
self | ) |
|
PyObject* cpu_set_exception |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 180 of file JitCore_x86.c.
185 if (!PyArg_ParseTuple(args,
"O", &item1))
#define PyGetInt(item, value)
PyObject* cpu_set_gpreg |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 106 of file JitCore_x86.c.
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");
135 fprintf(stderr,
"unkown key: %s\n", PyString_AsString(d_key));
136 RAISE(PyExc_ValueError,
"unkown reg");
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
PyObject* cpu_set_segm_base |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 204 of file JitCore_x86.c.
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;
#define PyGetInt(item, value)
Definition at line 155 of file JitCore_x86.c.
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",
PyObject* get_gpreg_offset_all |
( |
void |
| ) |
|
Definition at line 459 of file JitCore_x86.c.
461 PyObject *dict = PyDict_New();
PyMODINIT_FUNC initJitCore_x86 |
( |
void |
| ) |
|
Definition at line 795 of file JitCore_x86.c.
811 PyModule_AddObject(m,
"JitCpu", (PyObject *)&
JitCpuType);
static PyObject * JitCore_x86_Error
static PyMethodDef JitCore_x86_Methods[]
static PyTypeObject JitCpuType
static int JitCpu_init |
( |
JitCpu * |
self, |
|
|
PyObject * |
args, |
|
|
PyObject * |
kwds |
|
) |
| |
|
static |
Definition at line 356 of file JitCore_x86.c.
358 self->cpu = malloc(
sizeof(
vm_cpu_t));
359 if (self->
cpu == NULL) {
360 fprintf(stderr,
"cannot alloc vm_cpu_t\n");
void MEM_WRITE_08 |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
addr, |
|
|
uint8_t |
src |
|
) |
| |
Definition at line 270 of file JitCore_x86.c.
PyObject_HEAD PyObject * pyvm
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_16 |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
addr, |
|
|
uint16_t |
src |
|
) |
| |
Definition at line 276 of file JitCore_x86.c.
void vm_MEM_WRITE_16(vm_mngr_t *vm_mngr, uint64_t addr, unsigned short src)
PyObject_HEAD PyObject * pyvm
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
void MEM_WRITE_32 |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
addr, |
|
|
uint32_t |
src |
|
) |
| |
Definition at line 282 of file JitCore_x86.c.
PyObject_HEAD PyObject * pyvm
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
void MEM_WRITE_64 |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
addr, |
|
|
uint64_t |
src |
|
) |
| |
Definition at line 288 of file JitCore_x86.c.
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
PyObject_HEAD PyObject * pyvm
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
uint64_t segm2addr |
( |
JitCpu * |
jitcpu, |
|
|
uint64_t |
segm, |
|
|
uint64_t |
addr |
|
) |
| |
PyObject* vm_set_mem |
( |
JitCpu * |
self, |
|
|
PyObject * |
args |
|
) |
| |
Definition at line 296 of file JitCore_x86.c.
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");
#define RAISE(errtype, msg)
#define PyGetInt(item, value)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
PyObject_HEAD PyObject * pyvm
void check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size)
PyObject* JitCore_x86_Error |
|
static |
PyMethodDef JitCore_x86_Methods[] |
|
static |
Initial value:= {
{NULL, NULL, 0, NULL}
}
PyObject * get_gpreg_offset_all(void)
Definition at line 782 of file JitCore_x86.c.
PyGetSetDef JitCpu_getseters[] |
|
static |
PyMemberDef JitCpu_members[] |
|
static |
PyMethodDef JitCpu_methods[] |
|
static |
Initial value:= {
"X"},
"X"},
"X"},
"X"},
"X"},
"X"},
"X"},
"X"},
{
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
"X"},
{
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
"X"},
{NULL}
}
PyObject * cpu_set_segm_base(JitCpu *self, PyObject *args)
PyObject * cpu_init_regs(JitCpu *self)
PyObject * cpu_get_segm_base(JitCpu *self, PyObject *args)
PyObject * cpu_get_exception(JitCpu *self, PyObject *args)
PyObject * vm_get_mem(JitCpu *self, PyObject *args)
PyObject * cpu_set_gpreg(JitCpu *self, PyObject *args)
PyObject * cpu_get_gpreg(JitCpu *self)
PyObject * cpu_dump_gpregs(JitCpu *self, PyObject *args)
PyObject * cpu_set_exception(JitCpu *self, PyObject *args)
PyObject * vm_set_mem(JitCpu *self, PyObject *args)
Definition at line 331 of file JitCore_x86.c.