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