Navigation Menu

Skip to content

Commit

Permalink
Fix stack alignment when resuming from a signal handler in the soft d…
Browse files Browse the repository at this point in the history
…ebugger. Fixes #647464.
  • Loading branch information
vargaz committed Nov 25, 2010
1 parent 4905ef1 commit 99f99ef
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 3 deletions.
5 changes: 4 additions & 1 deletion mono/mini/debugger-agent.c
Expand Up @@ -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);
}

Expand Down
16 changes: 16 additions & 0 deletions mono/mini/exceptions-amd64.c
Expand Up @@ -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);
}
3 changes: 1 addition & 2 deletions mono/mini/mini-amd64.h
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions mono/mini/mini.h
Expand Up @@ -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,
Expand Down

0 comments on commit 99f99ef

Please sign in to comment.