Home | History | Annotate | Download | only in asm-x86
      1 #ifndef _ASM_X86_SIGNAL_H
      2 #define _ASM_X86_SIGNAL_H
      3 
      4 #ifndef __ASSEMBLY__
      5 #include <linux/types.h>
      6 #include <linux/time.h>
      7 #include <linux/compiler.h>
      8 
      9 /* Avoid too many header ordering problems.  */
     10 struct siginfo;
     11 
     12 #ifdef __KERNEL__
     13 #include <linux/linkage.h>
     14 
     15 /* Most things should be clean enough to redefine this at will, if care
     16    is taken to make libc match.  */
     17 
     18 #define _NSIG		64
     19 
     20 #ifdef __i386__
     21 # define _NSIG_BPW	32
     22 #else
     23 # define _NSIG_BPW	64
     24 #endif
     25 
     26 #define _NSIG_WORDS	(_NSIG / _NSIG_BPW)
     27 
     28 typedef unsigned long old_sigset_t;		/* at least 32 bits */
     29 
     30 typedef struct {
     31 	unsigned long sig[_NSIG_WORDS];
     32 } sigset_t;
     33 
     34 #else
     35 /* Here we must cater to libcs that poke about in kernel headers.  */
     36 
     37 #define NSIG		32
     38 typedef unsigned long sigset_t;
     39 
     40 #endif /* __KERNEL__ */
     41 #endif /* __ASSEMBLY__ */
     42 
     43 #define SIGHUP		 1
     44 #define SIGINT		 2
     45 #define SIGQUIT		 3
     46 #define SIGILL		 4
     47 #define SIGTRAP		 5
     48 #define SIGABRT		 6
     49 #define SIGIOT		 6
     50 #define SIGBUS		 7
     51 #define SIGFPE		 8
     52 #define SIGKILL		 9
     53 #define SIGUSR1		10
     54 #define SIGSEGV		11
     55 #define SIGUSR2		12
     56 #define SIGPIPE		13
     57 #define SIGALRM		14
     58 #define SIGTERM		15
     59 #define SIGSTKFLT	16
     60 #define SIGCHLD		17
     61 #define SIGCONT		18
     62 #define SIGSTOP		19
     63 #define SIGTSTP		20
     64 #define SIGTTIN		21
     65 #define SIGTTOU		22
     66 #define SIGURG		23
     67 #define SIGXCPU		24
     68 #define SIGXFSZ		25
     69 #define SIGVTALRM	26
     70 #define SIGPROF		27
     71 #define SIGWINCH	28
     72 #define SIGIO		29
     73 #define SIGPOLL		SIGIO
     74 /*
     75 #define SIGLOST		29
     76 */
     77 #define SIGPWR		30
     78 #define SIGSYS		31
     79 #define	SIGUNUSED	31
     80 
     81 /* These should not be considered constants from userland.  */
     82 #define SIGRTMIN	32
     83 #define SIGRTMAX	_NSIG
     84 
     85 /*
     86  * SA_FLAGS values:
     87  *
     88  * SA_ONSTACK indicates that a registered stack_t will be used.
     89  * SA_RESTART flag to get restarting signals (which were the default long ago)
     90  * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
     91  * SA_RESETHAND clears the handler when the signal is delivered.
     92  * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
     93  * SA_NODEFER prevents the current signal from being masked in the handler.
     94  *
     95  * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
     96  * Unix names RESETHAND and NODEFER respectively.
     97  */
     98 #define SA_NOCLDSTOP	0x00000001u
     99 #define SA_NOCLDWAIT	0x00000002u
    100 #define SA_SIGINFO	0x00000004u
    101 #define SA_ONSTACK	0x08000000u
    102 #define SA_RESTART	0x10000000u
    103 #define SA_NODEFER	0x40000000u
    104 #define SA_RESETHAND	0x80000000u
    105 
    106 #define SA_NOMASK	SA_NODEFER
    107 #define SA_ONESHOT	SA_RESETHAND
    108 
    109 #define SA_RESTORER	0x04000000
    110 
    111 /*
    112  * sigaltstack controls
    113  */
    114 #define SS_ONSTACK	1
    115 #define SS_DISABLE	2
    116 
    117 #define MINSIGSTKSZ	2048
    118 #define SIGSTKSZ	8192
    119 
    120 #include <asm-generic/signal.h>
    121 
    122 #ifndef __ASSEMBLY__
    123 
    124 #ifdef __i386__
    125 # ifdef __KERNEL__
    126 struct old_sigaction {
    127 	__sighandler_t sa_handler;
    128 	old_sigset_t sa_mask;
    129 	unsigned long sa_flags;
    130 	__sigrestore_t sa_restorer;
    131 };
    132 
    133 struct sigaction {
    134 	__sighandler_t sa_handler;
    135 	unsigned long sa_flags;
    136 	__sigrestore_t sa_restorer;
    137 	sigset_t sa_mask;		/* mask last for extensibility */
    138 };
    139 
    140 struct k_sigaction {
    141 	struct sigaction sa;
    142 };
    143 # else /* __KERNEL__ */
    144 /* Here we must cater to libcs that poke about in kernel headers.  */
    145 
    146 struct sigaction {
    147 	union {
    148 	  __sighandler_t _sa_handler;
    149 	  void (*_sa_sigaction)(int, struct siginfo *, void *);
    150 	} _u;
    151 	sigset_t sa_mask;
    152 	unsigned long sa_flags;
    153 	void (*sa_restorer)(void);
    154 };
    155 
    156 #define sa_handler	_u._sa_handler
    157 #define sa_sigaction	_u._sa_sigaction
    158 
    159 # endif /* ! __KERNEL__ */
    160 #else /* __i386__ */
    161 
    162 struct sigaction {
    163 	__sighandler_t sa_handler;
    164 	unsigned long sa_flags;
    165 	__sigrestore_t sa_restorer;
    166 	sigset_t sa_mask;		/* mask last for extensibility */
    167 };
    168 
    169 struct k_sigaction {
    170 	struct sigaction sa;
    171 };
    172 
    173 #endif /* !__i386__ */
    174 
    175 typedef struct sigaltstack {
    176 	void __user *ss_sp;
    177 	int ss_flags;
    178 	size_t ss_size;
    179 } stack_t;
    180 
    181 #ifdef __KERNEL__
    182 #include <asm/sigcontext.h>
    183 
    184 #ifdef __386__
    185 
    186 #define __HAVE_ARCH_SIG_BITOPS
    187 
    188 #define sigaddset(set,sig)		   \
    189 	(__builtin_constantp(sig) ?	   \
    190 	 __const_sigaddset((set),(sig)) :  \
    191 	 __gen_sigaddset((set),(sig)))
    192 
    193 static __inline__ void __gen_sigaddset(sigset_t *set, int _sig)
    194 {
    195 	__asm__("btsl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
    196 }
    197 
    198 static __inline__ void __const_sigaddset(sigset_t *set, int _sig)
    199 {
    200 	unsigned long sig = _sig - 1;
    201 	set->sig[sig / _NSIG_BPW] |= 1 << (sig % _NSIG_BPW);
    202 }
    203 
    204 #define sigdelset(set,sig)		   \
    205 	(__builtin_constant_p(sig) ?       \
    206 	 __const_sigdelset((set),(sig)) :  \
    207 	 __gen_sigdelset((set),(sig)))
    208 
    209 
    210 static __inline__ void __gen_sigdelset(sigset_t *set, int _sig)
    211 {
    212 	__asm__("btrl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
    213 }
    214 
    215 static __inline__ void __const_sigdelset(sigset_t *set, int _sig)
    216 {
    217 	unsigned long sig = _sig - 1;
    218 	set->sig[sig / _NSIG_BPW] &= ~(1 << (sig % _NSIG_BPW));
    219 }
    220 
    221 static __inline__ int __const_sigismember(sigset_t *set, int _sig)
    222 {
    223 	unsigned long sig = _sig - 1;
    224 	return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
    225 }
    226 
    227 static __inline__ int __gen_sigismember(sigset_t *set, int _sig)
    228 {
    229 	int ret;
    230 	__asm__("btl %2,%1\n\tsbbl %0,%0"
    231 		: "=r"(ret) : "m"(*set), "Ir"(_sig-1) : "cc");
    232 	return ret;
    233 }
    234 
    235 #define sigismember(set,sig)			\
    236 	(__builtin_constant_p(sig) ?		\
    237 	 __const_sigismember((set),(sig)) :	\
    238 	 __gen_sigismember((set),(sig)))
    239 
    240 static __inline__ int sigfindinword(unsigned long word)
    241 {
    242 	__asm__("bsfl %1,%0" : "=r"(word) : "rm"(word) : "cc");
    243 	return word;
    244 }
    245 
    246 struct pt_regs;
    247 
    248 #define ptrace_signal_deliver(regs, cookie)		\
    249 	do {						\
    250 		if (current->ptrace & PT_DTRACE) {	\
    251 			current->ptrace &= ~PT_DTRACE;	\
    252 			(regs)->eflags &= ~TF_MASK;	\
    253 		}					\
    254 	} while (0)
    255 
    256 #else /* __i386__ */
    257 
    258 #undef __HAVE_ARCH_SIG_BITOPS
    259 
    260 #define ptrace_signal_deliver(regs, cookie) do { } while (0)
    261 
    262 #endif /* !__i386__ */
    263 #endif /* __KERNEL__ */
    264 #endif /* __ASSEMBLY__ */
    265 
    266 #endif
    267