From b469b163b9c6c63ca1e7b10bbc7ec16b6f3e87b0 Mon Sep 17 00:00:00 2001 From: scw Date: Sun, 5 Oct 2003 10:01:49 +0000 Subject: [PATCH] libc bits for siginfo on sh5. --- lib/libc/arch/sh5/Makefile.inc | 4 +- .../arch/sh5/sys/__sigaction14_sigtramp.c | 32 +++++++++--- lib/libc/arch/sh5/sys/__sigtramp2.S | 51 +++++++++++++++++++ 3 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 lib/libc/arch/sh5/sys/__sigtramp2.S diff --git a/lib/libc/arch/sh5/Makefile.inc b/lib/libc/arch/sh5/Makefile.inc index dc7c96ad6f1a..1bd523c9df98 100644 --- a/lib/libc/arch/sh5/Makefile.inc +++ b/lib/libc/arch/sh5/Makefile.inc @@ -1,6 +1,6 @@ -# $NetBSD: Makefile.inc,v 1.2 2002/07/11 14:23:04 scw Exp $ +# $NetBSD: Makefile.inc,v 1.3 2003/10/05 10:01:49 scw Exp $ KMINCLUDES= KMSRCS= -SRCS+= __sigaction14_sigtramp.c __sigtramp1.S +SRCS+= __sigaction14_sigtramp.c __sigtramp1.S __sigtramp2.S diff --git a/lib/libc/arch/sh5/sys/__sigaction14_sigtramp.c b/lib/libc/arch/sh5/sys/__sigaction14_sigtramp.c index b0b04bbdbd16..09969d734b14 100644 --- a/lib/libc/arch/sh5/sys/__sigaction14_sigtramp.c +++ b/lib/libc/arch/sh5/sys/__sigaction14_sigtramp.c @@ -1,4 +1,4 @@ -/* $NetBSD: __sigaction14_sigtramp.c,v 1.3 2003/01/19 23:05:04 scw Exp $ */ +/* $NetBSD: __sigaction14_sigtramp.c,v 1.4 2003/10/05 10:01:49 scw Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -36,10 +36,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#define __LIBC12_SOURCE__ - #include +#include #include +#include #include "extern.h" @@ -49,12 +49,30 @@ int __libc_sigaction14(int sig, const struct sigaction *act, struct sigaction *oact) { extern void __sigtramp_sigcontext_1(void); + extern void __sigtramp_siginfo_2(void); + int rv; /* - * Right here we should select the SA_SIGINFO trampoline - * if SA_SIGINFO is set in the sigaction. + * If no sigaction, use the "default" trampoline since it won't + * be used. */ + if (act == NULL) + return __sigaction_sigtramp(sig, act, oact, NULL, 0); - return (__sigaction_sigtramp(sig, act, oact, - (void *)__sigtramp_sigcontext_1, 1)); + /* + * We select the non-SA_SIGINFO trampoline if SA_SIGINFO is not + * set in the sigaction. + */ + if ((act->sa_flags & SA_SIGINFO) == 0) { + rv = __sigaction_sigtramp(sig, act, oact, + __sigtramp_sigcontext_1, 1); + if (rv >= 0 || errno != EINVAL) + return rv; + } + + /* + * If SA_SIGINFO was specificed or the compatibility trampolines + * can't be used, use the siginfo trampoline. + */ + return __sigaction_sigtramp(sig, act, oact, __sigtramp_siginfo_2, 2); } diff --git a/lib/libc/arch/sh5/sys/__sigtramp2.S b/lib/libc/arch/sh5/sys/__sigtramp2.S new file mode 100644 index 000000000000..e00cc53473db --- /dev/null +++ b/lib/libc/arch/sh5/sys/__sigtramp2.S @@ -0,0 +1,51 @@ +/* $NetBSD: __sigtramp2.S,v 1.1 2003/10/05 10:01:49 scw Exp $ */ + +/*- + * Copyright (c) 2003 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Steve C. Woodford. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SYS.h" + +/* + * This signal trampoline is invoked only to return from the + * signal; the kernel calls the signal handler directly. + * + * When we get here, callee-saved register r28 points to the ucontext_t + * structure on the stack (this was arranged for us by the kernel). + */ +ENTRY_NOPROFILE(__sigtramp_sigcontext_2) + or r28, r63, r2 + SYSTRAP(setcontext) + SYSTRAP(exit)