diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index 2eee865..bd1d5e0 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -313,9 +313,32 @@ arch_handle_allocation_trap(os_context_t *context) } #endif +#ifdef LISP_FEATURE_SUNOS +static os_context_t* find_context(siginfo_t *siginfo, os_context_t *context) +{ + os_context_t *subcontext = context; + if (siginfo) { + void* addr = siginfo->si_addr; + + while (*os_context_pc_addr(subcontext) != addr) { + if (subcontext->uc_link) + subcontext = subcontext->uc_link; + else + return context; + } + } + + return subcontext; +} +#endif + static void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) { +#ifdef LISP_FEATURE_SUNOS + context = find_context(siginfo, context); +#endif + if ((siginfo->si_code) == ILL_ILLOPC #ifdef LISP_FEATURE_LINUX || (linux_sparc_siginfo_bug && (siginfo->si_code == 2))