about summary refs log tree commit diff stats
path: root/miasm2/jitter/vm_mngr.c
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
-rw-r--r--miasm2/jitter/vm_mngr.c129
1 files changed, 59 insertions, 70 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index c628aeff..3c324a08 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -245,7 +245,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6
 			ret = set_endian64(vm_mngr, ret);
 			break;
 		default:
-			exit(0);
+			exit(EXIT_FAILURE);
 			break;
 		}
 	}
@@ -277,7 +277,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6
 			ret = set_endian64(vm_mngr, ret);
 			break;
 		default:
-			exit(0);
+			exit(EXIT_FAILURE);
 			break;
 		}
 	}
@@ -330,7 +330,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size,
 			*((uint64_t*)addr) = src&0xFFFFFFFFFFFFFFFFULL;
 			break;
 		default:
-			exit(0);
+			exit(EXIT_FAILURE);
 			break;
 		}
 	}
@@ -351,7 +351,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size,
 			src = set_endian64(vm_mngr, src);
 			break;
 		default:
-			exit(0);
+			exit(EXIT_FAILURE);
 			break;
 		}
 		while (my_size){
@@ -607,7 +607,7 @@ int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t s
        *buffer_ptr = buffer;
        if (!buffer){
 	      fprintf(stderr, "Error: cannot alloc read\n");
-	      exit(-1);
+	      exit(EXIT_FAILURE);
        }
 
        /* read is multiple page wide */
@@ -681,7 +681,7 @@ unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
 		case 8: mask = 0xff; break;
 		case 16: mask = 0xffff; break;
 		case 32: mask = 0xffffffff; break;
-		default: fprintf(stderr, "inv size in mul %d\n", size); exit(0);
+		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
 	}
 
 	a &= mask;
@@ -698,7 +698,7 @@ unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b)
 		case 8: mask = 0xff; break;
 		case 16: mask = 0xffff; break;
 		case 32: mask = 0xffffffff; break;
-		default: fprintf(stderr, "inv size in mul %d\n", size); exit(0);
+		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
 	}
 
 	a &= mask;
@@ -760,24 +760,37 @@ uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
 {
     uint64_t tmp;
 
-    b = b&0x3F;
+    b = b & 0x3F;
     b %= size;
     switch(size){
 	    case 8:
-		    tmp = (a << b) | ((a&0xFF) >> (size-b));
-		    return tmp&0xff;
+		    tmp = (a << b) | ((a & 0xFF) >> (size - b));
+		    return tmp & 0xFF;
 	    case 16:
-		    tmp = (a << b) | ((a&0xFFFF) >> (size-b));
-		    return tmp&0xffff;
+		    tmp = (a << b) | ((a & 0xFFFF) >> (size - b));
+		    return tmp & 0xFFFF;
 	    case 32:
-		    tmp = (a << b) | ((a&0xFFFFFFFF) >> (size-b));
-		    return tmp&0xffffffff;
+		    tmp = (a << b) | ((a & 0xFFFFFFFF) >> (size - b));
+		    return tmp & 0xFFFFFFFF;
 	    case 64:
-		    tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size-b));
-		    return tmp&0xFFFFFFFFFFFFFFFF;
+		    tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size - b));
+		    return tmp & 0xFFFFFFFFFFFFFFFF;
+
+	    /* Support cases for rcl */
+	    case 9:
+		    tmp = (a << b) | ((a & 0x1FF) >> (size - b));
+		    return tmp & 0x1FF;
+	    case 17:
+		    tmp = (a << b) | ((a & 0x1FFFF) >> (size - b));
+		    return tmp & 0x1FFFF;
+	    case 33:
+		    tmp = (a << b) | ((a & 0x1FFFFFFFF) >> (size - b));
+		    return tmp & 0x1FFFFFFFF;
+	    /* TODO XXX: support rcl in 64 bit mode */
+
 	    default:
 		    fprintf(stderr, "inv size in rotleft %"PRIX64"\n", size);
-		    exit(0);
+		    exit(EXIT_FAILURE);
     }
 }
 
@@ -785,62 +798,38 @@ uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
 {
     uint64_t tmp;
 
-    b = b&0x3F;
+    b = b & 0x3F;
     b %= size;
     switch(size){
 	    case 8:
-		    tmp = ((a&0xFF) >> b) | (a << (size-b));
-		    return tmp&0xff;
+		    tmp = ((a & 0xFF) >> b) | (a << (size - b));
+		    return tmp & 0xff;
 	    case 16:
-		    tmp = ((a&0xFFFF) >> b) | (a << (size-b));
-		    return tmp&0xffff;
+		    tmp = ((a & 0xFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFF;
 	    case 32:
-		    tmp = ((a&0xFFFFFFFF) >> b) | (a << (size-b));
-		    return tmp&0xffffffff;
+		    tmp = ((a & 0xFFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFFFFFF;
 	    case 64:
-		    tmp = ((a&0xFFFFFFFFFFFFFFFF) >> b) | (a << (size-b));
-		    return tmp&0xFFFFFFFFFFFFFFFF;
+		    tmp = ((a & 0xFFFFFFFFFFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFFFFFFFFFFFFFF;
+
+	    /* Support cases for rcr */
+	    case 9:
+		    tmp = ((a & 0x1FF) >> b) | (a << (size - b));
+		    return tmp & 0x1FF;
+	    case 17:
+		    tmp = ((a & 0x1FFFF) >> b) | (a << (size - b));
+		    return tmp & 0x1FFFF;
+	    case 33:
+		    tmp = ((a & 0x1FFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0x1FFFFFFFF;
+	    /* TODO XXX: support rcr in 64 bit mode */
+
 	    default:
 		    fprintf(stderr, "inv size in rotright %"PRIX64"\n", size);
-		    exit(0);
-    }
-}
-
-
-unsigned int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
-{
-    uint64_t tmp;
-    uint64_t tmp_count;
-    uint64_t tmp_cf;
-
-    tmp = a;
-    // TODO 64bit mode
-    tmp_count = (b & 0x1f) % (size + 1);
-    while (tmp_count != 0) {
-	    tmp_cf = (tmp >> (size - 1)) & 1;
-	    tmp = (tmp << 1) + cf;
-	    cf = tmp_cf;
-	    tmp_count -= 1;
-    }
-    return tmp;
-}
-
-unsigned int rcr_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
-{
-    uint64_t tmp;
-    uint64_t tmp_count;
-    uint64_t tmp_cf;
-
-    tmp = a;
-    // TODO 64bit mode
-    tmp_count = (b & 0x1f) % (size + 1);
-    while (tmp_count != 0) {
-	    tmp_cf = tmp & 1;
-	    tmp = (tmp >> 1) + (cf << (size - 1));
-	    cf = tmp_cf;
-	    tmp_count -= 1;
+		    exit(EXIT_FAILURE);
     }
-    return tmp;
 }
 
 unsigned int x86_bsr(uint64_t size, uint64_t src)
@@ -852,7 +841,7 @@ unsigned int x86_bsr(uint64_t size, uint64_t src)
 			return i;
 	}
 	fprintf(stderr, "sanity check error bsr\n");
-	exit(0);
+	exit(EXIT_FAILURE);
 }
 
 unsigned int x86_bsf(uint64_t size, uint64_t src)
@@ -863,7 +852,7 @@ unsigned int x86_bsf(uint64_t size, uint64_t src)
 			return i;
 	}
 	fprintf(stderr, "sanity check error bsf\n");
-	exit(0);
+	exit(EXIT_FAILURE);
 }
 
 
@@ -884,7 +873,7 @@ unsigned int cpuid(unsigned int a, unsigned int reg_num)
 {
 	if (reg_num >3){
 		fprintf(stderr, "not implemented cpuid reg %x\n", reg_num);
-		exit(-1);
+		exit(EXIT_FAILURE);
 	}
 
 	if (a == 0){
@@ -918,7 +907,7 @@ unsigned int cpuid(unsigned int a, unsigned int reg_num)
 	}
 	else{
 		fprintf(stderr, "WARNING not implemented cpuid index %X!\n", a);
-		//exit(-1);
+		//exit(EXIT_FAILURE);
 	}
 	return 0;
 }
@@ -1400,7 +1389,7 @@ struct code_bloc_node * create_code_bloc_node(uint64_t ad_start, uint64_t ad_sto
 	cbp = malloc(sizeof(*cbp));
 	if (!cbp){
 		fprintf(stderr, "Error: cannot alloc cbp\n");
-		exit(-1);
+		exit(EXIT_FAILURE);
 	}
 
 	cbp->ad_start = ad_start;
@@ -1630,7 +1619,7 @@ void add_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, uint64_t size, unsig
 	mpn_a = malloc(sizeof(*mpn_a));
 	if (!mpn_a) {
 		fprintf(stderr, "Error: cannot alloc\n");
-		exit(0);
+		exit(EXIT_FAILURE);
 	}
 	mpn_a->ad = ad;
 	mpn_a->size = size;