/*	@(#)signal.h	13.2 (RC International) 91/05/28	*/

#ifndef _SIGNAL_H
#define _SIGNAL_H

#define NSIG	33

#define	SIGHUP	1	/* hangup */
#define	SIGINT	2	/* interrupt */
#define	SIGQUIT	3	/* quit */
#define	SIGILL	4	/* illegal instruction */
#define	SIGTRAP	5	/* trace trap (not reset when caught) */
#define	SIGIOT	6	/* IOT instruction */
#define	SIGABRT	SIGIOT
#define	SIGEMT	7	/* EMT instruction */
#define	SIGFPE	8	/* FLOATing point exception (not all are FPU related) */
				    /* R2010 hardware codes: */
#define	    FPE_FLTINX_TRAP	0x1	/* inexact result */
#define	    FPE_FLTUND_TRAP	0x2	/* FLOATing underflow */
#define	    FPE_FLTOVF_TRAP	0x4	/* FLOATing overflow */
#define	    FPE_FLTDIV_TRAP	0x8	/* FLOATing divide by zero */
#define     FPE_FLTINV_TRAP	0x10	/* FLOATing invalid operation */
#define     FPE_FLTILL_TRAP	0x20	/* FLOATing illegal instruction */
				    /* Software codes: */
#define     FPE_OVERFLOW_TRAP	0x40	/* Integer overflow */
#define     FPE_OCHECK_TRAP	0x41	/* Integer overflow error check */
#define     FPE_RANGE_TRAP	0x42	/* Integer range error */
#define     FPE_INTDIV_TRAP	0x43	/* Integer divide error */
#define     FPE_ASSERT_TRAP	0x44	/* Pascal assert statement */
#define	SIGKILL	9	/* kill (cannot be caught or ignored) */
#define	SIGBUS	10	/* bus error */
#define	SIGSEGV	11	/* segmentation violation */
#define	SIGSYS	12	/* bad argument to system call */
#define	SIGPIPE	13	/* write on a pipe with no one to read it */
#define	SIGALRM	14	/* alarm clock */
#define	SIGTERM	15	/* software termination signal from kill */
#define	SIGURG	16	/* urgent condition on IO channel */
#define	SIGSTOP	17	/* sendable stop signal not from tty */
#define	SIGTSTP	18	/* stop signal from tty */
#define SIGSTP	SIGTSTP
#define	SIGCONT	19	/* continue a stopped process */
#define	SIGCHLD	20	/* to parent on child stop or exit */
#define	SIGCLD	SIGCHLD
#define	SIGTTIN	21	/* to readers pgrp upon background tty read */
#define	SIGTTOU	22	/* like TTIN for output if (tp->t_local&LTOSTOP) */
#define	SIGIO	23	/* input/output possible signal */
#define	SIGXCPU	24	/* exceeded CPU time limit */
#define	SIGXFSZ	25	/* exceeded file size limit */
#define	SIGVTALRM 26	/* virtual time alarm */
#define	SIGPROF	27	/* profiling time alarm */
#define	SIGERR	28	/* error in system call */
#define	SIGTRANS 29	/* transaction state change */
#define	SIGABORT 30	/* transaction aborted */
#define SIGUSR1  31	/* user-defined signal 1 */
#define SIGUSR2  SIGEMT /* user-defined signal 2 */
#define SIGWINCH 32 	/* window signal */

/*
 * Codes for the mips break instruction.
 */
#define	BRK_USERBP	0	/* user bp (used by debuggers) */
#define	BRK_DBGMONBP	1	/* dbgmon bp (used by dbgmon and pdbx) */
#define	BRK_KERNELBP	2	/* kernel bp (used by debuggers) */
#define	BRK_BD_TAKEN	3	/* for taken bd emulation */
#define	BRK_BD_NOTTAKEN	4	/* for not taken bd emulation */
#define	BRK_SSTEPBP	5	/* user bp (used by debuggers) */
#define	BRK_OVERFLOW	6	/* overflow check */
#define	BRK_DIVZERO	7	/* divide by zero check */
#define	BRK_RANGE	8	/* range error check */
#define	BRK_STACKOVERFLOW 9	/* reserved for ADA */
#define	BRK_ASSERT	10	/* Pascal assert statement */
/* next two is for kernel debugger use - should not collide */
#define BRK_STEPOVERBP	200	/* stepover bp for reinstallation of bps */
#define BRK_KSTEPOVERBP 201	/* stepover bp for reinstallation of bps */
				/* in kernel */

#ifdef  LANGUAGE_C

/*
 * Signal vector "template" used in sigvec call.
 */
struct	sigvec {
	int	(*sv_handler)();	/* signal handler */
	int	sv_mask;		/* signal mask to apply */
	int	sv_flags;		/* see signal options below */
};
#define	SV_ONSTACK	0x0001	/* take signal on signal stack */
#define	SV_INTERRUPT	0x0002	/* do not restart system on signal return */
#define SV_RESETHAND    0x0004  /*    */
#define SV_NODEFER      0x0008  /*    */
#define SV_NOCLDSTOP    0x0010  /*    */
#define	sv_onstack	sv_flags	/* for compatibility */

/*
 * Structure used in sigstack call.
 */
struct	sigstack {
	char	*ss_sp;			/* signal stack pointer */
	int	ss_onstack;		/* current status */
};

/*
 * Information pushed on stack when a signal is delivered.
 * This is used by the kernel to restore state following
 * execution of the signal handler.  It is also made available
 * to the handler to allow it to properly restore state if
 * a non-standard exit is performed.
 *
 * WARNING: THE sigcontext MUST BE KEPT CONSISTENT WITH /usr/include/setjmp.h
 * AND THE LIBC ROUTINES setjmp() AND longjmp()
 */
struct sigcontext {
	/*
	 * BEGIN REGION THAT MUST CORRESPOND WITH setjmp.h
	 * BEGIN REGION THAT MUST CORRESPOND WITH A jmp_buf
	 */
	struct sigstack sc_sigstack;	/* sigstack state to restore */
#define	sc_sp sc_sigstack.ss_sp
#define sc_onstack sc_sigstack.ss_onstack
	int	sc_mask;		/* signal mask to restore */
	int	sc_pc;			/* pc at time of signal */
	int	sc_signum;		/* signal number */
	int	sc_code;		/* error code */
	/*
	 * General purpose registers
	 */
	int	sc_regs[32];	/* processor regs 0 to 31 */
	int	sc_mdlo;	/* mul/div low */
	int	sc_mdhi;	/* mul/div high */
	/*
	 * Floating point coprocessor state
	 */
	int	sc_ownedfp;	/* fp has been used */
	int	sc_fpregs[32];	/* fp regs 0 to 31 */
	int	sc_fpc_csr;	/* floating point control and status reg */
	int	sc_fpc_eir;	/* floating point exception instruction reg */
	/*
	 * END OF REGION THAT MUST AGREE WITH setjmp.h
	 * END OF jmp_buf REGION
	 */
	/*
	 * System coprocessor registers at time of signal
	 */
	int	sc_cause;	/* cp0 cause register */
	int	sc_badvaddr;	/* cp0 bad virtual address */
	int	sc_badpaddr;	/* cpu bd bad physical address */
};

#define	BADSIG		(void (*)())-1
#define SIG_ERR		BADSIG
#define	SIG_DFL		(void (*)())0	/* default action */
#define	SIG_IGN		(void (*)())1	/* no action */
#define	SIG_CATCH	(void (*)())2	/* call user's handler */
#define	SIG_HOLD	(void (*)())3	/* defer action until unblocked */

/*
 * 	POSIX signal handling
 */

typedef struct sigset_t {
    int	ss_set;
} sigset_t;

/*
 * Struct sigaction used in sigaction call.
 */
struct	sigaction {
	void	  (*sa_handler)();	/* Signal handler */
	sigset_t  sa_mask;		/* Blocked signals */
	int	  sa_flags;		/* Special flags */
};

#define SA_NOCLDSTOP	1	/* sigaction(): Do not generate SIGCHLD */

#define SIG_BLOCK		1	/* sigprocmask(): Union */
#define SIG_UNBLOCK		2	/* sigprocmask(): Intersection */
#define SIG_SETMASK		3	/* sigprocmask(): Replace */


#if defined(__STDC__)

extern void (*signal(int, void (*)()))();

#if __STDC__ == 0 || defined(_POSIX_SOURCE) || defined(_XOPEN_SOURCE)
#include <sys/types.h>
extern int kill(pid_t, int);
extern int sigaction(int, struct sigaction *, struct sigaction *);
extern int sigaddset(sigset_t *, int);
extern int sigdelset(sigset_t *, int);
extern int sigemptyset(sigset_t *);
extern int sigfillset(sigset_t *);
extern int sigismember(sigset_t *, int);
extern int sigpending(sigset_t *);
extern int sigprocmask(int, sigset_t *, sigset_t *);
extern int sigsuspend(sigset_t *);
#endif

#if __STDC__ == 0 && !defined(_POSIX_SOURCE)
extern void (*sigset(int, void (*)()))();
extern int sighold(int);
extern int sigrelse(int);
extern int sigignore(int);
extern int sigpause(int);
#endif

#else /* Not __STDC__ */

extern void (*signal())();
extern void (*sigset())();
extern int sighold(), sigrelse(), sigignore(), sigpause();
extern int sigaction(), sigaddset(), sigdelset();
extern int sigemptyset(), sigfillset(), sigismember();
extern int sigpending(), sigprocmask(), sigsuspend();
extern int kill();

#endif 	/* __STDC__ */

#endif /* LANGUAGE_C */

/*
 * sigsetmode flag definitions
 */
#define	SIG_RSTINTR	(1 << 0)	/* restart interrupted system calls */
#define	SIG_RESETDFL	(1 << 1)	/* reset caught signals to SIG_DFL */


#endif /* _SIGNAL_H */
