about summary refs log tree commit diff stats
path: root/miasm2/jitter/JitCore.c
blob: 84f835f1b4c0a5e30eb24d8c34420c18ddcce022 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <Python.h>
#include "structmember.h"
#include <stdint.h>
#include <inttypes.h>
#include "queue.h"
#include "vm_mngr.h"
#include "vm_mngr_py.h"
#include "JitCore.h"


void JitCpu_dealloc(JitCpu* self)
{
    self->ob_type->tp_free((PyObject*)self);
}


PyObject * JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    JitCpu *self;

    self = (JitCpu *)type->tp_alloc(type, 0);
    return (PyObject *)self;
}

PyObject * JitCpu_get_vmmngr(JitCpu *self, void *closure)
{
	if (self->pyvm) {
		Py_INCREF(self->pyvm);
		return (PyObject*)self->pyvm;
	}
	Py_INCREF(Py_None);
	return Py_None;
}

PyObject * JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure)
{
	self->pyvm = (VmMngr*)value;
	return 0;
}

PyObject * JitCpu_get_jitter(JitCpu *self, void *closure)
{
	if (self->jitter) {
		Py_INCREF(self->jitter);
		return self->jitter;
	}
	Py_INCREF(Py_None);
	return Py_None;
}

PyObject * JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure)
{
	self->jitter = value;
	return 0;
}

uint8_t __attribute__((weak)) MEM_LOOKUP_08(JitCpu* jitcpu, uint64_t addr)
{
	return vm_MEM_LOOKUP_08(&(jitcpu->pyvm->vm_mngr), addr);
}

uint16_t __attribute__((weak)) MEM_LOOKUP_16(JitCpu* jitcpu, uint64_t addr)
{
	return vm_MEM_LOOKUP_16(&(jitcpu->pyvm->vm_mngr), addr);
}

uint32_t __attribute__((weak)) MEM_LOOKUP_32(JitCpu* jitcpu, uint64_t addr)
{
	return vm_MEM_LOOKUP_32(&(jitcpu->pyvm->vm_mngr), addr);
}

uint64_t __attribute__((weak)) MEM_LOOKUP_64(JitCpu* jitcpu, uint64_t addr)
{
	return vm_MEM_LOOKUP_64(&(jitcpu->pyvm->vm_mngr), addr);
}

void __attribute__((weak)) MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src)
{
	vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
}

void __attribute__((weak)) MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src)
{
	vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
}

void __attribute__((weak)) MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src)
{
	vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
}

void __attribute__((weak)) MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src)
{
	vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src);
}




PyObject* __attribute__((weak)) vm_get_mem(JitCpu *self, PyObject* args)
{
       PyObject *py_addr;
       PyObject *py_len;

       uint64_t addr;
       uint64_t size;
       PyObject *obj_out;
       char * buf_out;
       int ret;

       if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len))
	       return NULL;

       PyGetInt(py_addr, addr);
       PyGetInt(py_len, size);

       ret = vm_read_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, &buf_out, size);
       if (ret < 0) {
	       PyErr_SetString(PyExc_RuntimeError, "cannot find address");
	       return NULL;
       }

       obj_out = PyString_FromStringAndSize(buf_out, size);
       free(buf_out);
       return obj_out;
}