NetBSD/sys/sys/siginfo.h
2005-12-11 12:16:03 +00:00

242 lines
7.6 KiB
C

/* $NetBSD: siginfo.h,v 1.14 2005/12/11 12:25:21 christos Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* 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.
*/
#ifndef _SYS_SIGINFO_H_
#define _SYS_SIGINFO_H_
#include <machine/signal.h> /* XXX: __HAVE_SIGINFO */
#ifdef _KERNEL
#include <sys/queue.h>
#endif
typedef union sigval {
int sival_int;
void *sival_ptr;
} sigval_t;
struct _ksiginfo {
int _signo;
int _code;
int _errno;
#ifdef _LP64
/* In _LP64 the union starts on an 8-byte boundary. */
int _pad;
#endif
union {
struct {
pid_t _pid;
uid_t _uid;
sigval_t _sigval;
} _rt;
struct {
pid_t _pid;
uid_t _uid;
int _status;
clock_t _utime;
clock_t _stime;
} _child;
struct {
void *_addr;
int _trap;
} _fault;
struct {
long _band;
int _fd;
} _poll;
} _reason;
};
#ifdef _KERNEL
typedef struct ksiginfo {
u_long ksi_flags; /* 4 or 8 bytes, depending on LP64 */
CIRCLEQ_ENTRY(ksiginfo) ksi_list;
struct _ksiginfo ksi_info;
} ksiginfo_t;
#define KSI_TRAP 0x01 /* signal caused by trap */
#define KSI_EMPTY 0x02 /* no additional information */
/* Macros to initialize a ksiginfo_t. */
#define KSI_INIT(ksi) \
do { \
memset((ksi), 0, sizeof(*(ksi))); \
} while (/*CONSTCOND*/0)
#define KSI_INIT_EMPTY(ksi) \
do { \
KSI_INIT((ksi)); \
(ksi)->ksi_flags = KSI_EMPTY; \
} while (/*CONSTCOND*/0)
#define KSI_INIT_TRAP(ksi) \
do { \
KSI_INIT((ksi)); \
(ksi)->ksi_flags = KSI_TRAP; \
} while (/*CONSTCOND*/0)
/* Copy the part of ksiginfo_t without the queue pointers */
#define KSI_COPY(fksi, tksi) \
do { \
(tksi)->ksi_info = (fksi)->ksi_info; \
(tksi)->ksi_flags = (fksi)->ksi_flags; \
} while (/*CONSTCOND*/0)
/* Predicate macros to test how a ksiginfo_t was generated. */
#define KSI_TRAP_P(ksi) (((ksi)->ksi_flags & KSI_TRAP) != 0)
#define KSI_EMPTY_P(ksi) (((ksi)->ksi_flags & KSI_EMPTY) != 0)
/*
* Old-style signal handler "code" arguments were only non-zero for
* signals caused by traps.
*/
#define KSI_TRAPCODE(ksi) (KSI_TRAP_P(ksi) ? (ksi)->ksi_trap : 0)
#endif /* _KERNEL */
typedef union siginfo {
char si_pad[128]; /* Total size; for future expansion */
struct _ksiginfo _info;
} siginfo_t;
/** Field access macros */
#define si_signo _info._signo
#define si_code _info._code
#define si_errno _info._errno
#define si_sigval _info._reason._rt._sigval
#define si_pid _info._reason._child._pid
#define si_uid _info._reason._child._uid
#define si_status _info._reason._child._status
#define si_utime _info._reason._child._utime
#define si_stime _info._reason._child._stime
#define si_addr _info._reason._fault._addr
#define si_trap _info._reason._fault._trap
#define si_band _info._reason._poll._band
#define si_fd _info._reason._poll._fd
#ifdef _KERNEL
/** Field access macros */
#define ksi_signo ksi_info._signo
#define ksi_code ksi_info._code
#define ksi_errno ksi_info._errno
#define ksi_sigval ksi_info._reason._rt._sigval
#define ksi_pid ksi_info._reason._child._pid
#define ksi_uid ksi_info._reason._child._uid
#define ksi_status ksi_info._reason._child._status
#define ksi_utime ksi_info._reason._child._utime
#define ksi_stime ksi_info._reason._child._stime
#define ksi_addr ksi_info._reason._fault._addr
#define ksi_trap ksi_info._reason._fault._trap
#define ksi_band ksi_info._reason._poll._band
#define ksi_fd ksi_info._reason._poll._fd
#endif /* _KERNEL */
/** si_code */
/* SIGILL */
#define ILL_ILLOPC 1 /* Illegal opcode */
#define ILL_ILLOPN 2 /* Illegal operand */
#define ILL_ILLADR 3 /* Illegal addressing mode */
#define ILL_ILLTRP 4 /* Illegal trap */
#define ILL_PRVOPC 5 /* Privileged opcode */
#define ILL_PRVREG 6 /* Privileged register */
#define ILL_COPROC 7 /* Coprocessor error */
#define ILL_BADSTK 8 /* Internal stack error */
/* SIGFPE */
#define FPE_INTDIV 1 /* Integer divide by zero */
#define FPE_INTOVF 2 /* Integer overflow */
#define FPE_FLTDIV 3 /* Floating point divide by zero */
#define FPE_FLTOVF 4 /* Floating point overflow */
#define FPE_FLTUND 5 /* Floating point underflow */
#define FPE_FLTRES 6 /* Floating point inexact result */
#define FPE_FLTINV 7 /* Invalid Floating point operation */
#define FPE_FLTSUB 8 /* Subscript out of range */
/* SIGSEGV */
#define SEGV_MAPERR 1 /* Address not mapped to object */
#define SEGV_ACCERR 2 /* Invalid permissions for mapped object*/
/* SIGBUS */
#define BUS_ADRALN 1 /* Invalid address alignment */
#define BUS_ADRERR 2 /* Non-existent physical address */
#define BUS_OBJERR 3 /* Object specific hardware error */
/* SIGTRAP */
#define TRAP_BRKPT 1 /* Process breakpoint */
#define TRAP_TRACE 2 /* Process trace trap */
/* SIGCHLD */
#define CLD_EXITED 1 /* Child has exited */
#define CLD_KILLED 2 /* Child has terminated abnormally but */
/* did not create a core file */
#define CLD_DUMPED 3 /* Child has terminated abnormally and */
/* created a core file */
#define CLD_TRAPPED 4 /* Traced child has trapped */
#define CLD_STOPPED 5 /* Child has stopped */
#define CLD_CONTINUED 6 /* Stopped child has continued */
/* SIGPOLL */
#define POLL_IN 1 /* Data input available */
#define POLL_OUT 2 /* Output buffers available */
#define POLL_MSG 3 /* Input message available */
#define POLL_ERR 4 /* I/O Error */
#define POLL_PRI 5 /* High priority input available */
#define POLL_HUP 4 /* Device disconnected */
/** si_code */
#define SI_NOINFO 32767 /* No signal specific info available */
#define SI_USER 0 /* Sent by kill(2) */
#define SI_QUEUE -1 /* Sent by the sigqueue(2) */
#define SI_TIMER -2 /* Generated by expiration of a timer */
/* set by timer_settime(2) */
#define SI_ASYNCIO -3 /* Generated by completion of an */
/* asynchronous I/O signal */
#define SI_MESGQ -4 /* Generated by arrival of a message on */
/* an empty message queue */
#endif /* !_SYS_SIGINFO_H_ */