From 99f99efb4a7ab2fcae8b3ab6b80959c982a2aa69 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 25 Nov 2010 23:36:57 +0100 Subject: [PATCH] Fix stack alignment when resuming from a signal handler in the soft debugger. Fixes #647464. --- mono/mini/debugger-agent.c | 5 ++++- mono/mini/exceptions-amd64.c | 16 ++++++++++++++++ mono/mini/mini-amd64.h | 3 +-- mono/mini/mini.h | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 751d380b0c198..9286f4937cb86 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -3529,8 +3529,11 @@ resume_from_signal_handler (void *sigctx, void *func) mono_arch_sigctx_to_monoctx (sigctx, &ctx); memcpy (&tls->handler_ctx, &ctx, sizeof (MonoContext)); +#ifdef MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX + mono_arch_setup_resume_sighandler_ctx (&ctx, func); +#else MONO_CONTEXT_SET_IP (&ctx, func); - +#endif mono_arch_monoctx_to_sigctx (&ctx, sigctx); } diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index a212c836394d0..971e92469579e 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -1458,3 +1458,19 @@ mono_tasklets_arch_restore (void) } #endif +/* + * mono_arch_setup_resume_sighandler_ctx: + * + * Setup CTX so execution continues at FUNC. + */ +void +mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func) +{ + /* + * When resuming from a signal handler, the stack should be misaligned, just like right after + * a call. + */ + if ((((guint64)MONO_CONTEXT_GET_SP (ctx)) % 16) == 0) + MONO_CONTEXT_SET_SP (ctx, (guint64)MONO_CONTEXT_GET_SP (ctx) - 8); + MONO_CONTEXT_SET_IP (ctx, func); +} diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h index a16f957c2888d..8cf61a7c42888 100644 --- a/mono/mini/mini-amd64.h +++ b/mono/mini/mini-amd64.h @@ -376,8 +376,7 @@ typedef struct { #define MONO_ARCH_DYN_CALL_PARAM_AREA 0 #define MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE 1 - -#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_metadata_signature_equal ((caller_sig), (callee_sig)) +#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1 /* Used for optimization, not complete */ #define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE) diff --git a/mono/mini/mini.h b/mono/mini/mini.h index e68a3d669e532..a6b77626e3c23 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1709,6 +1709,7 @@ guint8* mono_arch_get_ip_for_breakpoint (MonoJitInfo *ji, MonoContext *c void mono_arch_skip_breakpoint (MonoContext *ctx) MONO_INTERNAL; void mono_arch_skip_single_step (MonoContext *ctx) MONO_INTERNAL; gpointer mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code) MONO_INTERNAL; +void mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func) MONO_INTERNAL; #endif MonoJitInfo *mono_arch_find_jit_info (MonoDomain *domain,