# HG changeset patch # User Mike Pavone # Date 1357541145 28800 # Node ID 48eb62ba63bcf6285ac3b7718f2e62c6c83b2a0d # Parent 09761d4391e1b2a87ac7af0961c5a4ed06514198 Fix order of reading saved pc and swapping user and system stack pointers diff -r 09761d4391e1 -r 48eb62ba63bc m68k_to_x86.c --- a/m68k_to_x86.c Sun Jan 06 21:44:54 2013 -0800 +++ b/m68k_to_x86.c Sun Jan 06 22:45:45 2013 -0800 @@ -3343,6 +3343,10 @@ dst = call(dst, (uint8_t *)m68k_read_word_scratch1); dst = add_ir(dst, 2, opts->aregs[7], SZ_D); dst = call(dst, (uint8_t *)set_sr); + //Read saved PC + dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); + dst = call(dst, (uint8_t *)m68k_read_long_scratch1); + dst = add_ir(dst, 4, opts->aregs[7], SZ_D); //Check if we've switched to user mode and swap stack pointers if needed dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B); end_off = dst+1; @@ -3351,10 +3355,6 @@ dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D); dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D); *end_off = dst - (end_off+1); - //Read saved PC - dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); - dst = call(dst, (uint8_t *)m68k_read_long_scratch1); - dst = add_ir(dst, 4, opts->aregs[7], SZ_D); //Get native address, sync components, recalculate integer points and jump to returned address dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); dst = jmp_r(dst, SCRATCH1);