Subject: Re: SA_SIGINFO for mips
To: None <port-mips@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: port-mips
Date: 10/12/2003 04:25:28
In article <20031012040313.GK23531@rezrov.net>,
Christopher SEKIYA <wileyc@rezrov.net> wrote:

It is probably better to use matt's powerpc one. I've switched the i386
to do that.

christos

>All,
>
>Attached is a diff that implements the SA_SIGINFO bits for mips.  It's
>a direct copy of the i386 implementation.  This addresses a failure during
>the regression tests and permits a make build to complete.
>
>-- Chris
>	GPG key FEB9DE7F (91AF 4534 4529 4BCC 31A5  938E 023E EEFB FEB9 DE7F)
>
>
>Index: lib/libc/arch/mips/sys/__sigaction14_sigtramp.c
>===================================================================
>RCS file: /cvsroot/src/lib/libc/arch/mips/sys/__sigaction14_sigtramp.c,v
>retrieving revision 1.2
>diff -u -r1.2 __sigaction14_sigtramp.c
>--- lib/libc/arch/mips/sys/__sigaction14_sigtramp.c	2003/01/18 11:10:45	1.2
>+++ lib/libc/arch/mips/sys/__sigaction14_sigtramp.c	2003/10/12 03:20:46
>@@ -36,25 +36,51 @@
>  * POSSIBILITY OF SUCH DAMAGE.
>  */
> 
>-#define	__LIBC12_SOURCE__
>-
> #include <sys/types.h>
>+#include <sys/param.h>
> #include <signal.h>
>+#include <errno.h>
>+#include <unistd.h>
>+#include <sys/syscall.h>
> 
> #include "extern.h"
> 
> __weak_alias(__sigaction14, __libc_sigaction14)
> 
>+static int have_sigreturn = -1;
>+
>+static void get_have_sigreturn(void);
>+
>+extern int __sigtramp_siginfo_2[];
>+extern int __sigtramp_sigcontext_1[];
>+
>+static void
>+get_have_sigreturn(void)
>+{
>+	struct sigaction nsa, osa;
>+
>+	sigemptyset(&nsa.sa_mask);
>+	nsa.sa_flags = 0;
>+	nsa.sa_handler = SIG_IGN;
>+
>+	__sigaction_sigtramp(SIGSYS, &nsa, &osa, __sigtramp_siginfo_2, 2);
>+
>+	(void)syscall(SYS_compat_16___sigreturn14, NULL);
>+	have_sigreturn = errno == EFAULT;
>+
>+	__sigaction_sigtramp(SIGSYS, &osa, NULL, __sigtramp_siginfo_2, 2);
>+}
>+
>+
> int
> __libc_sigaction14(int sig, const struct sigaction *act, struct
>sigaction *oact)
> {
>-	extern int __sigtramp_sigcontext_1[];
>+	if (have_sigreturn == -1)
>+		get_have_sigreturn();
> 
>-	/*
>-	 * Right here we should select the SA_SIGINFO trampoline
>-	 * if SA_SIGINFO is set in the sigaction.
>-	 */
>+	if (have_sigreturn && act && (act->sa_flags & SA_SIGINFO) == 0)
>+	return __sigaction_sigtramp(sig, act, oact,
>+		__sigtramp_sigcontext_1, 1);
> 
>-	return (__sigaction_sigtramp(sig, act, oact,
>-				     __sigtramp_sigcontext_1, 1));
>+	return __sigaction_sigtramp(sig, act, oact, __sigtramp_siginfo_2, 2);
> }
>Index: sys/arch/mips/include/signal.h
>===================================================================
>RCS file: /cvsroot/src/sys/arch/mips/include/signal.h,v
>retrieving revision 1.20
>diff -u -r1.20 signal.h
>--- sys/arch/mips/include/signal.h	2003/08/07 16:28:29	1.20
>+++ sys/arch/mips/include/signal.h	2003/10/12 03:21:03
>@@ -41,6 +41,13 @@
> 
> #include <machine/cdefs.h>	/* for API selection */
> 
>+#define __HAVE_SIGINFO
>+#ifdef COMPAT_16
>+#define SIGTRAMP_VALID(vers)	((unsigned)(vers) <= 2)
>+#else
>+#define SIGTRAMP_VALID(vers)	((vers) == 2)
>+#endif
>+
> #if !defined(__ASSEMBLER__)
> 
> /*