diff options
author | Michael Pavone <pavone@retrodev.com> | 2014-02-16 18:17:59 -0800 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2014-02-16 18:17:59 -0800 |
commit | f97a9ef2967da65f867d5eaaa78bfb8cf84afe0e (patch) | |
tree | 78a096eb68ff67d9a1b2f2f08a150544298079d0 | |
parent | e60e8080b9946d78c9d3f67e4b7735a299b97a6c (diff) |
Generate retrans_stub at runtime so it can use the generated save/load_context functions
-rw-r--r-- | m68k_to_x86.c | 20 | ||||
-rw-r--r-- | m68k_to_x86.h | 1 | ||||
-rw-r--r-- | runtime.S | 10 |
3 files changed, 19 insertions, 12 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c index 5bfbe29..f3e6c46 100644 --- a/m68k_to_x86.c +++ b/m68k_to_x86.c @@ -34,7 +34,6 @@ void handle_cycle_limit(); void m68k_native_addr(); void m68k_native_addr_and_sync(); void m68k_invalid(); -void m68k_retrans_stub(); void set_sr(); void set_ccr(); void get_sr(); @@ -4016,7 +4015,24 @@ m68k_context * m68k_handle_code_write(uint32_t address, m68k_context * context) if (inst_start) { uint8_t * dst = get_native_address(context->native_code_map, inst_start); dst = mov_ir(dst, inst_start, SCRATCH2, SZ_D); - dst = jmp(dst, (uint8_t *)m68k_retrans_stub); + x86_68k_options * options = context->options; + if (!options->retrans_stub) { + if (options->code_end - options->cur_code < 32) { + size_t size = 1024*1024; + options->cur_code = alloc_code(&size); + options->code_end = options->cur_code + size; + } + uint8_t * rdst = options->retrans_stub = options->cur_code; + rdst = call(rdst, options->save_context); + rdst = push_r(rdst, CONTEXT); + rdst = call(rdst, (uint8_t *)m68k_retranslate_inst); + rdst = pop_r(rdst, CONTEXT); + rdst = mov_rr(rdst, RAX, SCRATCH1, SZ_Q); + rdst = call(rdst, options->load_context); + rdst = jmp_r(rdst, SCRATCH1); + options->cur_code = rdst; + } + dst = jmp(dst, options->retrans_stub); } return context; } diff --git a/m68k_to_x86.h b/m68k_to_x86.h index 297d8a5..520887c 100644 --- a/m68k_to_x86.h +++ b/m68k_to_x86.h @@ -41,6 +41,7 @@ typedef struct { uint8_t *save_context; uint8_t *load_context; start_fun start_context; + uint8_t *retrans_stub; } x86_68k_options; typedef struct { @@ -185,16 +185,6 @@ m68k_native_addr: call m68k_load_context ret - .global m68k_retrans_stub -m68k_retrans_stub: - call m68k_save_context - push %rsi - call m68k_retranslate_inst - pop %rsi - mov %rax, %rcx - call m68k_load_context - jmp *%rcx - .global m68k_save_context m68k_save_context: mov %bl, 1(%rsi) /* N Flag */ |