xref: /linux/arch/m68k/include/asm/signal.h (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
28dba99e0SGreg Ungerer #ifndef _M68K_SIGNAL_H
38dba99e0SGreg Ungerer #define _M68K_SIGNAL_H
48dba99e0SGreg Ungerer 
510b3a979SDavid Howells #include <uapi/asm/signal.h>
68dba99e0SGreg Ungerer 
78dba99e0SGreg Ungerer /* Most things should be clean enough to redefine this at will, if care
88dba99e0SGreg Ungerer    is taken to make libc match.  */
98dba99e0SGreg Ungerer 
108dba99e0SGreg Ungerer #define _NSIG		64
118dba99e0SGreg Ungerer #define _NSIG_BPW	32
128dba99e0SGreg Ungerer #define _NSIG_WORDS	(_NSIG / _NSIG_BPW)
138dba99e0SGreg Ungerer 
148dba99e0SGreg Ungerer typedef unsigned long old_sigset_t;		/* at least 32 bits */
158dba99e0SGreg Ungerer 
168dba99e0SGreg Ungerer typedef struct {
178dba99e0SGreg Ungerer 	unsigned long sig[_NSIG_WORDS];
188dba99e0SGreg Ungerer } sigset_t;
198dba99e0SGreg Ungerer 
20574c4866SAl Viro #define __ARCH_HAS_SA_RESTORER
218dba99e0SGreg Ungerer 
228dba99e0SGreg Ungerer #include <asm/sigcontext.h>
238dba99e0SGreg Ungerer 
24f3c23a28SGreg Ungerer #ifndef CONFIG_CPU_HAS_NO_BITFIELDS
258dba99e0SGreg Ungerer #define __HAVE_ARCH_SIG_BITOPS
268dba99e0SGreg Ungerer 
278dba99e0SGreg Ungerer static inline void sigaddset(sigset_t *set, int _sig)
288dba99e0SGreg Ungerer {
298dba99e0SGreg Ungerer 	asm ("bfset %0{%1,#1}"
3034fa78b5SAndreas Schwab 		: "+o" (*set)
318dba99e0SGreg Ungerer 		: "id" ((_sig - 1) ^ 31)
328dba99e0SGreg Ungerer 		: "cc");
338dba99e0SGreg Ungerer }
348dba99e0SGreg Ungerer 
358dba99e0SGreg Ungerer static inline void sigdelset(sigset_t *set, int _sig)
368dba99e0SGreg Ungerer {
378dba99e0SGreg Ungerer 	asm ("bfclr %0{%1,#1}"
3834fa78b5SAndreas Schwab 		: "+o" (*set)
398dba99e0SGreg Ungerer 		: "id" ((_sig - 1) ^ 31)
408dba99e0SGreg Ungerer 		: "cc");
418dba99e0SGreg Ungerer }
428dba99e0SGreg Ungerer 
438dba99e0SGreg Ungerer static inline int __const_sigismember(sigset_t *set, int _sig)
448dba99e0SGreg Ungerer {
458dba99e0SGreg Ungerer 	unsigned long sig = _sig - 1;
468dba99e0SGreg Ungerer 	return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
478dba99e0SGreg Ungerer }
488dba99e0SGreg Ungerer 
498dba99e0SGreg Ungerer static inline int __gen_sigismember(sigset_t *set, int _sig)
508dba99e0SGreg Ungerer {
518dba99e0SGreg Ungerer 	int ret;
528dba99e0SGreg Ungerer 	asm ("bfextu %1{%2,#1},%0"
538dba99e0SGreg Ungerer 		: "=d" (ret)
5434fa78b5SAndreas Schwab 		: "o" (*set), "id" ((_sig-1) ^ 31)
558dba99e0SGreg Ungerer 		: "cc");
568dba99e0SGreg Ungerer 	return ret;
578dba99e0SGreg Ungerer }
588dba99e0SGreg Ungerer 
598dba99e0SGreg Ungerer #define sigismember(set,sig)			\
608dba99e0SGreg Ungerer 	(__builtin_constant_p(sig) ?		\
618dba99e0SGreg Ungerer 	 __const_sigismember(set,sig) :		\
628dba99e0SGreg Ungerer 	 __gen_sigismember(set,sig))
638dba99e0SGreg Ungerer 
64f3c23a28SGreg Ungerer #endif /* !CONFIG_CPU_HAS_NO_BITFIELDS */
65f3c23a28SGreg Ungerer 
668dba99e0SGreg Ungerer #endif /* _M68K_SIGNAL_H */
67