X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fexceptions-ppc.c;h=238de08741238dd23de5dc71ed5ddc7520f32724;hb=1bc7eca560fb35c7bfcc86a7ffefac19f8424021;hp=df828692ac3289c5ec99ffc57fe4c9255c67cede;hpb=4dba3647b853e954a35517223dbfaf6a4ee29290;p=mono.git diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c index df828692ac3..238de087412 100644 --- a/mono/mini/exceptions-ppc.c +++ b/mono/mini/exceptions-ppc.c @@ -332,7 +332,7 @@ mono_ppc_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, memcpy (&ctx.regs, int_regs, sizeof (mgreg_t) * MONO_SAVED_GREGS); memcpy (&ctx.fregs, fp_regs, sizeof (double) * MONO_SAVED_FREGS); - if (mono_object_isinst (exc, mono_defaults.exception_class, &error)) { + if (mono_object_isinst_checked (exc, mono_defaults.exception_class, &error)) { MonoException *mono_ex = (MonoException*)exc; if (!rethrow) { mono_ex->stack_trace = NULL; @@ -666,7 +666,7 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s abort (); } if (!ji) - mono_handle_native_sigsegv (SIGSEGV, sigctx, siginfo); + mono_handle_native_sigsegv ("SIGSEGV", sigctx, siginfo); /* setup a call frame on the real stack so that control is returned there * and exception handling can continue. * The frame looks like: @@ -697,6 +697,11 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s } #else UCONTEXT_REG_NIP(uc) = (unsigned long)altstack_handle_and_restore; +#if _CALL_ELF == 2 + /* ELF v2 ABI calling convention requires to put the target address into + * r12 if we use the global entry point of a function. */ + UCONTEXT_REG_Rn(uc, 12) = (unsigned long) altstack_handle_and_restore; +#endif #endif UCONTEXT_REG_Rn(uc, 1) = (unsigned long)sp; UCONTEXT_REG_Rn(uc, PPC_FIRST_ARG_REG) = (unsigned long)(sp + 16); @@ -739,6 +744,11 @@ setup_ucontext_return (void *uc, gpointer func) } #else UCONTEXT_REG_NIP(uc) = (unsigned long)func; +#if _CALL_ELF == 2 + /* ELF v2 ABI calling convention requires to put the target address into + * r12 if we use the global entry point of a function. */ + UCONTEXT_REG_Rn(uc, 12) = (unsigned long) func; +#endif #endif #endif }