xref: /illumos-gate/usr/src/uts/common/sys/signalfd.h (revision abf99a00)
13d729aecSJerry Jelinek /*
23d729aecSJerry Jelinek  * This file and its contents are supplied under the terms of the
33d729aecSJerry Jelinek  * Common Development and Distribution License ("CDDL"), version 1.0.
43d729aecSJerry Jelinek  * You may only use this file in accordance with the terms of version
53d729aecSJerry Jelinek  * 1.0 of the CDDL.
63d729aecSJerry Jelinek  *
73d729aecSJerry Jelinek  * A full copy of the text of the CDDL should have accompanied this
83d729aecSJerry Jelinek  * source.  A copy of the CDDL is also available via the Internet at
93d729aecSJerry Jelinek  * http://www.illumos.org/license/CDDL.
103d729aecSJerry Jelinek  */
113d729aecSJerry Jelinek 
123d729aecSJerry Jelinek /*
13*abf99a00SPatrick Mooney  * Copyright 2016 Joyent, Inc.
143d729aecSJerry Jelinek  */
153d729aecSJerry Jelinek 
163d729aecSJerry Jelinek /*
173d729aecSJerry Jelinek  * Header file to support the signalfd facility. Note that this facility
183d729aecSJerry Jelinek  * is designed to be binary compatible with the Linux signalfd facility, modulo
193d729aecSJerry Jelinek  * the signals themselves; values for constants here should therefore exactly
203d729aecSJerry Jelinek  * match those found in Linux, and this facility shouldn't be extended
213d729aecSJerry Jelinek  * independently of Linux.
223d729aecSJerry Jelinek  */
233d729aecSJerry Jelinek 
243d729aecSJerry Jelinek #ifndef _SYS_SIGNALFD_H
253d729aecSJerry Jelinek #define	_SYS_SIGNALFD_H
263d729aecSJerry Jelinek 
273d729aecSJerry Jelinek #include <sys/types.h>
283d729aecSJerry Jelinek 
293d729aecSJerry Jelinek #ifdef	__cplusplus
303d729aecSJerry Jelinek extern "C" {
313d729aecSJerry Jelinek #endif
323d729aecSJerry Jelinek 
333d729aecSJerry Jelinek /*
343d729aecSJerry Jelinek  * To assure binary compatibility with Linux, these values are fixed at their
353d729aecSJerry Jelinek  * Linux equivalents, not their native ones.
363d729aecSJerry Jelinek  */
373d729aecSJerry Jelinek #define	SFD_CLOEXEC		02000000		/* LX_O_CLOEXEC */
383d729aecSJerry Jelinek #define	SFD_NONBLOCK		04000			/* LX_O_NONBLOCK */
393d729aecSJerry Jelinek 
403d729aecSJerry Jelinek /*
413d729aecSJerry Jelinek  * These ioctl values are specific to the native implementation; applications
423d729aecSJerry Jelinek  * shouldn't be using them directly, and they should therefore be safe to
433d729aecSJerry Jelinek  * change without breaking apps.
443d729aecSJerry Jelinek  */
453d729aecSJerry Jelinek #define	SIGNALFDIOC		(('s' << 24) | ('f' << 16) | ('d' << 8))
463d729aecSJerry Jelinek #define	SIGNALFDIOC_MASK	(SIGNALFDIOC | 1)	/* set mask */
473d729aecSJerry Jelinek 
483d729aecSJerry Jelinek typedef struct signalfd_siginfo {
493d729aecSJerry Jelinek 	uint32_t ssi_signo;	/* signal from signal.h */
503d729aecSJerry Jelinek 	int32_t  ssi_errno;	/* error from errno.h */
513d729aecSJerry Jelinek 	int32_t  ssi_code;	/* signal code */
523d729aecSJerry Jelinek 	uint32_t ssi_pid;	/* PID of sender */
533d729aecSJerry Jelinek 	uint32_t ssi_uid;	/* real UID of sender */
543d729aecSJerry Jelinek 	int32_t  ssi_fd;	/* File descriptor (SIGIO) */
553d729aecSJerry Jelinek 	uint32_t ssi_tid;	/* unused */
563d729aecSJerry Jelinek 	uint32_t ssi_band;	/* band event (SIGIO) */
573d729aecSJerry Jelinek 	uint32_t ssi_overrun;	/* unused */
583d729aecSJerry Jelinek 	uint32_t ssi_trapno;	/* trap number that caused signal */
593d729aecSJerry Jelinek 	int32_t  ssi_status;	/* exit status or signal (SIGCHLD) */
603d729aecSJerry Jelinek 	int32_t  ssi_int;	/* unused */
613d729aecSJerry Jelinek 	uint64_t ssi_ptr;	/* unused */
623d729aecSJerry Jelinek 	uint64_t ssi_utime;	/* user CPU time consumed (SIGCHLD) */
633d729aecSJerry Jelinek 	uint64_t ssi_stime;	/* system CPU time consumed (SIGCHLD) */
643d729aecSJerry Jelinek 	uint64_t ssi_addr;	/* address that generated signal */
653d729aecSJerry Jelinek 	uint8_t  ssi_pad[48];	/* Pad size to 128 bytes to allow for */
663d729aecSJerry Jelinek 				/* additional fields in the future. */
673d729aecSJerry Jelinek } signalfd_siginfo_t;
683d729aecSJerry Jelinek 
693d729aecSJerry Jelinek #ifndef _KERNEL
703d729aecSJerry Jelinek 
713d729aecSJerry Jelinek extern int signalfd(int, const sigset_t *, int);
723d729aecSJerry Jelinek 
733d729aecSJerry Jelinek #else
743d729aecSJerry Jelinek 
753d729aecSJerry Jelinek #define	SIGNALFDMNRN_SIGNALFD	0
763d729aecSJerry Jelinek #define	SIGNALFDMNRN_CLONE	1
773d729aecSJerry Jelinek 
783d729aecSJerry Jelinek /*
793d729aecSJerry Jelinek  * This holds the proc_t state for a process which is using signalfd.
80*abf99a00SPatrick Mooney  * Its presence and contents are protected by p_lock.
813d729aecSJerry Jelinek  */
823d729aecSJerry Jelinek typedef struct sigfd_proc_state {
833d729aecSJerry Jelinek 	void (*sigfd_pollwake_cb)(void *, int);
843d729aecSJerry Jelinek 	list_t sigfd_list;
853d729aecSJerry Jelinek } sigfd_proc_state_t;
863d729aecSJerry Jelinek 
873d729aecSJerry Jelinek 
883d729aecSJerry Jelinek extern void (*sigfd_exit_helper)();
893d729aecSJerry Jelinek 
903d729aecSJerry Jelinek #endif /* _KERNEL */
913d729aecSJerry Jelinek 
923d729aecSJerry Jelinek #ifdef	__cplusplus
933d729aecSJerry Jelinek }
943d729aecSJerry Jelinek #endif
953d729aecSJerry Jelinek 
963d729aecSJerry Jelinek #endif	/* _SYS_SIGNALFD_H */
97