summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2014-02-16 18:17:59 -0800
committerMichael Pavone <pavone@retrodev.com>2014-02-16 18:17:59 -0800
commitf97a9ef2967da65f867d5eaaa78bfb8cf84afe0e (patch)
tree78a096eb68ff67d9a1b2f2f08a150544298079d0
parente60e8080b9946d78c9d3f67e4b7735a299b97a6c (diff)
Generate retrans_stub at runtime so it can use the generated save/load_context functions
-rw-r--r--m68k_to_x86.c20
-rw-r--r--m68k_to_x86.h1
-rw-r--r--runtime.S10
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 {
diff --git a/runtime.S b/runtime.S
index cb66d13..571e9de 100644
--- a/runtime.S
+++ b/runtime.S
@@ -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 */