2009-09-22 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Tue, 22 Sep 2009 12:32:32 +0000 (12:32 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 22 Sep 2009 12:32:32 +0000 (12:32 -0000)
* 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.

svn path=/trunk/mono/; revision=142389

14 files changed:
mono/mini/ChangeLog
mono/mini/exceptions-alpha.c
mono/mini/exceptions-amd64.c
mono/mini/exceptions-arm.c
mono/mini/exceptions-hppa.c
mono/mini/exceptions-ia64.c
mono/mini/exceptions-mips.c
mono/mini/exceptions-ppc.c
mono/mini/exceptions-s390.c
mono/mini/exceptions-s390x.c
mono/mini/exceptions-sparc.c
mono/mini/exceptions-x86.c
mono/mini/mini-exceptions.c
mono/mini/mini.h

index 888708a69b131ce7cc765ff0933539a193b2f0c4..06ba62ede9df149c9af73cbdc9716d63848dc41f 100644 (file)
@@ -1,3 +1,10 @@
+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
index 4a3a5bbcdd479b1e5dea660f6467f395281ca0f5..97a245a3fa8146755805f86a8fd900a9fea81b8e 100644 (file)
@@ -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;
index c48cbef3c4b23e6d3d111d7c00c10e8d955068e1..c9d111687f8834d6600a8ed10cfac593c14ebb25 100644 (file)
@@ -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;
 
index 4009ef0d21993192ba140d04461b8cd69cfbe64d..4d527eb6e40f7589ac4a4c2aa8cee84838ca4184 100644 (file)
@@ -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;
index 4b3f191fab11c49ea18bee02d40006391e596ba4..ddac5aea58e354d8cb13c994de050ad73eadb43c 100644 (file)
@@ -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;
index 87372e0b07aa726aaa6d0a17c2c3d4257e4546f1..d60c01abd635c396c7e7787a7a7f057f164f6c7d 100644 (file)
@@ -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;
index 13aff78f9de3f0b47a2541b7d32e58a4059ecfdb..4cbbc1224a1a9428065f16a675113ac12a55e7f7 100644 (file)
@@ -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;
index 4dc0c6050c9bb4fa303b39c904ec92d70c674e5c..78eed6d8581b4d154b1d55d4f4801eb84a471b9e 100644 (file)
@@ -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;
 
index c2466f9784d53eac45aa39f108d91de733797751..85d35a5e8097c2786a71fea9eccd322f848d93cd 100644 (file)
@@ -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;
index 5891e0ff6ecd4801a05faef3a1a8807109472dfe..2931132aa685fa1cf7d313fc42e85a4ae46773e1 100644 (file)
@@ -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;
index 4f7640b5ce0b7c64b5cab25053ccaef1eeea5a4f..c60c167bdfdd41a5298a2e6891d9476bb86b5b14 100644 (file)
@@ -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;
index 1388538e95ee5912a7cbae8c3633fa789b14dbc9..9810bb6bc9de76ba8dc77a40102d4aa835fb5720 100644 (file)
@@ -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];
        }
index cee79def4b5ac01f9bc8541068098cc014bb8f6d..2f50abfa0c766880e4d83cac35149c9b5fc191b5 100644 (file)
@@ -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
index 5a0b26b46824eba794e1cbcea8404fb9743ba094..aeff2762577a0945fccbee59b043ca8fb2d552cf 100644 (file)
@@ -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;