summaryrefslogtreecommitdiff
path: root/usr/src/lib/libbc/inc/include/sys/signal.h
blob: 586222b541ab77ce382d12b8d0ab17769d541c52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 1982 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#ifndef	__sys_signal_h
#define	__sys_signal_h

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <vm/faultcode.h>
#define	NSIG	32

/*
 * If any signal defines (SIG*) are added, deleted, or changed, the same
 * changes must be made in /usr/include/signal.h as well.
 */
#define	SIGHUP	1	/* hangup */
#define	SIGINT	2	/* interrupt */
#define	SIGQUIT	3	/* quit */
#define	SIGILL	4	/* illegal instruction (not reset when caught) */

#define	ILL_STACK		0x00	/* bad stack */
#define	ILL_ILLINSTR_FAULT	0x02	/* illegal instruction fault */
#define	ILL_PRIVINSTR_FAULT	0x03	/* privileged instruction fault */
/* codes from 0x80 to 0xff are software traps */
#define	ILL_TRAP_FAULT(n)	((n)+0x80) /* trap n fault */

#define	SIGTRAP	5	/* trace trap (not reset when caught) */
#define	SIGIOT	6	/* IOT instruction */
#define	SIGABRT 6	/* used by abort, replace SIGIOT in the future */
#define	SIGEMT	7	/* EMT instruction */

#define	EMT_TAG		0x0a	/* tag overflow */

#define	SIGFPE	8	/* floating point exception */

#define	FPE_INTOVF_TRAP	0x1	/* integer overflow */
#define	FPE_STARTSIG_TRAP	0x2	/* process using fp */
#define	FPE_INTDIV_TRAP	0x14	/* integer divide by zero */
#define	FPE_FLTINEX_TRAP	0xc4	/* [floating inexact result] */
#define	FPE_FLTDIV_TRAP	0xc8	/* [floating divide by zero] */
#define	FPE_FLTUND_TRAP	0xcc	/* [floating underflow] */
#define	FPE_FLTOPERR_TRAP	0xd0	/* [floating operand error] */
#define	FPE_FLTOVF_TRAP	0xd4	/* [floating overflow] */

#define	SIGKILL	9	/* kill (cannot be caught or ignored) */
/*
 * The codes for SIGBUS and SIGSEGV are described in <vm/faultcode.h>
 */
#define	SIGBUS	10	/* bus error */
#define	BUS_HWERR	FC_HWERR	/* misc hardware error (e.g. timeout) */
#define	BUS_ALIGN	FC_ALIGN	/* hardware alignment error */
#define	BUS_OBJERR	FC_OBJERR	/* object returned errno value */
/*
 * The BUS_CODE(code) will be one of the above.  In the BUS_OBJERR case,
 * doing a BUS_ERRNO(code) gives an errno value reported by the underlying
 * file object mapped at the fault address.  Note that this appears to be
 * duplicated with the segmentation fault case below -- unfortunate, since
 * the specification has always claimed that such errors produce SIGBUS.
 * The segmentation cases are left defined as a transition aid.
 */
#define	BUS_CODE(C)		FC_CODE(C)
#define	BUS_ERRNO(C)	FC_ERRNO(C)
#define	SIGSEGV	11	/* segmentation violation */
#define	SEGV_NOMAP	FC_NOMAP	/* no mapping at the fault address */
#define	SEGV_PROT	FC_PROT		/* access exceeded protections */
#define	SEGV_OBJERR	FC_OBJERR	/* object returned errno value */
/*
 * The SEGV_CODE(code) will be SEGV_NOMAP, SEGV_PROT, or SEGV_OBJERR.
 * In the SEGV_OBJERR case, doing a SEGV_ERRNO(code) gives an errno value
 * reported by the underlying file object mapped at the fault address.
 */
#define	SEGV_CODE(C)	FC_CODE(C)
#define	SEGV_ERRNO(C)	FC_ERRNO(C)
#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	SIGCONT	19	/* continue a stopped process */
#define	SIGCHLD	20	/* to parent on child stop or exit */
#define	SIGCLD	20	/* System V name for 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	SIGPOLL	SIGIO	/* System V name for SIGIO */
#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	SIGWINCH 28	/* window changed */
#define	SIGLOST 29	/* resource lost (eg, record-lock lost) */
#define	SIGUSR1 30	/* user defined signal 1 */
#define	SIGUSR2 31	/* user defined signal 2 */
/*
 * If addr cannot be computed it is set to SIG_NOADDR.
 */
#define	SIG_NOADDR	((char *)~0)

#if	!defined(KERNEL)  &&  !defined(LOCORE)
void	(*signal())();
/*
 * Define BSD 4.1 reliable signals for SVID compatibility.
 * These functions may go away in a future release.
 */
void  (*sigset())();
int   sighold();
int   sigrelse();
int   sigignore();
#endif	/* !KERNEL  &&  !LOCORE */

#ifndef	LOCORE
/*
 * Signal vector "template" used in sigvec call.
 */
struct	sigvec {
	void	(*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	/* reset signal handler to SIG_DFL when signal taken */
/*
 * If any SA_NOCLDSTOP or SV_NOCLDSTOP is change, the same
 * changes must be made in /usr/include/signal.h as well.
 */
#define	SV_NOCLDSTOP	0x0008	/* don't send a SIGCHLD on child stop */
#define	SA_ONSTACK	SV_ONSTACK
#define	SA_INTERRUPT	SV_INTERRUPT
#define	SA_RESETHAND	SV_RESETHAND

#define	SA_NOCLDSTOP	SV_NOCLDSTOP
#define	sv_onstack sv_flags	/* isn't compatibility wonderful! */

/*
 * 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.
 */
struct	sigcontext {
	int	sc_onstack;		/* sigstack state to restore */
	int	sc_mask;		/* signal mask to restore */
#define	SPARC_MAXREGWINDOW	31	/* max usable windows in sparc */
	int	sc_sp;			/* sp to restore */
	int	sc_pc;			/* pc to retore */
	int	sc_npc;			/* next pc to restore */
	int	sc_psr;			/* psr to restore */
	int	sc_g1;			/* register that must be restored */
	int	sc_o0;
	int	sc_wbcnt;		/* number of outstanding windows */
	char	*sc_spbuf[SPARC_MAXREGWINDOW]; /* sp's for each wbuf */
	int	sc_wbuf[SPARC_MAXREGWINDOW][16]; /* window save buf */
};
#endif	/* !LOCORE */

#define	BADSIG		(void (*)())-1

/*
 * If SIG_ERR, SIG_DFL, SIG_IGN, or SIG_HOLD are changed, the same changes
 * must be made in /usr/include/signal.h as well.
 */
#define	SIG_ERR		(void (*)())-1
#define	SIG_DFL		(void (*)())0
#define	SIG_IGN		(void (*)())1

#define	SIG_HOLD	(void (*)())3

/*
 * Macro for converting signal number to a mask suitable for sigblock().
 */
#define	sigmask(m)	(1 << ((m)-1))
/*
 * signals that can't caught, blocked, or ignored
 */

/*
 * If SIG_BLOCK, SIG_UNBLOCK, or SIG_SETMASK are changed, the same changes
 * must be made in /usr/include/signal.h as well.
 */
#define	SIG_BLOCK		0x0001
#define	SIG_UNBLOCK		0x0002
#define	SIG_SETMASK		0x0004

#if	!defined(LOCORE) && !defined(KERNEL)

/*
 * If changes are made to sigset_t or struct sigaction, the same changes
 * must be made in /usr/include/signal.h as well.
 */
#include <sys/stdtypes.h>

struct	sigaction {
	void 		(*sa_handler)();
	sigset_t	sa_mask;
	int		sa_flags;
};

/*
 * If changes are made to the function prototypes, the same changes
 * must be made in /usr/include/signal.h as well.
 */
void	(*signal())();
int	kill(/* pid_t p, int sig */);
int	sigaction(/* int signo,
	    struct sigaction *act, struct sigaction *oldact */);
int	sigaddset(/* sigset_t *mask, int signo */);
int	sigdelset(/* sigset_t *mask, int signo */);
int	sigemptyset(/* sigset_t *mask */);
int	sigfillset(/* sigset_t *mask */);
int	sigismember(/* sigset_t *mask, int signo */);
int	sigpending(/* sigset_t *set */);
int	sigprocmask(/* int how, sigset_t *set, *oldset */);
int	sigsuspend(/* sigset_t *mask */);

#endif	/* !LOCORE && !KERNEL */
#endif	/* !__sys_signal_h */