|
1 |
| -#-*- coding:utf-8 -*- |
2 |
| - |
3 |
| -import os |
4 |
| -import tempfile |
5 |
| -import platform |
6 |
| -import sysconfig |
7 |
| -from distutils.sysconfig import get_python_inc |
8 |
| - |
9 |
| -from miasm.jitter.jitcore import JitCore |
10 |
| -from miasm.core.utils import keydefaultdict |
11 |
| - |
12 |
| -is_win = platform.system() == "Windows" |
13 |
| - |
14 |
| -def gen_core(arch, attrib): |
15 |
| - lib_dir = os.path.dirname(os.path.realpath(__file__)) |
16 |
| - |
17 |
| - txt = "" |
18 |
| - txt += '#include "%s/queue.h"\n' % lib_dir |
19 |
| - txt += '#include "%s/op_semantics.h"\n' % lib_dir |
20 |
| - txt += '#include "%s/vm_mngr.h"\n' % lib_dir |
21 |
| - txt += '#include "%s/vm_mngr_py.h"\n' % lib_dir |
22 |
| - txt += '#include "%s/bn.h"\n' % lib_dir |
23 |
| - txt += '#include "%s/JitCore.h"\n' % lib_dir |
24 |
| - txt += '#include "%s/arch/JitCore_%s.h"\n' % (lib_dir, arch.name) |
25 |
| - |
26 |
| - txt += r''' |
27 |
| -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} |
28 |
| -''' |
29 |
| - return txt |
30 |
| - |
31 |
| - |
32 |
| -class myresolver(object): |
33 |
| - |
34 |
| - def __init__(self, offset): |
35 |
| - self.offset = offset |
36 |
| - |
37 |
| - def ret(self): |
38 |
| - return "return PyLong_FromUnsignedLongLong(0x%X);" % self.offset |
39 |
| - |
40 |
| - |
41 |
| -class resolver(object): |
42 |
| - |
43 |
| - def __init__(self): |
44 |
| - self.resolvers = keydefaultdict(myresolver) |
45 |
| - |
46 |
| - def get_resolver(self, offset): |
47 |
| - return self.resolvers[offset] |
48 |
| - |
49 |
| - |
50 |
| -class JitCore_Cc_Base(JitCore): |
51 |
| - "JiT management, abstract class using a C compiler as backend" |
52 |
| - |
53 |
| - def __init__(self, ir_arch, bin_stream): |
54 |
| - self.jitted_block_delete_cb = self.deleteCB |
55 |
| - super(JitCore_Cc_Base, self).__init__(ir_arch, bin_stream) |
56 |
| - self.resolver = resolver() |
57 |
| - self.ir_arch = ir_arch |
58 |
| - self.states = {} |
59 |
| - self.tempdir = os.path.join(tempfile.gettempdir(), "miasm_cache") |
60 |
| - try: |
61 |
| - os.mkdir(self.tempdir, 0o755) |
62 |
| - except OSError: |
63 |
| - pass |
64 |
| - if not os.access(self.tempdir, os.R_OK | os.W_OK): |
65 |
| - raise RuntimeError( |
66 |
| - 'Cannot access cache directory %s ' % self.tempdir) |
67 |
| - self.exec_wrapper = None |
68 |
| - self.libs = None |
69 |
| - self.include_files = None |
70 |
| - |
71 |
| - def deleteCB(self, offset): |
72 |
| - raise NotImplementedError() |
73 |
| - |
74 |
| - def load(self): |
75 |
| - lib_dir = os.path.dirname(os.path.realpath(__file__)) |
76 |
| - ext = sysconfig.get_config_var('EXT_SUFFIX') |
77 |
| - if ext is None: |
78 |
| - ext = self._get_ext() |
79 |
| - |
80 |
| - libs = [ |
81 |
| - os.path.join(lib_dir, "VmMngr" + ext), |
82 |
| - os.path.join( |
83 |
| - lib_dir, |
84 |
| - "arch", |
85 |
| - "JitCore_%s%s" % (self.ir_arch.arch.name, ext) |
86 |
| - ) |
87 |
| - ] |
88 |
| - |
89 |
| - include_files = [ |
90 |
| - os.path.dirname(__file__), |
91 |
| - get_python_inc() |
92 |
| - ] |
93 |
| - self.include_files = include_files |
94 |
| - self.libs = libs |
95 |
| - |
96 |
| - def init_codegen(self, codegen): |
97 |
| - """ |
98 |
| - Get the code generator @codegen |
99 |
| - @codegen: an CGen instance |
100 |
| - """ |
101 |
| - self.codegen = codegen |
102 |
| - |
103 |
| - def gen_c_code(self, block): |
104 |
| - """ |
105 |
| - Return the C code corresponding to the @irblocks |
106 |
| - @irblocks: list of irblocks |
107 |
| - """ |
108 |
| - f_declaration = '_MIASM_EXPORT int %s(block_id * BlockDst, JitCpu* jitcpu)' % self.FUNCNAME |
109 |
| - out = self.codegen.gen_c( |
110 |
| - block, |
111 |
| - log_mn=self.log_mn, |
112 |
| - log_regs=self.log_regs |
113 |
| - ) |
114 |
| - out = [f_declaration + '{'] + out + ['}\n'] |
115 |
| - c_code = out |
116 |
| - |
117 |
| - return self.gen_C_source(self.ir_arch, c_code) |
118 |
| - |
119 |
| - @staticmethod |
120 |
| - def gen_C_source(ir_arch, func_code): |
121 |
| - raise NotImplementedError() |
122 |
| - |
123 |
| - def _get_ext(self): |
124 |
| - raise NotImplementedError() |
| 1 | +#-*- coding:utf-8 -*- |
| 2 | + |
| 3 | +import os |
| 4 | +import tempfile |
| 5 | +import platform |
| 6 | +import sysconfig |
| 7 | +from distutils.sysconfig import get_python_inc |
| 8 | + |
| 9 | +from miasm.jitter.jitcore import JitCore |
| 10 | +from miasm.core.utils import keydefaultdict |
| 11 | + |
| 12 | +is_win = platform.system() == "Windows" |
| 13 | + |
| 14 | +def gen_core(arch, attrib): |
| 15 | + lib_dir = os.path.dirname(os.path.realpath(__file__)) |
| 16 | + |
| 17 | + txt = "" |
| 18 | + txt += '#include "%s/queue.h"\n' % lib_dir |
| 19 | + txt += '#include "%s/op_semantics.h"\n' % lib_dir |
| 20 | + txt += '#include "%s/vm_mngr.h"\n' % lib_dir |
| 21 | + txt += '#include "%s/vm_mngr_py.h"\n' % lib_dir |
| 22 | + txt += '#include "%s/bn.h"\n' % lib_dir |
| 23 | + txt += '#include "%s/JitCore.h"\n' % lib_dir |
| 24 | + txt += '#include "%s/arch/JitCore_%s.h"\n' % (lib_dir, arch.name) |
| 25 | + |
| 26 | + txt += r''' |
| 27 | +#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} |
| 28 | +''' |
| 29 | + return txt |
| 30 | + |
| 31 | + |
| 32 | +class myresolver(object): |
| 33 | + |
| 34 | + def __init__(self, offset): |
| 35 | + self.offset = offset |
| 36 | + |
| 37 | + def ret(self): |
| 38 | + return "return PyLong_FromUnsignedLongLong(0x%X);" % self.offset |
| 39 | + |
| 40 | + |
| 41 | +class resolver(object): |
| 42 | + |
| 43 | + def __init__(self): |
| 44 | + self.resolvers = keydefaultdict(myresolver) |
| 45 | + |
| 46 | + def get_resolver(self, offset): |
| 47 | + return self.resolvers[offset] |
| 48 | + |
| 49 | + |
| 50 | +class JitCore_Cc_Base(JitCore): |
| 51 | + "JiT management, abstract class using a C compiler as backend" |
| 52 | + |
| 53 | + def __init__(self, ir_arch, bin_stream): |
| 54 | + self.jitted_block_delete_cb = self.deleteCB |
| 55 | + super(JitCore_Cc_Base, self).__init__(ir_arch, bin_stream) |
| 56 | + self.resolver = resolver() |
| 57 | + self.ir_arch = ir_arch |
| 58 | + self.states = {} |
| 59 | + self.tempdir = os.path.join(tempfile.gettempdir(), "miasm_cache") |
| 60 | + try: |
| 61 | + os.mkdir(self.tempdir, 0o755) |
| 62 | + except OSError: |
| 63 | + pass |
| 64 | + if not os.access(self.tempdir, os.R_OK | os.W_OK): |
| 65 | + raise RuntimeError( |
| 66 | + 'Cannot access cache directory %s ' % self.tempdir) |
| 67 | + self.exec_wrapper = None |
| 68 | + self.libs = None |
| 69 | + self.include_files = None |
| 70 | + |
| 71 | + def deleteCB(self, offset): |
| 72 | + raise NotImplementedError() |
| 73 | + |
| 74 | + def load(self): |
| 75 | + lib_dir = os.path.dirname(os.path.realpath(__file__)) |
| 76 | + ext = sysconfig.get_config_var('EXT_SUFFIX') |
| 77 | + if ext is None: |
| 78 | + ext = ".so" if not is_win else ".lib" |
| 79 | + |
| 80 | + libs = [ |
| 81 | + os.path.join(lib_dir, "VmMngr" + ext), |
| 82 | + os.path.join( |
| 83 | + lib_dir, |
| 84 | + "arch", |
| 85 | + "JitCore_%s%s" % (self.ir_arch.arch.name, ext) |
| 86 | + ) |
| 87 | + ] |
| 88 | + |
| 89 | + include_files = [ |
| 90 | + os.path.dirname(__file__), |
| 91 | + get_python_inc() |
| 92 | + ] |
| 93 | + self.include_files = include_files |
| 94 | + self.libs = libs |
| 95 | + |
| 96 | + def init_codegen(self, codegen): |
| 97 | + """ |
| 98 | + Get the code generator @codegen |
| 99 | + @codegen: an CGen instance |
| 100 | + """ |
| 101 | + self.codegen = codegen |
| 102 | + |
| 103 | + def gen_c_code(self, block): |
| 104 | + """ |
| 105 | + Return the C code corresponding to the @irblocks |
| 106 | + @irblocks: list of irblocks |
| 107 | + """ |
| 108 | + f_declaration = '_MIASM_EXPORT int %s(block_id * BlockDst, JitCpu* jitcpu)' % self.FUNCNAME |
| 109 | + out = self.codegen.gen_c( |
| 110 | + block, |
| 111 | + log_mn=self.log_mn, |
| 112 | + log_regs=self.log_regs |
| 113 | + ) |
| 114 | + out = [f_declaration + '{'] + out + ['}\n'] |
| 115 | + c_code = out |
| 116 | + |
| 117 | + return self.gen_C_source(self.ir_arch, c_code) |
| 118 | + |
| 119 | + @staticmethod |
| 120 | + def gen_C_source(ir_arch, func_code): |
| 121 | + raise NotImplementedError() |
0 commit comments