about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/core/asmblock.py8
-rw-r--r--miasm2/ir/translators/C.py12
-rw-r--r--miasm2/jitter/vm_mngr.c50
-rw-r--r--miasm2/jitter/vm_mngr.h51
-rw-r--r--test/core/asmblock.py2
-rwxr-xr-xtest/ir/ir2C.py2
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(