xref: /linux/include/linux/thread_info.h (revision db6d8d5fdf9537641c76ba7f32e02b4bcc600972)
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 
13 struct timespec;
14 struct compat_timespec;
15 
16 #ifdef CONFIG_THREAD_INFO_IN_TASK
17 struct thread_info {
18 	unsigned long		flags;		/* low level flags */
19 };
20 
21 #define INIT_THREAD_INFO(tsk)			\
22 {						\
23 	.flags		= 0,			\
24 }
25 #endif
26 
27 #ifdef CONFIG_THREAD_INFO_IN_TASK
28 #define current_thread_info() ((struct thread_info *)current)
29 #endif
30 
31 /*
32  * System call restart block.
33  */
34 struct restart_block {
35 	long (*fn)(struct restart_block *);
36 	union {
37 		/* For futex_wait and futex_wait_requeue_pi */
38 		struct {
39 			u32 __user *uaddr;
40 			u32 val;
41 			u32 flags;
42 			u32 bitset;
43 			u64 time;
44 			u32 __user *uaddr2;
45 		} futex;
46 		/* For nanosleep */
47 		struct {
48 			clockid_t clockid;
49 			struct timespec __user *rmtp;
50 #ifdef CONFIG_COMPAT
51 			struct compat_timespec __user *compat_rmtp;
52 #endif
53 			u64 expires;
54 		} nanosleep;
55 		/* For poll */
56 		struct {
57 			struct pollfd __user *ufds;
58 			int nfds;
59 			int has_timeout;
60 			unsigned long tv_sec;
61 			unsigned long tv_nsec;
62 		} poll;
63 	};
64 };
65 
66 extern long do_no_restart_syscall(struct restart_block *parm);
67 
68 #include <linux/bitops.h>
69 #include <asm/thread_info.h>
70 
71 #ifdef __KERNEL__
72 
73 #ifdef CONFIG_DEBUG_STACK_USAGE
74 # define THREADINFO_GFP		(GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
75 				 __GFP_ZERO)
76 #else
77 # define THREADINFO_GFP		(GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
78 #endif
79 
80 /*
81  * flag set/clear/test wrappers
82  * - pass TIF_xxxx constants to these functions
83  */
84 
85 static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
86 {
87 	set_bit(flag, (unsigned long *)&ti->flags);
88 }
89 
90 static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
91 {
92 	clear_bit(flag, (unsigned long *)&ti->flags);
93 }
94 
95 static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
96 {
97 	return test_and_set_bit(flag, (unsigned long *)&ti->flags);
98 }
99 
100 static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
101 {
102 	return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
103 }
104 
105 static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
106 {
107 	return test_bit(flag, (unsigned long *)&ti->flags);
108 }
109 
110 #define set_thread_flag(flag) \
111 	set_ti_thread_flag(current_thread_info(), flag)
112 #define clear_thread_flag(flag) \
113 	clear_ti_thread_flag(current_thread_info(), flag)
114 #define test_and_set_thread_flag(flag) \
115 	test_and_set_ti_thread_flag(current_thread_info(), flag)
116 #define test_and_clear_thread_flag(flag) \
117 	test_and_clear_ti_thread_flag(current_thread_info(), flag)
118 #define test_thread_flag(flag) \
119 	test_ti_thread_flag(current_thread_info(), flag)
120 
121 #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
122 
123 #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
124 static inline int arch_within_stack_frames(const void * const stack,
125 					   const void * const stackend,
126 					   const void *obj, unsigned long len)
127 {
128 	return 0;
129 }
130 #endif
131 
132 #ifdef CONFIG_HARDENED_USERCOPY
133 extern void __check_object_size(const void *ptr, unsigned long n,
134 					bool to_user);
135 
136 static __always_inline void check_object_size(const void *ptr, unsigned long n,
137 					      bool to_user)
138 {
139 	if (!__builtin_constant_p(n))
140 		__check_object_size(ptr, n, to_user);
141 }
142 #else
143 static inline void check_object_size(const void *ptr, unsigned long n,
144 				     bool to_user)
145 { }
146 #endif /* CONFIG_HARDENED_USERCOPY */
147 
148 #endif	/* __KERNEL__ */
149 
150 #endif /* _LINUX_THREAD_INFO_H */
151