diff options
| -rw-r--r-- | miasm2/core/asmblock.py | 8 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 12 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 50 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 51 | ||||
| -rw-r--r-- | test/core/asmblock.py | 2 | ||||
| -rwxr-xr-x | test/ir/ir2C.py | 2 |
6 files changed, 69 insertions, 56 deletions
diff --git a/miasm2/core/asmblock.py b/miasm2/core/asmblock.py index 07b8ceeb..8740aeb7 100644 --- a/miasm2/core/asmblock.py +++ b/miasm2/core/asmblock.py @@ -736,6 +736,14 @@ class AsmCFG(DiGraph): yield predecessor done.add(predecessor) + def getby_offset(self, offset): + """Return block containing @offset""" + for block in self: + if block.lines[0].offset <= offset < \ + (block.lines[-1].offset + block.lines[-1].l): + return block + return None + def sanity_check(self): """Do sanity checks on blocks' constraints: * no pendings diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 95502a15..0e285669 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -94,12 +94,16 @@ class TranslatorC(Translator): self.from_expr(expr.args[0]), self.from_expr(expr.args[1]), size2mask(expr.args[0].size)) - elif (expr.op.startswith('cpuid') or - expr.op.startswith("fcom") or + elif expr.op == 'cpuid': + return "%s(%s, %s)" % (expr.op, + self.from_expr(expr.args[0]), + self.from_expr(expr.args[1])) + elif (expr.op.startswith("fcom") or expr.op in ["fadd", "fsub", "fdiv", 'fmul', "fscale", "fprem", "fprem_lsb", "fyl2x", "fpatan"]): - return "%s(%s, %s)" % (expr.op, self.from_expr(expr.args[0]), - self.from_expr(expr.args[1])) + return "fpu_%s(%s, %s)" % (expr.op, + self.from_expr(expr.args[0]), + self.from_expr(expr.args[1])) elif expr.op == "segm": return "segm2addr(jitcpu, %s, %s)" % ( self.from_expr(expr.args[0]), self.from_expr(expr.args[1])) diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 8e50a6dd..c39a08da 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -1027,7 +1027,7 @@ int64_t double_to_int_64(double d) } -double fadd(double a, double b) +double fpu_fadd(double a, double b) { double c; c = a + b; @@ -1038,7 +1038,7 @@ double fadd(double a, double b) return c; } -double fsub(double a, double b) +double fpu_fsub(double a, double b) { double c; c = a - b; @@ -1049,7 +1049,7 @@ double fsub(double a, double b) return c; } -double fmul(double a, double b) +double fpu_fmul(double a, double b) { double c; c = a * b; @@ -1060,7 +1060,7 @@ double fmul(double a, double b) return c; } -double fdiv(double a, double b) +double fpu_fdiv(double a, double b) { double c; c = a / b; @@ -1071,7 +1071,7 @@ double fdiv(double a, double b) return c; } -double ftan(double a) +double fpu_ftan(double a) { double b; b = tan(a); @@ -1082,7 +1082,7 @@ double ftan(double a) return b; } -double frndint(double a) +double fpu_frndint(double a) { int64_t b; double c; @@ -1095,7 +1095,7 @@ double frndint(double a) return c; } -double fsin(double a) +double fpu_fsin(double a) { double b; b = sin(a); @@ -1106,7 +1106,7 @@ double fsin(double a) return b; } -double fcos(double a) +double fpu_fcos(double a) { double b; b = cos(a); @@ -1118,7 +1118,7 @@ double fcos(double a) } -double fscale(double a, double b) +double fpu_fscale(double a, double b) { double c; c = a * exp2(trunc(b)); @@ -1129,7 +1129,7 @@ double fscale(double a, double b) return c; } -double f2xm1(double a) +double fpu_f2xm1(double a) { double b; b = exp2(a)-1; @@ -1140,7 +1140,7 @@ double f2xm1(double a) return b; } -double fsqrt(double a) +double fpu_fsqrt(double a) { double b; b = sqrt(a); @@ -1151,7 +1151,7 @@ double fsqrt(double a) return b; } -double fabs(double a) +double fpu_fabs(double a) { double b; b = abs(a); @@ -1162,7 +1162,7 @@ double fabs(double a) return b; } -double fprem(double a, double b) +double fpu_fprem(double a, double b) { double c; c = fmod(a, b); @@ -1173,7 +1173,7 @@ double fprem(double a, double b) return c; } -unsigned int fprem_lsb(double a, double b) +unsigned int fpu_fprem_lsb(double a, double b) { // Inspired from qemu/fpu_helper.c double c; @@ -1196,7 +1196,7 @@ unsigned int fprem_lsb(double a, double b) return q; } -double fchs(double a) +double fpu_fchs(double a) { double b; b = -a; @@ -1207,7 +1207,7 @@ double fchs(double a) return b; } -double fyl2x(double a, double b) +double fpu_fyl2x(double a, double b) { double c; c = b * (log(a) / log(2)); @@ -1218,7 +1218,7 @@ double fyl2x(double a, double b) return c; } -double fpatan(double a, double b) +double fpu_fpatan(double a, double b) { double c; c = atan2(b, a); @@ -1229,7 +1229,7 @@ double fpatan(double a, double b) return c; } -unsigned int fcom_c0(double a, double b) +unsigned int fpu_fcom_c0(double a, double b) { if (isnan(a) || isnan(b)) return 1; @@ -1237,18 +1237,18 @@ unsigned int fcom_c0(double a, double b) return 0; return 1; } -unsigned int fcom_c1(double a, double b) +unsigned int fpu_fcom_c1(double a, double b) { //XXX return 0; } -unsigned int fcom_c2(double a, double b) +unsigned int fpu_fcom_c2(double a, double b) { if (isnan(a) || isnan(b)) return 1; return 0; } -unsigned int fcom_c3(double a, double b) +unsigned int fpu_fcom_c3(double a, double b) { if (isnan(a) || isnan(b)) return 1; @@ -1257,7 +1257,7 @@ unsigned int fcom_c3(double a, double b) return 0; } -unsigned int fxam_c0(double a) +unsigned int fpu_fxam_c0(double a) { switch(fpclassify(a)) { case FP_NAN: @@ -1277,14 +1277,14 @@ unsigned int fxam_c0(double a) } } -unsigned int fxam_c1(double a) +unsigned int fpu_fxam_c1(double a) { if ((a < 0) || isnan(a)) return 1; return 0; } -unsigned int fxam_c2(double a) +unsigned int fpu_fxam_c2(double a) { switch(fpclassify(a)) { case FP_NAN: @@ -1304,7 +1304,7 @@ unsigned int fxam_c2(double a) } } -unsigned int fxam_c3(double a) +unsigned int fpu_fxam_c3(double a) { switch(fpclassify(a)) { case FP_NAN: diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index 24309156..f050f7c0 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -355,31 +355,31 @@ void func_getproc_fake(void); unsigned int cpuid(unsigned int a, unsigned int reg_num); double int2double(unsigned int m); -double fadd(double a, double b); -double fsub(double a, double b); -double fmul(double a, double b); -double fdiv(double a, double b); -double ftan(double a); -double frndint(double a); -double fsin(double a); -double fcos(double a); -double fscale(double a, double b); -double f2xm1(double a); -double fsqrt(double a); -double fabs(double a); -double fprem(double a, double b); -double fchs(double a); -double fyl2x(double a, double b); -double fpatan(double a, double b); -unsigned int fprem_lsb(double a, double b); -unsigned int fcom_c0(double a, double b); -unsigned int fcom_c1(double a, double b); -unsigned int fcom_c2(double a, double b); -unsigned int fcom_c3(double a, double b); -unsigned int fxam_c0(double a); -unsigned int fxam_c1(double a); -unsigned int fxam_c2(double a); -unsigned int fxam_c3(double a); +double fpu_fadd(double a, double b); +double fpu_fsub(double a, double b); +double fpu_fmul(double a, double b); +double fpu_fdiv(double a, double b); +double fpu_ftan(double a); +double fpu_frndint(double a); +double fpu_fsin(double a); +double fpu_fcos(double a); +double fpu_fscale(double a, double b); +double fpu_f2xm1(double a); +double fpu_fsqrt(double a); +double fpu_fabs(double a); +double fpu_fprem(double a, double b); +double fpu_fchs(double a); +double fpu_fyl2x(double a, double b); +double fpu_fpatan(double a, double b); +unsigned int fpu_fprem_lsb(double a, double b); +unsigned int fpu_fcom_c0(double a, double b); +unsigned int fpu_fcom_c1(double a, double b); +unsigned int fpu_fcom_c2(double a, double b); +unsigned int fpu_fcom_c3(double a, double b); +unsigned int fpu_fxam_c0(double a); +unsigned int fpu_fxam_c1(double a); +unsigned int fpu_fxam_c2(double a); +unsigned int fpu_fxam_c3(double a); double mem_32_to_double(unsigned int m); @@ -390,7 +390,6 @@ double int_64_to_double(uint64_t m); int16_t double_to_int_16(double d); int32_t double_to_int_32(double d); int64_t double_to_int_64(double d); -double fadd(double a, double b); unsigned int double_to_mem_32(double d); uint64_t double_to_mem_64(double d); diff --git a/test/core/asmblock.py b/test/core/asmblock.py index eb7b54b2..7f0dbc5f 100644 --- a/test/core/asmblock.py +++ b/test/core/asmblock.py @@ -41,6 +41,8 @@ assert len(blocks.pendings) == 0 assert len(blocks.nodes()) == 17 assert len(blocks.edges2constraint) == len(blocks.edges()) assert len(blocks.edges()) == 24 +assert blocks.getby_offset(0x63).lines[0].offset == 0x5f +assert blocks.getby_offset(0x69).lines[0].offset == 0x69 ## Convert to dot open("graph.dot", "w").write(blocks.dot()) diff --git a/test/ir/ir2C.py b/test/ir/ir2C.py index a966938b..c84473c3 100755 --- a/test/ir/ir2C.py +++ b/test/ir/ir2C.py @@ -40,7 +40,7 @@ class TestIrIr2C(unittest.TestCase): self.translationTest( ExprOp('bsr', *args[:1]), r'x86_bsr(0x0, 0x20)') self.translationTest( - ExprOp('cpuid0', *args[:2]), r'cpuid0(0x0, 0x1)') + ExprOp('cpuid', *args[:2]), r'cpuid(0x0, 0x1)') self.translationTest( ExprOp('fcom0', *args[:2]), r'fcom0(0x0, 0x1)') self.translationTest( |