diff options
| author | Camille Mougey <commial@gmail.com> | 2018-02-14 12:13:24 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-14 12:13:24 +0100 |
| commit | dcfadb31685d428618b88f19fcc96dd70cecfc8f (patch) | |
| tree | 038c6c2f545d5a77ecb6c68f030107f09d32450f /miasm2/jitter/vm_mngr.c | |
| parent | b0e9f5da9b4546a22169882e656bf2776eab9754 (diff) | |
| parent | 6702a6149c57c54bcece3fb1cd00b8c09af6e74a (diff) | |
| download | focaccia-miasm-dcfadb31685d428618b88f19fcc96dd70cecfc8f.tar.gz focaccia-miasm-dcfadb31685d428618b88f19fcc96dd70cecfc8f.zip | |
Merge pull request #678 from serpilliere/x86_fix_rcl
X86 fix rcl
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 129 |
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; |