PR/50428: Rin Okuyama: support SA_RESTORER flag for rt_sigaction(2) in the

ports that support it.
This commit is contained in:
christos 2015-11-14 13:29:35 +00:00
parent 6f6f55f60c
commit 803cade3fe
4 changed files with 18 additions and 21 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_signal.h,v 1.9 2008/04/28 20:23:42 martin Exp $ */
/* $NetBSD: linux_signal.h,v 1.10 2015/11/14 13:29:35 christos Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -92,13 +92,12 @@
#define LINUX_SA_RESETHAND 0x00000010
#define LINUX_SA_NOCLDWAIT 0x00000020
#define LINUX_SA_SIGINFO 0x00000040
#define LINUX_SA_RESTORER 0x04000000
#define LINUX_SA_NOMASK LINUX_SA_NODEFER
#define LINUX_SA_ONESHOT LINUX_SA_RESETHAND
#define LINUX_SA_INTERRUPT 0x20000000 /* Ignore this */
#define LINUX_SA_ALLBITS 0x2400007f
#define LINUX_SA_ALLBITS 0x2000007f
#define LINUX_SIG_BLOCK 1
#define LINUX_SIG_UNBLOCK 2

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_signal.h,v 1.4 2005/12/11 12:20:14 christos Exp $ */
/* $NetBSD: linux_signal.h,v 1.5 2015/11/14 13:29:35 christos Exp $ */
/*-
* Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@ -103,24 +103,24 @@ typedef void (*linux_handler_t)(int);
/* struct old_sigaction32 in Linux; uses a 32 bit pointer for handlers */
struct linux_compat_old_sigaction {
int linux_sa_handler;
linux_handler_t linux_sa_handler;
linux_old_sigset_t linux_sa_mask;
unsigned int linux_sa_flags;
int linux_sa_restorer;
void (*linux_sa_restorer)(void);
};
/* Dummy declaration to avoid errors, unused */
struct linux_old_sigaction {
linux_handler_t linux_sa_handler;
unsigned long linux_sa_flags;
linux_handler_t linux_sa_restorer;
void (*linux_sa_restorer)(void);
linux_sigset_t linux_sa_mask;
};
struct linux_sigaction {
linux_handler_t linux_sa_handler;
unsigned long linux_sa_flags;
linux_handler_t linux_sa_restorer;
void (*linux_sa_restorer)(void);
linux_sigset_t linux_sa_mask;
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_signal.h,v 1.13 2008/04/28 20:23:43 martin Exp $ */
/* $NetBSD: linux_signal.h,v 1.14 2015/11/14 13:29:35 christos Exp $ */
/*-
* Copyright (c) 1995, 1998, 2001 The NetBSD Foundation, Inc.
@ -104,15 +104,14 @@ struct linux_pt_regs {
#define LINUX_SA_NOCLDSTOP 0x00000001
#define LINUX_SA_SIGINFO 0x00000008
#define LINUX_SA_NOCLDWAIT 0x00010000
#define LINUX_SA_RESTORER 0x04000000
#define LINUX_SA_ONSTACK 0x08000000
#define LINUX_SA_RESTART 0x10000000
#define LINUX_SA_INTERRUPT 0x20000000
#define LINUX_SA_NODEFER 0x40000000
#define LINUX_SA_RESETHAND 0x80000000
#define LINUX_SA_NOMASK LINUX_SA_NODEFER
#define LINUX_SA_ONESHOT LINUX_SA_RESETHAND
#define LINUX_SA_ALLBITS 0xfc010009 /* XXX from i386, not in mips. */
#define LINUX_SA_ALLBITS 0xd8010009
/* XXX LINUX_SA_RESTORER has been deprecated; not used any version of glibc */
#define LINUX_MINSIGSTKSZ 2048

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_signal.c,v 1.76 2014/11/09 17:48:08 maxv Exp $ */
/* $NetBSD: linux_signal.c,v 1.77 2015/11/14 13:29:35 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.76 2014/11/09 17:48:08 maxv Exp $");
__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.77 2015/11/14 13:29:35 christos Exp $");
#define COMPAT_LINUX 1
@ -331,7 +331,7 @@ linux_sys_rt_sigaction(struct lwp *l, const struct linux_sys_rt_sigaction_args *
int error, sig;
void *tramp = NULL;
int vers = 0;
#if defined __amd64__
#ifdef LINUX_SA_RESTORER
struct sigacts *ps = l->l_proc->p_sigacts;
#endif
@ -354,11 +354,10 @@ linux_sys_rt_sigaction(struct lwp *l, const struct linux_sys_rt_sigaction_args *
sigemptyset(&obsa.sa_mask);
obsa.sa_flags = 0;
} else {
#if defined __amd64__
if (nlsa.linux_sa_flags & LINUX_SA_RESTORER) {
if ((tramp = nlsa.linux_sa_restorer) != NULL)
vers = 2; /* XXX arch dependent */
}
#ifdef LINUX_SA_RESTORER
if ((nlsa.linux_sa_flags & LINUX_SA_RESTORER) &&
(tramp = nlsa.linux_sa_restorer) != NULL)
vers = 2;
#endif
error = sigaction1(l, linux_to_native_signo[sig],
@ -371,7 +370,7 @@ linux_sys_rt_sigaction(struct lwp *l, const struct linux_sys_rt_sigaction_args *
if (SCARG(uap, osa)) {
native_to_linux_sigaction(&olsa, &obsa);
#if defined __amd64__
#ifdef LINUX_SA_RESTORER
if (ps->sa_sigdesc[sig].sd_vers != 0) {
olsa.linux_sa_restorer = ps->sa_sigdesc[sig].sd_tramp;
olsa.linux_sa_flags |= LINUX_SA_RESTORER;