# HG changeset patch # User Michael Pavone # Date 1419637531 28800 # Node ID f0061e3d2ad9ec09b6e52d2ffa76eaa1ea80675a # Parent a9dcaacdc0c526be49c6223a699667f562b454af Fix a few bugs introduced in the Z80 core from the adjustments to fit with the code gen refactor diff -r a9dcaacdc0c5 -r f0061e3d2ad9 backend.h --- a/backend.h Fri Dec 26 13:42:25 2014 -0800 +++ b/backend.h Fri Dec 26 15:45:31 2014 -0800 @@ -108,6 +108,7 @@ void cycles(cpu_options *opts, uint32_t num); void check_cycles_int(cpu_options *opts, uint32_t address); void check_cycles(cpu_options * opts); +void check_code_prologue(code_info *code); code_ptr gen_mem_fun(cpu_options * opts, memmap_chunk const * memmap, uint32_t num_chunks, ftype fun_type, code_ptr *after_inc); diff -r a9dcaacdc0c5 -r f0061e3d2ad9 backend_x86.c --- a/backend_x86.c Fri Dec 26 13:42:25 2014 -0800 +++ b/backend_x86.c Fri Dec 26 15:45:31 2014 -0800 @@ -28,6 +28,11 @@ *jmp_off = code->cur - (jmp_off+1); } +void check_code_prologue(code_info *code) +{ + check_alloc_code(code, MAX_INST_LEN*4); +} + code_ptr gen_mem_fun(cpu_options * opts, memmap_chunk const * memmap, uint32_t num_chunks, ftype fun_type, code_ptr *after_inc) { code_info *code = &opts->code; diff -r a9dcaacdc0c5 -r f0061e3d2ad9 m68k_core_x86.c --- a/m68k_core_x86.c Fri Dec 26 13:42:25 2014 -0800 +++ b/m68k_core_x86.c Fri Dec 26 15:45:31 2014 -0800 @@ -2061,11 +2061,6 @@ call(code, (code_ptr)exit); } -void check_code_prologue(code_info *code) -{ - check_alloc_code(code, MAX_INST_LEN*4); -}; - void nop_fill_or_jmp_next(code_info *code, code_ptr old_end, code_ptr next_inst) { if (next_inst == old_end && next_inst - code->cur < 2) { diff -r a9dcaacdc0c5 -r f0061e3d2ad9 m68k_internal.h --- a/m68k_internal.h Fri Dec 26 13:42:25 2014 -0800 +++ b/m68k_internal.h Fri Dec 26 15:45:31 2014 -0800 @@ -10,7 +10,6 @@ //functions implemented in host CPU specfic file void translate_out_of_bounds(code_info *code); -void check_code_prologue(code_info *code); void areg_to_native(m68k_options *opts, uint8_t reg, uint8_t native_reg); void dreg_to_native(m68k_options *opts, uint8_t reg, uint8_t native_reg); void areg_to_native_sx(m68k_options *opts, uint8_t reg, uint8_t native_reg); diff -r a9dcaacdc0c5 -r f0061e3d2ad9 z80_to_x86.c --- a/z80_to_x86.c Fri Dec 26 13:42:25 2014 -0800 +++ b/z80_to_x86.c Fri Dec 26 15:45:31 2014 -0800 @@ -1303,7 +1303,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, inst->immed, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1352,7 +1352,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, dest_addr, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1371,7 +1371,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, dest_addr, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1406,7 +1406,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, dest_addr, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1429,7 +1429,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, dest_addr, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1450,7 +1450,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, inst->immed, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1498,7 +1498,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, inst->immed, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); } else { @@ -1582,7 +1582,7 @@ if (!call_dst) { opts->gen.deferred = defer_address(opts->gen.deferred, inst->immed, code->cur + 1); //fake address to force large displacement - call_dst + 256; + call_dst = code->cur + 256; } jmp(code, call_dst); break; @@ -1815,10 +1815,12 @@ code->cur = orig_start; code->last = orig_start + ZMAX_NATIVE_SIZE; translate_z80inst(&instbuf, context, address); + code_info tmp2 = *code; + *code = tmp_code; if (!z80_is_terminal(&instbuf)) { - jmp(code, z80_get_native_address_trans(context, address + after-inst)); + + jmp(&tmp2, z80_get_native_address_trans(context, address + after-inst)); } - *code = tmp_code; z80_handle_deferred(context); return orig_start; } @@ -1855,6 +1857,8 @@ jmp(&opts->gen.code, existing); break; } + //make sure prologue is in a contiguous chunk of code + check_code_prologue(&opts->gen.code); next = z80_decode(encoded, &inst); #ifdef DO_DEBUG_PRINT z80_disasm(&inst, disbuf, address); @@ -2228,12 +2232,12 @@ { static uint8_t * bp_stub = NULL; z80_options * opts = context->options; - uint8_t * native = z80_get_native_address_trans(context, address); + code_ptr native = z80_get_native_address_trans(context, address); code_info tmp_code = {native, native+16}; mov_ir(&tmp_code, address, opts->gen.scratch1, SZ_W); if (!bp_stub) { code_info *code = &opts->gen.code; - //TODO: do an alloc check here to make sure the prologue length calc works + check_code_prologue(code); bp_stub = code->cur; call(&tmp_code, bp_stub); @@ -2257,13 +2261,13 @@ uint8_t * jmp_off = code->cur+1; jcc(code, CC_NC, code->cur + 7); pop_r(code, opts->gen.scratch1); - add_ir(code, check_int_size - (code->cur-native), opts->gen.scratch1, SZ_Q); + add_ir(code, check_int_size - (tmp_code.cur-native), opts->gen.scratch1, SZ_Q); push_r(code, opts->gen.scratch1); jmp(code, opts->gen.handle_cycle_limit_int); *jmp_off = code->cur - (jmp_off+1); //jump back to body of translated instruction pop_r(code, opts->gen.scratch1); - add_ir(code, check_int_size - (code->cur-native), opts->gen.scratch1, SZ_Q); + add_ir(code, check_int_size - (tmp_code.cur-native), opts->gen.scratch1, SZ_Q); jmp_r(code, opts->gen.scratch1); } else { call(&tmp_code, bp_stub);