summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2015-01-01 17:31:59 -0800
committerMichael Pavone <pavone@retrodev.com>2015-01-01 17:31:59 -0800
commit574281b6ea14c8534582f088b1cbf128ba6b1d76 (patch)
treee5bc82bd61baf7716dbd5b85fae5c4dbcdc9ab53
parentec4eed4f35910aa27ca353fceea38155806ef188 (diff)
Fix some issues with 68K instruction retranslation
-rw-r--r--backend.c2
-rw-r--r--gen.h2
-rw-r--r--gen_x86.h2
-rw-r--r--m68k_core.c23
-rw-r--r--m68k_core_x86.c2
5 files changed, 15 insertions, 16 deletions
diff --git a/backend.c b/backend.c
index 86bc4b5..8f65f25 100644
--- a/backend.c
+++ b/backend.c
@@ -53,7 +53,7 @@ void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_fun
void * get_native_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts)
{
- memmap_chunk * memmap = opts->memmap;
+ memmap_chunk const * memmap = opts->memmap;
address &= opts->address_mask;
for (uint32_t chunk = 0; chunk < opts->memmap_chunks; chunk++)
{
diff --git a/gen.h b/gen.h
index e1492fc..b0fe5e1 100644
--- a/gen.h
+++ b/gen.h
@@ -17,6 +17,8 @@ typedef struct {
code_ptr last;
} code_info;
+void check_alloc_code(code_info *code, uint32_t inst_size);
+
void init_code_info(code_info *code);
void call(code_info *code, code_ptr fun);
void jmp(code_info *code, code_ptr dest);
diff --git a/gen_x86.h b/gen_x86.h
index 97bb9c2..0e614dc 100644
--- a/gen_x86.h
+++ b/gen_x86.h
@@ -80,8 +80,6 @@ enum {
MODE_IMMED = 0xFF
} x86_modes;
-void check_alloc_code(code_info *code, uint32_t inst_size);
-
void rol_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
void ror_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
void rcl_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
diff --git a/m68k_core.c b/m68k_core.c
index 1c0e65d..fd2f406 100644
--- a/m68k_core.c
+++ b/m68k_core.c
@@ -761,6 +761,7 @@ void translate_m68k_stream(uint32_t address, m68k_context * context)
do {
if (opts->address_log) {
fprintf(opts->address_log, "%X\n", address);
+ fflush(opts->address_log);
}
do {
encoded = get_native_pointer(address, (void **)context->mem_pointers, &opts->gen);
@@ -813,18 +814,19 @@ void * m68k_retranslate_inst(uint32_t address, m68k_context * context)
if (orig_size != MAX_NATIVE_SIZE) {
deferred_addr * orig_deferred = opts->gen.deferred;
- //make sure the beginning of the code for an instruction is contiguous
- check_code_prologue(code);
+ //make sure we have enough code space for the max size instruction
+ check_alloc_code(code, MAX_NATIVE_SIZE);
code_ptr native_start = code->cur;
translate_m68k(opts, &instbuf);
code_ptr native_end = code->cur;
- uint8_t is_terminal = m68k_is_terminal(&instbuf);
+ /*uint8_t is_terminal = m68k_is_terminal(&instbuf);
if ((native_end - native_start) <= orig_size) {
code_ptr native_next;
if (!is_terminal) {
native_next = get_native_address(context->native_code_map, orig + (after-inst)*2);
}
if (is_terminal || (native_next && ((native_next == orig_start + orig_size) || (orig_size - (native_end - native_start)) > 5))) {
+ printf("Using original location: %p\n", orig_code.cur);
remove_deferred_until(&opts->gen.deferred, orig_deferred);
code_info tmp;
tmp.cur = code->cur;
@@ -841,7 +843,7 @@ void * m68k_retranslate_inst(uint32_t address, m68k_context * context)
m68k_handle_deferred(context);
return orig_start;
}
- }
+ }*/
map_native_address(context, instbuf.address, native_start, (after-inst)*2, MAX_NATIVE_SIZE);
@@ -860,17 +862,14 @@ void * m68k_retranslate_inst(uint32_t address, m68k_context * context)
m68k_handle_deferred(context);
return native_start;
} else {
- code_info tmp;
- tmp.cur = code->cur;
- tmp.last = code->last;
- code->cur = orig_code.cur;
- code->last = orig_code.last;
+ code_info tmp = *code;
+ *code = orig_code;
translate_m68k(opts, &instbuf);
+ orig_code = *code;
+ *code = tmp;
if (!m68k_is_terminal(&instbuf)) {
- jmp(code, get_native_address_trans(context, orig + (after-inst)*2));
+ jmp(&orig_code, get_native_address_trans(context, orig + (after-inst)*2));
}
- code->cur = tmp.cur;
- code->last = tmp.last;
m68k_handle_deferred(context);
return orig_start;
}
diff --git a/m68k_core_x86.c b/m68k_core_x86.c
index c0964bd..8d9fc6a 100644
--- a/m68k_core_x86.c
+++ b/m68k_core_x86.c
@@ -2185,7 +2185,7 @@ void insert_breakpoint(m68k_context * context, uint32_t address, code_ptr bp_han
mov_ir(&native, address, opts->gen.scratch1, SZ_D);
if (!bp_stub) {
code_info *code = &opts->gen.code;
- check_alloc_code(code, 5);
+ check_code_prologue(code);
bp_stub = code->cur;
call(&native, bp_stub);