diff --git a/lib/libc/arch/sparc/Makefile.inc b/lib/libc/arch/sparc/Makefile.inc index cb17cb742a1f..ab961e62c562 100644 --- a/lib/libc/arch/sparc/Makefile.inc +++ b/lib/libc/arch/sparc/Makefile.inc @@ -1,11 +1,11 @@ -# $NetBSD: Makefile.inc,v 1.8 2002/10/27 18:45:11 chs Exp $ +# $NetBSD: Makefile.inc,v 1.9 2003/10/12 14:42:03 pk Exp $ KMINCLUDES= arch/sparc/SYS.h KMSRCS= bzero.S ffs.S strlen.S htonl.S htons.S \ ntohl.S ntohs.S divrem.m4 \ mul.S saveregs.S umul.S -SRCS+= __sigaction14_sigtramp.c __sigtramp1.S +SRCS+= __sigaction14_sigtramp.c __sigtramp1.S __sigtramp2.S # `source' files built from m4 source # the name `div.o' is taken for the ANSI C `div' function, hence sdiv here diff --git a/lib/libc/arch/sparc/sys/__sigaction14_sigtramp.c b/lib/libc/arch/sparc/sys/__sigaction14_sigtramp.c index 12a0ec7507b2..f474e9a7990f 100644 --- a/lib/libc/arch/sparc/sys/__sigaction14_sigtramp.c +++ b/lib/libc/arch/sparc/sys/__sigaction14_sigtramp.c @@ -1,4 +1,4 @@ -/* $NetBSD: __sigaction14_sigtramp.c,v 1.2 2003/01/18 11:15:08 thorpej Exp $ */ +/* $NetBSD: __sigaction14_sigtramp.c,v 1.3 2003/10/12 14:42:03 pk Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -40,6 +40,7 @@ #include #include +#include #include "extern.h" @@ -48,13 +49,25 @@ __weak_alias(__sigaction14, __libc_sigaction14) int __libc_sigaction14(int sig, const struct sigaction *act, struct sigaction *oact) { - extern int __sigtramp_sigcontext_1[]; + int rv; + extern void __sigtramp_sigcontext_1(void); + extern void __sigtramp_siginfo_2(void); /* - * Right here we should select the SA_SIGINFO trampoline - * if SA_SIGINFO is set in the sigaction. + * We select the compatibility SIGCONTEXT trampoline if SA_SIGINFO + * is not set in the sigaction. */ + if (act && (act->sa_flags & SA_SIGINFO) == 0) { + rv = __sigaction_sigtramp(sig, act, oact, + __sigtramp_sigcontext_1, 1); + /* + * EINVAL might indicate that trampoline version 1 is + * not supported by the kernel; fall back on native + * SIGINFO trampoline. + */ + if (rv >= 0 || errno != EINVAL) + return rv; + } - return (__sigaction_sigtramp(sig, act, oact, - __sigtramp_sigcontext_1, 1)); + return __sigaction_sigtramp(sig, act, oact, __sigtramp_siginfo_2, 2); } diff --git a/lib/libc/arch/sparc/sys/__sigtramp2.S b/lib/libc/arch/sparc/sys/__sigtramp2.S new file mode 100644 index 000000000000..d56eee611cf5 --- /dev/null +++ b/lib/libc/arch/sparc/sys/__sigtramp2.S @@ -0,0 +1,59 @@ +/* $NetBSD: __sigtramp2.S,v 1.1 2003/10/12 14:42:03 pk Exp $ */ + +/*- + * Copyright (c) 2003 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Paul Kranenburg. + * + * 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 +#if defined(SYSLIBC_SCCS) && !defined(lint) + RCSID("$NetBSD: __sigtramp2.S,v 1.1 2003/10/12 14:42:03 pk Exp $") +#endif /* SYSLIBC_SCCS and not lint */ + +#include "SYS.h" + +/* + * When this code is run, the stack looks like: + * [%sp] struct frame + * [%sp + 96] siginfo_t + * [%sp + 96 + 128] ucontext_t + * . + * . + */ +ENTRY_NOPROFILE(__sigtramp_siginfo_2) + add %sp, 96 + 128, %o0 /* get pointer to ucontext */ + mov SYS_setcontext, %g1 + t ST_SYSCALL /* call setcontext */ + mov SYS_exit, %g1 /* exit with errno */ + t ST_SYSCALL /* if sigreturn fails */