diff options
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 26 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 11 |
2 files changed, 24 insertions, 13 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 950528f9..188f0372 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -597,10 +597,10 @@ int shift_right_arith_32(int a, unsigned int b) return (i32_a >> b)&0xffffffff; } */ -unsigned int shift_right_logic(unsigned int size, - unsigned int a, unsigned int b) +uint64_t shift_right_logic(uint64_t size, + uint64_t a, uint64_t b) { - unsigned int u32_a; + uint64_t u32_a; unsigned short u16_a; unsigned char u8_a; switch(size){ @@ -614,7 +614,7 @@ unsigned int shift_right_logic(unsigned int size, u32_a = a; return (u32_a >> b)&0xffffffff; default: - fprintf(stderr, "inv size in shift %d\n", size); + fprintf(stderr, "inv size in shift %"PRIx64"\n", size); exit(0); } } @@ -640,7 +640,8 @@ int shift_right_logic_32(unsigned int a, unsigned int b) return (u32_a >> b)&0xffffffff; } */ -int shift_left_logic(unsigned int size, unsigned int a, unsigned int b) + +uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b) { switch(size){ case 8: @@ -649,8 +650,10 @@ int shift_left_logic(unsigned int size, unsigned int a, unsigned int b) return (a<<b)&0xffff; case 32: return (a<<b)&0xffffffff; + case 64: + return (a<<b)&0xffffffffffffffff; default: - fprintf(stderr, "inv size in shift %d\n", size); + fprintf(stderr, "inv size in shift %"PRIx64"\n", size); exit(0); } } @@ -788,11 +791,11 @@ unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned } -unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b) +uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b) { - unsigned int tmp; + uint64_t tmp; - b = b&0x1F; + b = b&0x3F; b %= size; switch(size){ case 8: @@ -804,8 +807,11 @@ unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b) case 32: tmp = (a << b) | ((a&0xFFFFFFFF) >> (size-b)); return tmp&0xffffffff; + case 64: + tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size-b)); + return tmp&0xFFFFFFFFFFFFFFFF; default: - fprintf(stderr, "inv size in rotleft %d\n", size); + fprintf(stderr, "inv size in rotleft %"PRIX64"\n", size); exit(0); } } diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index deb56042..92e0f7ed 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -177,8 +177,9 @@ unsigned int my_imul08(unsigned int a, unsigned int b); void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags); int shift_right_arith(unsigned int size, int a, unsigned int b); -unsigned int shift_right_logic(unsigned int size, unsigned int a, unsigned int b); -int shift_left_logic(unsigned int size, unsigned 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); /* int shift_left_logic_08(unsigned int a, unsigned int b); int shift_left_logic_16(unsigned int a, unsigned int b); @@ -200,7 +201,7 @@ unsigned int umul16_hi(unsigned short a, unsigned short b); unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c); unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c); -unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b); +uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b); unsigned int rot_right(unsigned int size, unsigned int a, unsigned int b); int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf); int rcl_cf_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf); @@ -352,6 +353,8 @@ unsigned int load_tr_segment_selector(unsigned int d); ((((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)\ + ((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff) #define shift_left_logic_08(a, b)\ (((a)<<((b)&0x1f))&0xff) @@ -359,5 +362,7 @@ unsigned int load_tr_segment_selector(unsigned int d); (((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) #endif |