From 61fbf159c3b6ffcf896e0da00be6340c61a05788 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 22 Sep 2009 12:32:32 +0000 Subject: [PATCH] 2009-09-22 Zoltan Varga * mini-exceptions.c (mini_jit_info_table_find): New helper function which searches all the domains of the current thread. * exceptions-.c: Use it. Fixes #539394. svn path=/trunk/mono/; revision=142389 --- mono/mini/ChangeLog | 7 +++++++ mono/mini/exceptions-alpha.c | 4 ++-- mono/mini/exceptions-amd64.c | 8 ++++---- mono/mini/exceptions-arm.c | 4 ++-- mono/mini/exceptions-hppa.c | 4 ++-- mono/mini/exceptions-ia64.c | 6 +++--- mono/mini/exceptions-mips.c | 4 ++-- mono/mini/exceptions-ppc.c | 6 +++--- mono/mini/exceptions-s390.c | 4 ++-- mono/mini/exceptions-s390x.c | 4 ++-- mono/mini/exceptions-sparc.c | 4 ++-- mono/mini/exceptions-x86.c | 8 ++++---- mono/mini/mini-exceptions.c | 28 ++++++++++++++++++++++++++++ mono/mini/mini.h | 1 + 14 files changed, 64 insertions(+), 28 deletions(-) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 888708a69b1..06ba62ede9d 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,10 @@ +2009-09-22 Zoltan Varga + + * mini-exceptions.c (mini_jit_info_table_find): New helper function which + searches all the domains of the current thread. + + * exceptions-.c: Use it. Fixes #539394. + 2009-09-21 Zoltan Varga * exceptions-arm.c (mono_arm_throw_exception): Set ctx->ebp to fp instead of sp diff --git a/mono/mini/exceptions-alpha.c b/mono/mini/exceptions-alpha.c index 4a3a5bbcdd4..97a245a3fa8 100644 --- a/mono/mini/exceptions-alpha.c +++ b/mono/mini/exceptions-alpha.c @@ -796,7 +796,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, ((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; @@ -975,7 +975,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, 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; diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index c48cbef3c4b..c9d111687f8 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -548,7 +548,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -641,7 +641,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -850,7 +850,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean 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; @@ -1247,7 +1247,7 @@ MONO_GET_RUNTIME_FUNCTION_CALLBACK ( DWORD64 ControlPc, IN PVOID Context ) 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; diff --git a/mono/mini/exceptions-arm.c b/mono/mini/exceptions-arm.c index 4009ef0d219..4d527eb6e40 100644 --- a/mono/mini/exceptions-arm.c +++ b/mono/mini/exceptions-arm.c @@ -371,7 +371,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -430,7 +430,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf *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; diff --git a/mono/mini/exceptions-hppa.c b/mono/mini/exceptions-hppa.c index 4b3f191fab1..ddac5aea58e 100644 --- a/mono/mini/exceptions-hppa.c +++ b/mono/mini/exceptions-hppa.c @@ -545,7 +545,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -577,7 +577,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; diff --git a/mono/mini/exceptions-ia64.c b/mono/mini/exceptions-ia64.c index 87372e0b07a..d60c01abd63 100644 --- a/mono/mini/exceptions-ia64.c +++ b/mono/mini/exceptions-ia64.c @@ -256,7 +256,7 @@ throw_exception (MonoObject *exc, guint64 rethrow) 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); @@ -535,7 +535,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -611,7 +611,7 @@ mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only) 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; diff --git a/mono/mini/exceptions-mips.c b/mono/mini/exceptions-mips.c index 13aff78f9de..4cbbc1224a1 100644 --- a/mono/mini/exceptions-mips.c +++ b/mono/mini/exceptions-mips.c @@ -421,7 +421,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, 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; @@ -508,7 +508,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, } 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; diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c index 4dc0c6050c9..78eed6d8581 100644 --- a/mono/mini/exceptions-ppc.c +++ b/mono/mini/exceptions-ppc.c @@ -548,7 +548,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -604,7 +604,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf *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; @@ -696,7 +696,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean #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; diff --git a/mono/mini/exceptions-s390.c b/mono/mini/exceptions-s390.c index c2466f9784d..85d35a5e809 100644 --- a/mono/mini/exceptions-s390.c +++ b/mono/mini/exceptions-s390.c @@ -447,7 +447,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, ((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; @@ -481,7 +481,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, 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; diff --git a/mono/mini/exceptions-s390x.c b/mono/mini/exceptions-s390x.c index 5891e0ff6ec..2931132aa68 100644 --- a/mono/mini/exceptions-s390x.c +++ b/mono/mini/exceptions-s390x.c @@ -452,7 +452,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, ((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; @@ -487,7 +487,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, 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; diff --git a/mono/mini/exceptions-sparc.c b/mono/mini/exceptions-sparc.c index 4f7640b5ce0..c60c167bdfd 100644 --- a/mono/mini/exceptions-sparc.c +++ b/mono/mini/exceptions-sparc.c @@ -378,7 +378,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -412,7 +412,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index 1388538e95e..9810bb6bc9d 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -602,7 +602,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf 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; @@ -672,7 +672,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf *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 */ @@ -871,7 +871,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean #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; @@ -881,7 +881,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean */ 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]; } diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index cee79def4b5..2f50abfa0c7 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -851,6 +851,34 @@ get_exception_catch_class (MonoJitExceptionInfo *ei, MonoJitInfo *ji, MonoContex 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 diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 5a0b26b4682..aeff2762577 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1667,6 +1667,7 @@ void mono_jit_walk_stack_from_ctx (MonoStackWalk func, MonoContext 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; -- 2.25.1