+2009-09-22 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-exceptions.c (mini_jit_info_table_find): New helper function which
+ searches all the domains of the current thread.
+
+ * exceptions-<ARCH>.c: Use it. Fixes #539394.
+
2009-09-21 Zoltan Varga <vargaz@gmail.com>
* exceptions-arm.c (mono_arm_throw_exception): Set ctx->ebp to fp instead of sp
((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
if (!(*lmf)->method)
return (gpointer)-1;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
rip = *(guint64*)((*lmf)->rsp - sizeof (gpointer));
}
- ji = mono_jit_info_table_find (domain, (gpointer)rip);
+ ji = mini_jit_info_table_find (domain, (gpointer)rip);
if (!ji) {
// FIXME: This can happen with multiple appdomains (bug #444383)
return (gpointer)-1;
MonoException *exc = NULL;
ucontext_t *ctx = (ucontext_t*)sigctx;
guint64 *gregs = gregs_from_ucontext (ctx);
- MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), (gpointer)gregs [REG_RIP]);
+ MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)gregs [REG_RIP]);
gpointer *sp;
int frame_size;
PMonoUnwindInfo targetinfo;
MonoDomain *domain = mono_domain_get ();
- ji = mono_jit_info_table_find (domain, (char*)ControlPc);
+ ji = mini_jit_info_table_find (domain, (char*)ControlPc);
if (!ji)
return 0;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
*new_ctx = *ctx;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
if (!(*lmf)->method)
return (gpointer)-1;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
if (!(*lmf)->method)
return (gpointer)-1;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
res = unw_get_reg (&ctx.cursor, UNW_IA64_SP, &sp);
g_assert (res == 0);
- ji = mono_jit_info_table_find (mono_domain_get (), (gpointer)ip);
+ ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)ip);
//printf ("UN: %s %lx %lx\n", ji ? ji->method->name : "", ip, sp);
if (prev_ji && ((guint8*)ip > (guint8*)prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, (gpointer)ip);
+ ji = mini_jit_info_table_find (domain, (gpointer)ip);
if (managed)
*managed = FALSE;
res = unw_get_reg (&ctx.cursor, UNW_IA64_IP, &ip);
g_assert (res == 0);
- ji = mono_jit_info_table_find (mono_domain_get (), (gpointer)ip);
+ ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)ip);
if (ji)
break;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
}
g_assert (((*lmf)->magic == MIPS_LMF_MAGIC1) || ((*lmf)->magic == MIPS_LMF_MAGIC2));
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
*new_ctx = *ctx;
setup_context (new_ctx);
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
if (!(*lmf)->method)
return (gpointer)-1;
#ifdef MONO_ARCH_USE_SIGACTION
os_ucontext *uc = (ucontext_t*)sigctx;
os_ucontext *uc_copy;
- MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context (sigctx));
+ MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context (sigctx));
gpointer *sp;
int frame_size;
((guint8 *) ip <= ((guint8 *) prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
if (!(*lmf)->method)
return (gpointer)-1;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
((guint8 *) ip <= ((guint8 *) prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
if (!(*lmf)->method)
return (gpointer)-1;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
if (!(*lmf)->method)
return (gpointer)-1;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->ip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->ip))) {
} else {
memset (res, 0, MONO_SIZEOF_JIT_INFO);
res->method = (*lmf)->method;
if (prev_ji && (ip > prev_ji->code_start && ((guint8*)ip < ((guint8*)prev_ji->code_start) + prev_ji->code_size)))
ji = prev_ji;
else
- ji = mono_jit_info_table_find (domain, ip);
+ ji = mini_jit_info_table_find (domain, ip);
if (managed)
*managed = FALSE;
*new_ctx = *ctx;
- if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
+ if ((ji = mini_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
} else {
if (!((guint32)((*lmf)->previous_lmf) & 1))
/* Top LMF entry */
#ifdef MONO_ARCH_USE_SIGACTION
MonoException *exc = NULL;
ucontext_t *ctx = (ucontext_t*)sigctx;
- MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), (gpointer)UCONTEXT_REG_EIP (ctx));
+ MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)UCONTEXT_REG_EIP (ctx));
gpointer *sp;
int frame_size;
*/
if (!ji && fault_addr == (gpointer)UCONTEXT_REG_EIP (ctx)) {
glong *sp = (gpointer)UCONTEXT_REG_ESP (ctx);
- ji = mono_jit_info_table_find (mono_domain_get (), (gpointer)sp [0]);
+ ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)sp [0]);
if (ji)
UCONTEXT_REG_EIP (ctx) = sp [0];
}
return catch_class;
}
+/*
+ * mini_jit_info_table_find:
+ *
+ * Same as mono_jit_info_table_find, but search all the domains of the current thread
+ * if ADDR is not found in DOMAIN.
+ */
+MonoJitInfo*
+mini_jit_info_table_find (MonoDomain *domain, char *addr)
+{
+ MonoJitInfo *ji;
+ MonoThread *t = mono_thread_current ();
+ GSList *l;
+
+ ji = mono_jit_info_table_find (domain, addr);
+ if (ji)
+ return ji;
+
+ for (l = t->appdomain_refs; l; l = l->next) {
+ if (l->data != domain) {
+ ji = mono_jit_info_table_find ((MonoDomain*)l->data, addr);
+ if (ji)
+ return ji;
+ }
+ }
+
+ return NULL;
+}
+
/**
* mono_handle_exception_internal:
* @ctx: saved processor state
void mono_setup_altstack (MonoJitTlsData *tls) MONO_INTERNAL;
void mono_free_altstack (MonoJitTlsData *tls) MONO_INTERNAL;
gpointer mono_altstack_restore_prot (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
+MonoJitInfo* mini_jit_info_table_find (MonoDomain *domain, char *addr) MONO_INTERNAL;
MonoJitInfo * mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, MonoJitInfo *prev_ji, MonoContext *ctx, MonoContext *new_ctx, char **trace, MonoLMF **lmf, int *native_offset, gboolean *managed) MONO_INTERNAL;