From 4cf2c9baeabf8b64b36170d864ec44e7215a89df Mon Sep 17 00:00:00 2001 From: Mike Pavone Date: Thu, 3 Oct 2013 21:21:47 -0700 Subject: Follow amd64 ABI stack alignment requirements in places it matters so we can call sprintf with floating point arguments without crashing --- runtime.S | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'runtime.S') diff --git a/runtime.S b/runtime.S index 357eabe..36ecfff 100644 --- a/runtime.S +++ b/runtime.S @@ -10,14 +10,22 @@ do_sync: call m68k_save_context mov %rsi, %rdi xor %esi, %esi + test $8, %esp + jnz adjust_rsp call sync_components + jmp done_adjust +adjust_rsp: + sub $8, %rsp + call sync_components + add $8, %rsp +done_adjust: mov %rax, %rsi call m68k_load_context pop %rdi pop %rcx skip_sync: ret - + sr_msg_int: .asciz "SR set to $%X due to interrupt\n" debug_print_sr_int: @@ -47,7 +55,7 @@ debug_print_sr: invalid_msg: .asciz "Invalid instruction at %X\n" - + .global m68k_invalid m68k_invalid: lea invalid_msg(%rip), %rdi @@ -60,7 +68,7 @@ m68k_invalid: .global bcd_add bcd_add: xchg %rax, %rdi - + mov %cl, %ch mov %al, %ah and $0xF, %ch @@ -82,14 +90,14 @@ def_adjust: add $0x60, %cl mov $1, %ch no_adjust_h: - + mov %rdi, %rax ret .global bcd_sub bcd_sub: xchg %rax, %rdi - + mov %cl, %ch mov %al, %ah and $0xF, %ch @@ -111,7 +119,7 @@ def_adjusts: sub $0x60, %cl mov $1, %ch no_adjust_hs: - + mov %rdi, %rax ret @@ -168,7 +176,7 @@ set_ccr: and $1, %cl mov %cl, (%rsi) ret - + .global m68k_modified_ret_addr m68k_modified_ret_addr: add $16, %rsp @@ -181,7 +189,15 @@ m68k_native_addr_and_sync: push %rcx mov %rsi, %rdi xor %esi, %esi + test $8, %rsp + jnz adjust_rsp_na + call sync_components + jmp no_adjust_rsp_na +adjust_rsp_na: + sub $8, %rsp call sync_components + add $8, %rsp +no_adjust_rsp_na: pop %rsi push %rax mov %rax, %rdi @@ -202,7 +218,7 @@ m68k_native_addr: pop %rsi call m68k_load_context ret - + .global m68k_retrans_stub m68k_retrans_stub: call m68k_save_context @@ -255,15 +271,15 @@ m68k_start_context: push %r13 push %r14 push %r15 - + call m68k_load_context call *%rdi call m68k_save_context - + pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp - + ret -- cgit v1.2.3