From c1704e15b4340bbaac4d57386e172db02febd8f5 Mon Sep 17 00:00:00 2001 From: matt Date: Tue, 30 Sep 2003 19:05:41 +0000 Subject: [PATCH] Enable the SIGINFO trampoline. --- lib/libc/arch/vax/Makefile.inc | 4 +- .../arch/vax/sys/__sigaction14_sigtramp.c | 35 ++++++++++--- lib/libc/arch/vax/sys/__sigtramp3.S | 50 +++++++++++++++++++ 3 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 lib/libc/arch/vax/sys/__sigtramp3.S diff --git a/lib/libc/arch/vax/Makefile.inc b/lib/libc/arch/vax/Makefile.inc index 8268f8fe2003..39602f5e8dc0 100644 --- a/lib/libc/arch/vax/Makefile.inc +++ b/lib/libc/arch/vax/Makefile.inc @@ -1,3 +1,3 @@ -# $NetBSD: Makefile.inc,v 1.3 2003/09/28 16:30:18 matt Exp $ +# $NetBSD: Makefile.inc,v 1.4 2003/09/30 19:05:41 matt Exp $ -SRCS+= __sigaction14_sigtramp.c __sigtramp2.S +SRCS+= __sigaction14_sigtramp.c __sigtramp2.S __sigtramp3.S diff --git a/lib/libc/arch/vax/sys/__sigaction14_sigtramp.c b/lib/libc/arch/vax/sys/__sigaction14_sigtramp.c index 1c1987bab63c..5d00b184fdcb 100644 --- a/lib/libc/arch/vax/sys/__sigaction14_sigtramp.c +++ b/lib/libc/arch/vax/sys/__sigaction14_sigtramp.c @@ -1,4 +1,4 @@ -/* $NetBSD: __sigaction14_sigtramp.c,v 1.3 2003/01/18 11:18:02 thorpej Exp $ */ +/* $NetBSD: __sigaction14_sigtramp.c,v 1.4 2003/09/30 19:05:41 matt Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -36,10 +36,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#define __LIBC12_SOURCE__ - #include +#include +#include #include +#include #include "extern.h" @@ -48,13 +49,31 @@ __weak_alias(__sigaction14, __libc_sigaction14) int __libc_sigaction14(int sig, const struct sigaction *act, struct sigaction *oact) { - extern int __sigtramp_sigcontext_2[]; + extern const int __sigtramp_sigcontext_2[]; + extern const int __sigtramp_siginfo_3[]; + 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, - __sigtramp_sigcontext_2, 2)); + /* + * 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_2, 2); + 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_3, 3); } diff --git a/lib/libc/arch/vax/sys/__sigtramp3.S b/lib/libc/arch/vax/sys/__sigtramp3.S new file mode 100644 index 000000000000..e4703a26a50a --- /dev/null +++ b/lib/libc/arch/vax/sys/__sigtramp3.S @@ -0,0 +1,50 @@ +/* $NetBSD: __sigtramp3.S,v 1.1 2003/09/30 19:05:41 matt Exp $ */ + +/* + * Copyright (c) 2003 Matt Thomas + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +/* + * Signal trampoline; registers when called: + * pc, psl - obvious + * sp, ap - points to argument list + * 4(ap) -- signo + * 8(ap) -- pointer to siginfo + * 12(ap) -- pointer to ucontext + * fp - address of signal handler + */ + +#include "SYS.h" + + .text + _ALIGN_TEXT + + .globl _C_LABEL(__sigtramp_siginfo_3) +_C_LABEL(__sigtramp_siginfo_3): + callg (%ap),(%fp) # use global arg list + addl2 $8,%ap # arg is pointer to ucontext + SYSTRAP(setcontext) # exit from here + halt # illegal insn