# HG changeset patch # User Michael Pavone # Date 1430273076 25200 # Node ID e11e689186916b2d5eb1ca0deb88edfea1ec6ca3 # Parent 74d636e85bf8b428a0dee2704092e9378b4e9479 Fix bug in map_native_address that was breaking some self-modifying code in Gunstar Heroes diff -r 74d636e85bf8 -r e11e68918691 backend_x86.c --- a/backend_x86.c Sat Mar 14 12:05:03 2015 -0700 +++ b/backend_x86.c Tue Apr 28 19:04:36 2015 -0700 @@ -175,6 +175,7 @@ mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size); + //FIXME: These adjustments to ram_flags_off need to take into account bits vs bytes and ram_flags_shift if (memmap[chunk].mask == opts->address_mask) { ram_flags_off += memmap[chunk].end - memmap[chunk].start; } else { diff -r 74d636e85bf8 -r e11e68918691 gen_x86.c --- a/gen_x86.c Sat Mar 14 12:05:03 2015 -0700 +++ b/gen_x86.c Tue Apr 28 19:04:36 2015 -0700 @@ -2135,9 +2135,15 @@ if (has_modrm(prefix, main_op)) { uint8_t mod_rm = *(code++); if (has_sib(mod_rm)) { - uint8_t sib = *(code++); - } else { - + //sib takes up a byte, but can't add any additional ones beyond that + code++; + } + uint8_t mode = mod_rm & 0xC0; + uint8_t rm = mod_rm & 3; + if (mode == MODE_REG_DISPLACE8) { + code++; + } else if (mode == MODE_REG_DISPLACE32 || (mode == MODE_REG_INDIRECT && rm == RBP)) { + code += 4; } } else { } diff -r 74d636e85bf8 -r e11e68918691 m68k_core.c --- a/m68k_core.c Sat Mar 14 12:05:03 2015 -0700 +++ b/m68k_core.c Tue Apr 28 19:04:36 2015 -0700 @@ -606,7 +606,7 @@ uint32_t masked = (address & opts->gen.memmap[i].mask); uint32_t final_off = masked + meta_off; uint32_t ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3); - context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3); + context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7); uint32_t slot = final_off / 1024; if (!opts->gen.ram_inst_sizes[slot]) { @@ -618,7 +618,7 @@ masked = (address + size - 1) & opts->gen.memmap[i].mask; final_off = masked + meta_off; ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3); - context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3); + context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7); } break; } else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {