Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
JitCore.h
Go to the documentation of this file.
1 #ifndef JITCORE_H
2 #define JITCORE_H
3 
4 #define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;}
5 #define RAISE_ret0(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return 0;}
6 
7 
8 #define PyGetInt(item, value) \
9  if (PyInt_Check(item)){ \
10  value = (uint64_t)PyInt_AsLong(item); \
11  } \
12  else if (PyLong_Check(item)){ \
13  value = (uint64_t)PyLong_AsUnsignedLongLong(item); \
14  } \
15  else{ \
16  RAISE(PyExc_TypeError,"arg must be int"); \
17  } \
18 
19 
20 #define PyGetInt_ret0(item, value) \
21  if (PyInt_Check(item)){ \
22  value = (uint64_t)PyInt_AsLong(item); \
23  } \
24  else if (PyLong_Check(item)){ \
25  value = (uint64_t)PyLong_AsUnsignedLongLong(item); \
26  } \
27  else{ \
28  printf("error\n"); return 0; \
29  } \
30 
31 
32 
33 #define getset_reg_u64(regname) \
34  static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \
35  { \
36  return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)(self->cpu))-> regname )); \
37  } \
38  static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \
39  { \
40  uint64_t val; \
41  PyGetInt_ret0(value, val); \
42  ((vm_cpu_t*)(self->cpu))-> regname = val; \
43  return 0; \
44  }
45 
46 #define getset_reg_u32(regname) \
47  static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \
48  { \
49  return PyLong_FromUnsignedLongLong((uint32_t)(((vm_cpu_t*)(self->cpu))-> regname )); \
50  } \
51  static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \
52  { \
53  uint32_t val; \
54  PyGetInt_ret0(value, val); \
55  ((vm_cpu_t*)(self->cpu))-> regname = val; \
56  return 0; \
57  }
58 
59 
60 #define getset_reg_u16(regname) \
61  static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \
62  { \
63  return PyLong_FromUnsignedLongLong((uint16_t)(((vm_cpu_t*)(self->cpu))-> regname )); \
64  } \
65  static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \
66  { \
67  uint16_t val; \
68  PyGetInt_ret0(value, val); \
69  ((vm_cpu_t*)(self->cpu))-> regname = val; \
70  return 0; \
71  }
72 
73 
74 #define get_reg(reg) do { \
75  o = PyLong_FromUnsignedLongLong((uint64_t)((vm_cpu_t*)(self->cpu))->reg); \
76  PyDict_SetItemString(dict, #reg, o); \
77  Py_DECREF(o); \
78  } while(0);
79 
80 
81 #define get_reg_off(reg) do { \
82  o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \
83  PyDict_SetItemString(dict, #reg, o); \
84  Py_DECREF(o); \
85  } while(0);
86 
87 
88 typedef struct {
89  uint8_t is_local;
90  uint64_t address;
91 } block_id;
92 
93 typedef struct {
94  PyObject_HEAD
95  PyObject *pyvm;
96  PyObject *jitter;
97  void* cpu;
98 } JitCpu;
99 
100 
101 typedef struct _reg_dict{
102  char* name;
103  size_t offset;
104 } reg_dict;
105 
106 
107 
108 void JitCpu_dealloc(JitCpu* self);
109 PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
110 PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure);
111 PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure);
112 PyObject * JitCpu_get_jitter(JitCpu *self, void *closure);
113 PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure);
114 void Resolve_dst(block_id* BlockDst, uint64_t addr, uint64_t is_local);
115 
116 
117 
118 uint8_t MEM_LOOKUP_08(JitCpu* jitcpu, uint64_t addr);
119 uint16_t MEM_LOOKUP_16(JitCpu* jitcpu, uint64_t addr);
120 uint32_t MEM_LOOKUP_32(JitCpu* jitcpu, uint64_t addr);
121 uint64_t MEM_LOOKUP_64(JitCpu* jitcpu, uint64_t addr);
122 void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src);
123 void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src);
124 void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src);
125 void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src);
126 PyObject* vm_get_mem(JitCpu *self, PyObject* args);
127 
128 
129 
130 
131 #define VM_exception_flag (((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags)
132 #define CPU_exception_flag (((vm_cpu_t*)jitcpu->cpu)->exception_flags)
133 
134 #define JIT_RET_EXCEPTION 1
135 #define JIT_RET_NO_EXCEPTION 0
136 
137 #endif
uint8_t MEM_LOOKUP_08(JitCpu *jitcpu, uint64_t addr)
PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
Definition: JitCore.c:35
void JitCpu_dealloc(JitCpu *self)
Definition: JitCore.c:11
PyObject * vm_get_mem(JitCpu *self, PyObject *args)
PyObject * jitter
Definition: JitCore.h:96
PyObject * JitCpu_get_jitter(JitCpu *self, void *closure)
Definition: JitCore.c:41
uint8_t is_local
Definition: JitCore.h:89
struct _reg_dict reg_dict
size_t offset
Definition: JitCore.h:103
void MEM_WRITE_32(JitCpu *jitcpu, uint64_t addr, uint32_t src)
void MEM_WRITE_08(JitCpu *jitcpu, uint64_t addr, uint8_t src)
void Resolve_dst(block_id *BlockDst, uint64_t addr, uint64_t is_local)
Definition: JitCore.c:58
PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Definition: JitCore.c:17
PyObject_HEAD PyObject * pyvm
Definition: JitCore.h:95
uint16_t MEM_LOOKUP_16(JitCpu *jitcpu, uint64_t addr)
void MEM_WRITE_64(JitCpu *jitcpu, uint64_t addr, uint64_t src)
uint32_t MEM_LOOKUP_32(JitCpu *jitcpu, uint64_t addr)
uint64_t MEM_LOOKUP_64(JitCpu *jitcpu, uint64_t addr)
void * cpu
Definition: JitCore.h:97
char * name
Definition: JitCore.h:102
PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure)
Definition: JitCore.c:25
Definition: JitCore.h:93
PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure)
Definition: JitCore.c:51
void MEM_WRITE_16(JitCpu *jitcpu, uint64_t addr, uint16_t src)
uint64_t address
Definition: JitCore.h:90