xref: /openbmc/linux/arch/x86/include/asm/signal.h (revision 92a3ce4a1e0047215aa0a0b30cc333bd32b866a8)
1 #ifndef _ASM_X86_SIGNAL_H
2 #define _ASM_X86_SIGNAL_H
3 
4 #ifndef __ASSEMBLY__
5 #include <linux/linkage.h>
6 
7 /* Most things should be clean enough to redefine this at will, if care
8    is taken to make libc match.  */
9 
10 #define _NSIG		64
11 
12 #ifdef __i386__
13 # define _NSIG_BPW	32
14 #else
15 # define _NSIG_BPW	64
16 #endif
17 
18 #define _NSIG_WORDS	(_NSIG / _NSIG_BPW)
19 
20 typedef unsigned long old_sigset_t;		/* at least 32 bits */
21 
22 typedef struct {
23 	unsigned long sig[_NSIG_WORDS];
24 } sigset_t;
25 
26 #ifndef CONFIG_COMPAT
27 typedef sigset_t compat_sigset_t;
28 #endif
29 
30 #endif /* __ASSEMBLY__ */
31 #include <uapi/asm/signal.h>
32 #ifndef __ASSEMBLY__
33 extern void do_notify_resume(struct pt_regs *, void *, __u32);
34 #ifdef __i386__
35 struct old_sigaction {
36 	__sighandler_t sa_handler;
37 	old_sigset_t sa_mask;
38 	unsigned long sa_flags;
39 	__sigrestore_t sa_restorer;
40 };
41 
42 struct sigaction {
43 	__sighandler_t sa_handler;
44 	unsigned long sa_flags;
45 	__sigrestore_t sa_restorer;
46 	sigset_t sa_mask;		/* mask last for extensibility */
47 };
48 
49 #endif /* !__i386__ */
50 #include <asm/sigcontext.h>
51 
52 #ifdef __i386__
53 
54 #define __HAVE_ARCH_SIG_BITOPS
55 
56 #define sigaddset(set,sig)		    \
57 	(__builtin_constant_p(sig)	    \
58 	 ? __const_sigaddset((set), (sig))  \
59 	 : __gen_sigaddset((set), (sig)))
60 
61 static inline void __gen_sigaddset(sigset_t *set, int _sig)
62 {
63 	asm("btsl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
64 }
65 
66 static inline void __const_sigaddset(sigset_t *set, int _sig)
67 {
68 	unsigned long sig = _sig - 1;
69 	set->sig[sig / _NSIG_BPW] |= 1 << (sig % _NSIG_BPW);
70 }
71 
72 #define sigdelset(set, sig)		    \
73 	(__builtin_constant_p(sig)	    \
74 	 ? __const_sigdelset((set), (sig))  \
75 	 : __gen_sigdelset((set), (sig)))
76 
77 
78 static inline void __gen_sigdelset(sigset_t *set, int _sig)
79 {
80 	asm("btrl %1,%0" : "+m"(*set) : "Ir"(_sig - 1) : "cc");
81 }
82 
83 static inline void __const_sigdelset(sigset_t *set, int _sig)
84 {
85 	unsigned long sig = _sig - 1;
86 	set->sig[sig / _NSIG_BPW] &= ~(1 << (sig % _NSIG_BPW));
87 }
88 
89 static inline int __const_sigismember(sigset_t *set, int _sig)
90 {
91 	unsigned long sig = _sig - 1;
92 	return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
93 }
94 
95 static inline int __gen_sigismember(sigset_t *set, int _sig)
96 {
97 	int ret;
98 	asm("btl %2,%1\n\tsbbl %0,%0"
99 	    : "=r"(ret) : "m"(*set), "Ir"(_sig-1) : "cc");
100 	return ret;
101 }
102 
103 #define sigismember(set, sig)			\
104 	(__builtin_constant_p(sig)		\
105 	 ? __const_sigismember((set), (sig))	\
106 	 : __gen_sigismember((set), (sig)))
107 
108 static inline int sigfindinword(unsigned long word)
109 {
110 	asm("bsfl %1,%0" : "=r"(word) : "rm"(word) : "cc");
111 	return word;
112 }
113 
114 struct pt_regs;
115 
116 #else /* __i386__ */
117 
118 #undef __HAVE_ARCH_SIG_BITOPS
119 
120 #endif /* !__i386__ */
121 
122 #endif /* __ASSEMBLY__ */
123 #endif /* _ASM_X86_SIGNAL_H */
124