[Mono-dev] [PATCH]: Implement Sparc exceptions correctly under Linux

Zoltan Varga vargaz at gmail.com
Fri Mar 24 19:00:51 EST 2006


                              Hey,

  These patches are now in SVN HEAD and the 1.1.13 branch. Thanks !

                          Zoltan

On 3/25/06, David S. Miller <davem at davemloft.net> wrote:
>
> Linux does not pass a ucontext_t to signal handlers, instead
> it passes in a "struct sigcontext".  The layout is different
> for 64-bit vs 32-bit chips.
>
> This patch implements the necessary support.
>
> With this and the libgc configure.in patch I just posted the
> testsuite seems to be running quite well.
>
> Thanks.
>
> 2006-03-24  David S. Miller  <davem at sunset.davemloft.net>
>
>         * exceptions-sparc.c (mono_arch_handle_exception,
>         mono_arch_ip_from_context): Implement correctly for Linux.
>
> --- mono/mini/exceptions-sparc.c.~1~    2005-01-28 06:54:11.000000000 -0800
> +++ mono/mini/exceptions-sparc.c        2006-03-24 15:01:22.000000000 -0800
> @@ -425,6 +425,58 @@
>         return FALSE;
>  }
>
> +#ifdef __linux__
> +gboolean
> +mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only)
> +{
> +       MonoContext mctx;
> +       struct sigcontext *sc = sigctx;
> +       gpointer *window;
> +
> +#ifdef SPARCV9
> +       mctx.ip = (gpointer) sc->sigc_regs.tpc;
> +       mctx.sp = (gpointer) sc->sigc_regs.u_regs[14];
> +#else
> +       mctx.ip = (gpointer) sc->si_regs.pc;
> +       mctx.sp = (gpointer) sc->si_regs.u_regs[14];
> +#endif
> +
> +       window = (gpointer*)(((guint8*)mctx.sp) + MONO_SPARC_STACK_BIAS);
> +       mctx.fp = window [sparc_fp - 16];
> +
> +       mono_handle_exception (&mctx, obj, mctx.ip, test_only);
> +
> +#ifdef SPARCV9
> +       sc->sigc_regs.tpc = (unsigned long) mctx.ip;
> +       sc->sigc_regs.tnpc = (unsigned long) (mctx.ip + 4);
> +       sc->sigc_regs.u_regs[14] = (unsigned long) mctx.sp;
> +#else
> +       sc->si_regs.pc = (unsigned long) mctx.ip;
> +       sc->si_regs.npc = (unsigned long) (mctx.ip + 4);
> +       sc->si_regs.u_regs[14] = (unsigned long) mctx.sp;
> +#endif
> +
> +       window = (gpointer*)(((guint8*)mctx.sp) + MONO_SPARC_STACK_BIAS);
> +       window [sparc_fp - 16] = mctx.fp;
> +
> +       return TRUE;
> +}
> +
> +gpointer
> +mono_arch_ip_from_context (void *sigctx)
> +{
> +       struct sigcontext *sc = sigctx;
> +       gpointer *ret;
> +
> +#ifdef SPARCV9
> +       ret = (gpointer) sc->sigc_regs.tpc;
> +#else
> +       ret = (gpointer) sc->si_regs.pc;
> +#endif
> +
> +       return ret;
> +}
> +#else
>  gboolean
>  mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only)
>  {
> @@ -437,12 +489,7 @@
>          * under documented under solaris. The code below seems to work under
>          * Solaris 9.
>          */
> -#ifndef __linux__
>         g_assert (!ctx->uc_mcontext.gwins);
> -#else
> -       /* better, but doesn't work all the time.  need to rethink! */
> -       g_assert (!ctx->uc_mcontext.gregs);
> -#endif
>
>         mctx.ip = ctx->uc_mcontext.gregs [REG_PC];
>         mctx.sp = ctx->uc_mcontext.gregs [REG_SP];
> @@ -467,4 +514,4 @@
>         ucontext_t *ctx = (ucontext_t*)sigctx;
>         return (gpointer)ctx->uc_mcontext.gregs [REG_PC];
>  }
> -
> +#endif
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>



More information about the Mono-devel-list mailing list