about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorWilliam Bruneau <william.bruneau@epfedu.fr>2017-07-25 15:12:40 +0200
committerGitHub <noreply@github.com>2017-07-25 15:12:40 +0200
commitd9eecbf960e4a097e050e1ce1adb52999e4da76f (patch)
treed1e257c0866fd6fb3481063d6f593c1e51e1a2a8
parentb088e965b09abedad4e62664c05b06a65522a80e (diff)
parente440a51fdcd27ac08ec40c9c9fed78895302e980 (diff)
downloadmiasm-d9eecbf960e4a097e050e1ce1adb52999e4da76f.tar.gz
miasm-d9eecbf960e4a097e050e1ce1adb52999e4da76f.zip
Merge pull request #590 from serpilliere/fix_macro_shift
Jitter: fix shifter macro
-rw-r--r--miasm2/ir/translators/C.py8
-rw-r--r--miasm2/jitter/vm_mngr.c60
-rw-r--r--miasm2/jitter/vm_mngr.h48
3 files changed, 22 insertions, 94 deletions
diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py
index 1dfdbb00..7a3080ca 100644
--- a/miasm2/ir/translators/C.py
+++ b/miasm2/ir/translators/C.py
@@ -76,10 +76,10 @@ class TranslatorC(Translator):
                     self.from_expr(expr.args[0]), size2mask(expr.args[0].size),
                     self.from_expr(expr.args[1]), size2mask(expr.args[1].size))
             elif expr.op in self.dct_shift:
-                return 'shift_%s_%.2d(%s , %s)' % (self.dct_shift[expr.op],
-                                                   expr.args[0].size,
-                                                   self.from_expr(expr.args[0]),
-                                                   self.from_expr(expr.args[1]))
+                return 'SHIFT_%s(%d, %s, %s)' % (self.dct_shift[expr.op].upper(),
+                                                 expr.args[0].size,
+                                                 self.from_expr(expr.args[0]),
+                                                 self.from_expr(expr.args[1]))
             elif expr.is_associative() or expr.op in ["%", "/"]:
                 oper = ['(%s&0x%x)' % (self.from_expr(arg), size2mask(arg.size))
                         for arg in expr.args]
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 0df1abaf..59cbdf6e 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -673,66 +673,6 @@ int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size)
        return 1;
 }
 
-int shift_right_arith(unsigned int size, int a, unsigned int b)
-{
-    int i32_a;
-    short i16_a;
-    char i8_a;
-    switch(size){
-	    case 8:
-		    i8_a = a;
-		    return (i8_a >> b)&0xff;
-	    case 16:
-		    i16_a = a;
-		    return (i16_a >> b)&0xffff;
-	    case 32:
-		    i32_a = a;
-		    return (i32_a >> b)&0xffffffff;
-	    default:
-		    fprintf(stderr, "inv size in shift %d\n", size);
-		    exit(0);
-    }
-}
-
-uint64_t shift_right_logic(uint64_t size,
-			   uint64_t a, uint64_t b)
-{
-    uint64_t u32_a;
-    unsigned short u16_a;
-    unsigned char u8_a;
-    switch(size){
-	    case 8:
-		    u8_a = a;
-		    return (u8_a >> b)&0xff;
-	    case 16:
-		    u16_a = a;
-		    return (u16_a >> b)&0xffff;
-	    case 32:
-		    u32_a = a;
-		    return (u32_a >> b)&0xffffffff;
-	    default:
-		    fprintf(stderr, "inv size in shift %"PRIx64"\n", size);
-		    exit(0);
-    }
-}
-
-uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b)
-{
-    switch(size){
-	    case 8:
-		    return (a<<b)&0xff;
-	    case 16:
-		    return (a<<b)&0xffff;
-	    case 32:
-		    return (a<<b)&0xffffffff;
-	    case 64:
-		    return (a<<b)&0xffffffffffffffff;
-	    default:
-		    fprintf(stderr, "inv size in shift %"PRIx64"\n", size);
-		    exit(0);
-    }
-}
-
 unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
 {
 	unsigned int mask;
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index 74ad49ad..757c3b3e 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -199,10 +199,7 @@ unsigned int my_imul08(unsigned int a, unsigned int b);
 
 int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size);
 void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags);
-int shift_right_arith(unsigned int size, int a, unsigned int b);
 
-uint64_t shift_right_logic(uint64_t size, uint64_t a, uint64_t b);
-uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b);
 unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b);
 unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b);
 unsigned int imul_lo_op_08(char a, char b);
@@ -402,32 +399,23 @@ unsigned int load_segment_limit(unsigned int d);
 unsigned int load_segment_limit_ok(unsigned int d);
 
 unsigned int load_tr_segment_selector(unsigned int d);
-#define shift_right_arith_08(a, b)\
-	((((char)(a)) >> ((int)(b)&0x1f))&0xff)
-#define shift_right_arith_16(a, b)\
-	((((short)(a)) >> ((int)(b)&0x1f))&0xffff)
-#define shift_right_arith_32(a, b)\
-	((((int)(a)) >> ((int)(b)&0x1f))&0xffffffff)
-#define shift_right_arith_64(a, b)\
-	((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff)
-
-
-#define shift_right_logic_08(a, b)\
-	((((unsigned char)(a)) >> ((unsigned int)(b)&0x1f))&0xff)
-#define shift_right_logic_16(a, b)\
-	((((unsigned short)(a)) >> ((unsigned int)(b)&0x1f))&0xffff)
-#define shift_right_logic_32(a, b)\
-	((((unsigned int)(a)) >> ((unsigned int)(b)&0x1f))&0xffffffff)
-#define shift_right_logic_64(a, b)\
-	((((uint64_t)(a)) >> ((uint64_t)(b)&0x3f))&0xffffffffffffffff)
-
-#define shift_left_logic_08(a, b)\
-	(((a)<<((b)&0x1f))&0xff)
-#define shift_left_logic_16(a, b)\
-	(((a)<<((b)&0x1f))&0xffff)
-#define shift_left_logic_32(a, b)\
-	(((a)<<((b)&0x1f))&0xffffffff)
-#define shift_left_logic_64(a, b)\
-	(((a)<<((b)&0x3f))&0xffffffffffffffff)
+
+
+#define SHIFT_RIGHT_ARITH(size, value, shift)				\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      (((int ## size ## _t) (value)) < 0 ? -1 : 0) : \
+			      (((int ## size ## _t) (value)) >> (shift))))
+
+#define SHIFT_RIGHT_LOGIC(size, value, shift)				\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      0 :					\
+			      (((uint ## size ## _t) (value)) >> (shift))))
+
+#define SHIFT_LEFT_LOGIC(size, value, shift)		\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      0 :					\
+			      (((uint ## size ## _t) (value)) << (shift))))
+
+
 
 #endif