1/* thread_info.h: common low-level thread information accessors
2 *
3 * Copyright (C) 2002  David Howells (dhowells@redhat.com)
4 * - Incorporating suggestions made by Linus Torvalds
5 */
6
7#ifndef _LINUX_THREAD_INFO_H
8#define _LINUX_THREAD_INFO_H
9
10#include <linux/types.h>
11#include <linux/bug.h>
12
13struct timespec;
14struct compat_timespec;
15
16/*
17 * System call restart block.
18 */
19struct restart_block {
20	long (*fn)(struct restart_block *);
21	union {
22		/* For futex_wait and futex_wait_requeue_pi */
23		struct {
24			u32 __user *uaddr;
25			u32 val;
26			u32 flags;
27			u32 bitset;
28			u64 time;
29			u32 __user *uaddr2;
30		} futex;
31		/* For nanosleep */
32		struct {
33			clockid_t clockid;
34			struct timespec __user *rmtp;
35#ifdef CONFIG_COMPAT
36			struct compat_timespec __user *compat_rmtp;
37#endif
38			u64 expires;
39		} nanosleep;
40		/* For poll */
41		struct {
42			struct pollfd __user *ufds;
43			int nfds;
44			int has_timeout;
45			unsigned long tv_sec;
46			unsigned long tv_nsec;
47		} poll;
48	};
49};
50
51extern long do_no_restart_syscall(struct restart_block *parm);
52
53#include <linux/bitops.h>
54#include <asm/thread_info.h>
55
56#ifdef __KERNEL__
57
58#ifdef CONFIG_DEBUG_STACK_USAGE
59# define THREADINFO_GFP		(GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
60#else
61# define THREADINFO_GFP		(GFP_KERNEL | __GFP_NOTRACK)
62#endif
63
64/*
65 * flag set/clear/test wrappers
66 * - pass TIF_xxxx constants to these functions
67 */
68
69static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
70{
71	set_bit(flag, (unsigned long *)&ti->flags);
72}
73
74static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
75{
76	clear_bit(flag, (unsigned long *)&ti->flags);
77}
78
79static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
80{
81	return test_and_set_bit(flag, (unsigned long *)&ti->flags);
82}
83
84static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
85{
86	return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
87}
88
89static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
90{
91	return test_bit(flag, (unsigned long *)&ti->flags);
92}
93
94#define set_thread_flag(flag) \
95	set_ti_thread_flag(current_thread_info(), flag)
96#define clear_thread_flag(flag) \
97	clear_ti_thread_flag(current_thread_info(), flag)
98#define test_and_set_thread_flag(flag) \
99	test_and_set_ti_thread_flag(current_thread_info(), flag)
100#define test_and_clear_thread_flag(flag) \
101	test_and_clear_ti_thread_flag(current_thread_info(), flag)
102#define test_thread_flag(flag) \
103	test_ti_thread_flag(current_thread_info(), flag)
104
105#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
106
107#if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK
108/*
109 * An arch can define its own version of set_restore_sigmask() to get the
110 * job done however works, with or without TIF_RESTORE_SIGMASK.
111 */
112#define HAVE_SET_RESTORE_SIGMASK	1
113
114/**
115 * set_restore_sigmask() - make sure saved_sigmask processing gets done
116 *
117 * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code
118 * will run before returning to user mode, to process the flag.  For
119 * all callers, TIF_SIGPENDING is already set or it's no harm to set
120 * it.  TIF_RESTORE_SIGMASK need not be in the set of bits that the
121 * arch code will notice on return to user mode, in case those bits
122 * are scarce.  We set TIF_SIGPENDING here to ensure that the arch
123 * signal code always gets run when TIF_RESTORE_SIGMASK is set.
124 */
125static inline void set_restore_sigmask(void)
126{
127	set_thread_flag(TIF_RESTORE_SIGMASK);
128	WARN_ON(!test_thread_flag(TIF_SIGPENDING));
129}
130static inline void clear_restore_sigmask(void)
131{
132	clear_thread_flag(TIF_RESTORE_SIGMASK);
133}
134static inline bool test_restore_sigmask(void)
135{
136	return test_thread_flag(TIF_RESTORE_SIGMASK);
137}
138static inline bool test_and_clear_restore_sigmask(void)
139{
140	return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
141}
142#endif	/* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
143
144#ifndef HAVE_SET_RESTORE_SIGMASK
145#error "no set_restore_sigmask() provided and default one won't work"
146#endif
147
148#endif	/* __KERNEL__ */
149
150#endif /* _LINUX_THREAD_INFO_H */
151