X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..7e41aa883dd258f888d0470250eead40a53ef1f5:/bsd/sys/signalvar.h diff --git a/bsd/sys/signalvar.h b/bsd/sys/signalvar.h index 0b242758d..6d8488807 100644 --- a/bsd/sys/signalvar.h +++ b/bsd/sys/signalvar.h @@ -1,23 +1,29 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ /* @@ -58,6 +64,9 @@ #ifndef _SYS_SIGNALVAR_H_ /* tmp for user.h */ #define _SYS_SIGNALVAR_H_ +#include + +#ifdef BSD_KERNEL_PRIVATE /* * Kernel signal definitions and data structures, * not exported to user programs. @@ -68,62 +77,49 @@ * (not necessarily resident). */ struct sigacts { - sig_t ps_sigact[NSIG]; /* disposition of signals */ + user_addr_t ps_sigact[NSIG]; /* disposition of signals */ + user_addr_t ps_trampact[NSIG]; /* disposition of signals */ sigset_t ps_catchmask[NSIG]; /* signals to be blocked */ sigset_t ps_sigonstack; /* signals to take on sigstack */ sigset_t ps_sigintr; /* signals that interrupt syscalls */ + sigset_t ps_sigreset; /* signals that reset when caught */ + sigset_t ps_signodefer; /* signals not masked while handled */ + sigset_t ps_siginfo; /* signals that want SA_SIGINFO args */ sigset_t ps_oldmask; /* saved mask from before sigpause */ int ps_flags; /* signal flags, below */ - struct sigaltstack ps_sigstk; /* sp & on stack state variable */ + struct kern_sigaltstack ps_sigstk; /* sp, length & flags */ int ps_sig; /* for core dump/debugger XXX */ int ps_code; /* for core dump/debugger XXX */ int ps_addr; /* for core dump/debugger XXX */ sigset_t ps_usertramp; /* SunOS compat; libc sigtramp XXX */ + sigset_t ps_64regset; /* signals that want SA_EXSIGINFO args */ }; /* signal flags */ #define SAS_OLDMASK 0x01 /* need to restore mask before pause */ #define SAS_ALTSTACK 0x02 /* have alternate signal stack */ -/* additional signal action values, used only temporarily/internally */ -#define SIG_CATCH (void (*)())2 -#define SIG_HOLD (void (*)())3 - - -#define pgsigio(pgid, sig, notused) \ - { \ - struct proc *p; \ - if (pgid < 0) \ - gsignal(-(pgid), sig);\ - else if (pgid > 0 && (p = pfind(pgid)) != 0) \ - psignal(p, sig); \ -} - - /* - * get signal action for process and signal; currently only for current process + * Additional signal action values, used only temporarily/internally; these + * values should be non-intersecting with values defined in signal.h, e.g.: + * SIG_IGN, SIG_DFL, SIG_ERR, SIG_IGN. */ -#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[(sig)]) +#define KERN_SIG_CATCH CAST_USER_ADDR_T(2) +#define KERN_SIG_HOLD CAST_USER_ADDR_T(3) +#define KERN_SIG_WAIT CAST_USER_ADDR_T(4) /* - * Determine signal that should be delivered to process p, the current - * process, 0 if none. If there is a pending stop signal with default - * action, the process stops in issig(). + * get signal action for process and signal; currently only for current process */ - -#define HAVE_SIGNALS(p) \ - ((p)->p_siglist \ - & ~((((p)->p_sigmask) \ - | (((p)->p_flag & P_TRACED) ? 0 : (p)->p_sigignore)) \ - & ~sigcantmask)) +#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[(sig)]) /* * Check for per-process and per thread signals. */ #define SHOULDissignal(p,uthreadp) \ - (((p)->p_siglist | (uthreadp)->uu_sig) \ - & ~((((p)->p_sigmask) \ - | (((p)->p_flag & P_TRACED) ? 0 : (p)->p_sigignore)) \ + (((uthreadp)->uu_siglist) \ + & ~((((uthreadp)->uu_sigmask) \ + | (((p)->p_lflag & P_LTRACED) ? 0 : (p)->p_sigignore)) \ & ~sigcantmask)) /* @@ -135,12 +131,6 @@ struct sigacts { (!thread_should_halt(thread) \ && (SHOULDissignal(p,uthreadp))) - -/* - * Clear a pending signal from a process. - */ -#define CLRSIG(p, sig) { (p)->p_siglist &= ~sigmask(sig); } - /* * Signal properties and actions. * The array below categorizes the signals and their default actions @@ -198,26 +188,63 @@ int sigprop[NSIG + 1] = { #define sigcantmask (sigmask(SIGKILL) | sigmask(SIGSTOP)) -#ifdef KERNEL +#define SIGRESTRICTMASK (sigmask(SIGILL) | sigmask(SIGTRAP) | sigmask(SIGABRT) | \ + sigmask(SIGFPE) | sigmask(SIGBUS) | sigmask(SIGSEGV) | \ + sigmask(SIGSYS)) + +extern unsigned sigrestrict_arg; + /* * Machine-independent functions: */ -int coredump __P((struct proc *p)); -void execsigs __P((struct proc *p)); -void gsignal __P((int pgid, int sig)); -int issignal __P((struct proc *p)); -int CURSIG __P((struct proc *p)); -int clear_sigbits __P((struct proc *p, int bit)); -void pgsignal __P((struct pgrp *pgrp, int sig, int checkctty)); -void postsig __P((int sig)); -void psignal __P((struct proc *p, int sig)); -void siginit __P((struct proc *p)); -void trapsignal __P((struct proc *p, int sig, unsigned code)); -void pt_setrunnable __P((struct proc *p)); + +void execsigs(struct proc *p, thread_t thread); +void gsignal(int pgid, int sig); +int issignal_locked(struct proc *p); +int CURSIG(struct proc *p); +int clear_procsiglist(struct proc *p, int bit, int in_signalstart); +int set_procsigmask(struct proc *p, int bit); +void postsig_locked(int sig); +void siginit(struct proc *p); +void trapsignal(struct proc *p, int sig, unsigned code); +void pt_setrunnable(struct proc *p); +int hassigprop(int sig, int prop); +int setsigvec(proc_t, thread_t, int signum, struct __kern_sigaction *, boolean_t in_sigstart); /* * Machine-dependent functions: */ -void sendsig __P((struct proc *, sig_t action, int sig, int returnmask, u_long code)); -#endif /* KERNEL */ +void sendsig(struct proc *, /*sig_t*/ user_addr_t action, int sig, + int returnmask, uint32_t code); + +void psignal(struct proc *p, int sig); +void psignal_locked(struct proc *, int); +void pgsignal(struct pgrp *pgrp, int sig, int checkctty); +void tty_pgsignal(struct tty * tp, int sig, int checkctty); +void threadsignal(thread_t sig_actthread, int signum, + mach_exception_code_t code); +int thread_issignal(proc_t p, thread_t th, sigset_t mask); +void psignal_vfork(struct proc *p, task_t new_task, thread_t thread, + int signum); +void signal_setast(thread_t sig_actthread); +void pgsigio(pid_t pgid, int signalnum); + +void sig_lock_to_exit(struct proc *p); +int sig_try_locked(struct proc *p); + +#endif /* BSD_KERNEL_PRIVATE */ + + +#ifdef XNU_KERNEL_PRIVATE + +/* Functions exported to Mach as well */ + +#define COREDUMP_IGNORE_ULIMIT 0x0001 /* Ignore the process's core file ulimit. */ +#define COREDUMP_FULLFSYNC 0x0002 /* Run F_FULLFSYNC on the core file's vnode */ + +int coredump(struct proc *p, uint32_t reserve_mb, int coredump_flags); + +#endif /* XNU_KERNEL_PRIVATE */ + + #endif /* !_SYS_SIGNALVAR_H_ */