- x86_thread_state32_t *tstate32;
- siginfo_t sinfo32;
-
- bzero((caddr_t)&sinfo32, sizeof(siginfo_t));
-
- sinfo32.si_signo = sinfo64.si_signo;
- sinfo32.si_code = sinfo64.si_code;
- sinfo32.si_pid = sinfo64.si_pid;
- sinfo32.si_uid = sinfo64.si_uid;
- sinfo32.si_status = sinfo64.si_status;
- sinfo32.si_addr = CAST_DOWN(void *, sinfo64.si_addr);
- sinfo32.pad[0] = sinfo64.pad[0];
-
- if (copyout((caddr_t)&sinfo32, ua_sip, sizeof (sinfo32)))
- goto bad;
-
- tstate32 = &mctx.mctx32.ss;
- tstate32->eip = CAST_DOWN(unsigned int, ps->ps_trampact[sig]);
- tstate32->esp = CAST_DOWN(unsigned int, ua_fp);
-
+ x86_thread_state32_t *tstate32;
+ user32_siginfo_t sinfo32;
+
+ bzero((caddr_t)&sinfo32, sizeof(sinfo32));
+
+ siginfo_user_to_user32_x86(&sinfo64, &sinfo32);
+
+#if CONFIG_DTRACE
+ bzero((caddr_t)&(ut->t_dtrace_siginfo), sizeof(ut->t_dtrace_siginfo));
+
+ ut->t_dtrace_siginfo.si_signo = sinfo32.si_signo;
+ ut->t_dtrace_siginfo.si_code = sinfo32.si_code;
+ ut->t_dtrace_siginfo.si_pid = sinfo32.si_pid;
+ ut->t_dtrace_siginfo.si_uid = sinfo32.si_uid;
+ ut->t_dtrace_siginfo.si_status = sinfo32.si_status;
+ ut->t_dtrace_siginfo.si_addr = CAST_DOWN(void *, sinfo32.si_addr);
+
+ /* Fire DTrace proc:::fault probe when signal is generated by hardware. */
+ switch (sig) {
+ case SIGILL: case SIGBUS: case SIGSEGV: case SIGFPE: case SIGTRAP:
+ DTRACE_PROC2(fault, int, (int)(ut->uu_code), siginfo_t *, &(ut->t_dtrace_siginfo));
+ break;
+ default:
+ break;
+ }
+
+ DTRACE_PROC3(signal__handle, int, sig, siginfo_t *, &(ut->t_dtrace_siginfo),
+ void (*)(void), CAST_DOWN(sig_t, ua_catcher));
+#endif /* CONFIG_DTRACE */
+
+ if (copyout((caddr_t)&sinfo32, ua_sip, sizeof(sinfo32))) {
+ goto bad;
+ }
+
+ tstate32 = &mctxp->mctx_avx32.ss;
+
+ tstate32->eip = CAST_DOWN_EXPLICIT(user32_addr_t, trampact);
+ tstate32->esp = CAST_DOWN_EXPLICIT(user32_addr_t, ua_fp);
+