From 91ddaeb72537e598ec72fd4a85d50809fb3da2d7 Mon Sep 17 00:00:00 2001
From: Konstantin Belousov <kib@FreeBSD.org>
Date: Mon, 3 Jun 2013 04:22:42 +0000
Subject: [PATCH] Since the cause of the problems with the __fillcontextx() was
 identified, unify the code of check_deferred_signal() for all architectures,
 making the variant under #ifdef x86 common.

Tested by:	marius (sparc64)
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
---
 lib/libthr/thread/thr_sig.c | 22 +++++++---------------
 1 file changed, 7 insertions(+), 15 deletions(-)

diff --git a/lib/libthr/thread/thr_sig.c b/lib/libthr/thread/thr_sig.c
index 4dbb25221711..415ddb004dac 100644
--- a/lib/libthr/thread/thr_sig.c
+++ b/lib/libthr/thread/thr_sig.c
@@ -318,31 +318,23 @@ check_deferred_signal(struct pthread *curthread)
 	ucontext_t *uc;
 	struct sigaction act;
 	siginfo_t info;
+	int uc_len;
 
 	if (__predict_true(curthread->deferred_siginfo.si_signo == 0))
 		return;
 
-#if defined(__amd64__) || defined(__i386__)
-	int uc_len;
 	uc_len = __getcontextx_size();
 	uc = alloca(uc_len);
 	getcontext(uc);
 	if (curthread->deferred_siginfo.si_signo == 0)
 		return;
 	__fillcontextx2((char *)uc);
-#else
-	ucontext_t ucv;
-	uc = &ucv;
-	getcontext(uc);
-#endif
-	if (curthread->deferred_siginfo.si_signo != 0) {
-		act = curthread->deferred_sigact;
-		uc->uc_sigmask = curthread->deferred_sigmask;
-		memcpy(&info, &curthread->deferred_siginfo, sizeof(siginfo_t));
-		/* remove signal */
-		curthread->deferred_siginfo.si_signo = 0;
-		handle_signal(&act, info.si_signo, &info, uc);
-	}
+	act = curthread->deferred_sigact;
+	uc->uc_sigmask = curthread->deferred_sigmask;
+	memcpy(&info, &curthread->deferred_siginfo, sizeof(siginfo_t));
+	/* remove signal */
+	curthread->deferred_siginfo.si_signo = 0;
+	handle_signal(&act, info.si_signo, &info, uc);
 }
 
 static void