]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - include/linux/thread_info.h
Merge tag 'usb-serial-5.13-rc6' of https://git.kernel.org/pub/scm/linux/kernel/git...
[mirror_ubuntu-jammy-kernel.git] / include / linux / thread_info.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2/* thread_info.h: common low-level thread information accessors
3 *
4 * Copyright (C) 2002 David Howells (dhowells@redhat.com)
5 * - Incorporating suggestions made by Linus Torvalds
6 */
7
8#ifndef _LINUX_THREAD_INFO_H
9#define _LINUX_THREAD_INFO_H
10
ce6bd420 11#include <linux/types.h>
edd63a27 12#include <linux/bug.h>
53d74d05 13#include <linux/restart_block.h>
5abbe51a 14#include <linux/errno.h>
a332d86d 15
c65eacbe 16#ifdef CONFIG_THREAD_INFO_IN_TASK
dc3d2a67
MR
17/*
18 * For CONFIG_THREAD_INFO_IN_TASK kernels we need <asm/current.h> for the
19 * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels,
20 * including <asm/current.h> can cause a circular dependency on some platforms.
21 */
22#include <asm/current.h>
c65eacbe
AL
23#define current_thread_info() ((struct thread_info *)current)
24#endif
25
1da177e4 26#include <linux/bitops.h>
96dc4f9f
S
27
28/*
29 * For per-arch arch_within_stack_frames() implementations, defined in
30 * asm/thread_info.h.
31 */
32enum {
33 BAD_STACK = -1,
34 NOT_STACK = 0,
35 GOOD_FRAME,
36 GOOD_STACK,
37};
38
5903f61e 39#ifdef CONFIG_GENERIC_ENTRY
23d67a54
GKB
40enum syscall_work_bit {
41 SYSCALL_WORK_BIT_SECCOMP,
524666cb 42 SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT,
64c19ba2 43 SYSCALL_WORK_BIT_SYSCALL_TRACE,
64eb35f7 44 SYSCALL_WORK_BIT_SYSCALL_EMU,
785dc4eb 45 SYSCALL_WORK_BIT_SYSCALL_AUDIT,
1446e1df 46 SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH,
6342adca 47 SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP,
23d67a54
GKB
48};
49
50#define SYSCALL_WORK_SECCOMP BIT(SYSCALL_WORK_BIT_SECCOMP)
524666cb 51#define SYSCALL_WORK_SYSCALL_TRACEPOINT BIT(SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT)
64c19ba2 52#define SYSCALL_WORK_SYSCALL_TRACE BIT(SYSCALL_WORK_BIT_SYSCALL_TRACE)
64eb35f7 53#define SYSCALL_WORK_SYSCALL_EMU BIT(SYSCALL_WORK_BIT_SYSCALL_EMU)
785dc4eb 54#define SYSCALL_WORK_SYSCALL_AUDIT BIT(SYSCALL_WORK_BIT_SYSCALL_AUDIT)
1446e1df 55#define SYSCALL_WORK_SYSCALL_USER_DISPATCH BIT(SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH)
6342adca 56#define SYSCALL_WORK_SYSCALL_EXIT_TRAP BIT(SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP)
5903f61e 57#endif
23d67a54 58
1da177e4
LT
59#include <asm/thread_info.h>
60
61#ifdef __KERNEL__
62
5abbe51a
ON
63#ifndef arch_set_restart_data
64#define arch_set_restart_data(restart) do { } while (0)
65#endif
66
67static inline long set_restart_fn(struct restart_block *restart,
68 long (*fn)(struct restart_block *))
69{
70 restart->fn = fn;
71 arch_set_restart_data(restart);
72 return -ERESTART_RESTARTBLOCK;
73}
74
48ac3c18
MR
75#ifndef THREAD_ALIGN
76#define THREAD_ALIGN THREAD_SIZE
77#endif
78
e01e8063 79#define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO)
2889f608 80
1da177e4
LT
81/*
82 * flag set/clear/test wrappers
83 * - pass TIF_xxxx constants to these functions
84 */
85
1da177e4
LT
86static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
87{
5548fecd 88 set_bit(flag, (unsigned long *)&ti->flags);
1da177e4
LT
89}
90
91static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
92{
5548fecd 93 clear_bit(flag, (unsigned long *)&ti->flags);
1da177e4
LT
94}
95
93ee37c2
DM
96static inline void update_ti_thread_flag(struct thread_info *ti, int flag,
97 bool value)
98{
99 if (value)
100 set_ti_thread_flag(ti, flag);
101 else
102 clear_ti_thread_flag(ti, flag);
103}
104
1da177e4
LT
105static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
106{
5548fecd 107 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
1da177e4
LT
108}
109
110static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
111{
5548fecd 112 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
1da177e4
LT
113}
114
115static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
116{
5548fecd 117 return test_bit(flag, (unsigned long *)&ti->flags);
1da177e4
LT
118}
119
3b66a1ed
RZ
120#define set_thread_flag(flag) \
121 set_ti_thread_flag(current_thread_info(), flag)
122#define clear_thread_flag(flag) \
123 clear_ti_thread_flag(current_thread_info(), flag)
93ee37c2
DM
124#define update_thread_flag(flag, value) \
125 update_ti_thread_flag(current_thread_info(), flag, value)
3b66a1ed
RZ
126#define test_and_set_thread_flag(flag) \
127 test_and_set_ti_thread_flag(current_thread_info(), flag)
128#define test_and_clear_thread_flag(flag) \
129 test_and_clear_ti_thread_flag(current_thread_info(), flag)
130#define test_thread_flag(flag) \
131 test_ti_thread_flag(current_thread_info(), flag)
132
3136b93c
GKB
133#ifdef CONFIG_GENERIC_ENTRY
134#define set_syscall_work(fl) \
135 set_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
136#define test_syscall_work(fl) \
137 test_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
138#define clear_syscall_work(fl) \
139 clear_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
140
141#define set_task_syscall_work(t, fl) \
142 set_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
143#define test_task_syscall_work(t, fl) \
144 test_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
145#define clear_task_syscall_work(t, fl) \
146 clear_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
147
148#else /* CONFIG_GENERIC_ENTRY */
149
150#define set_syscall_work(fl) \
5903f61e 151 set_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c 152#define test_syscall_work(fl) \
5903f61e 153 test_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c 154#define clear_syscall_work(fl) \
5903f61e 155 clear_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c
GKB
156
157#define set_task_syscall_work(t, fl) \
158 set_ti_thread_flag(task_thread_info(t), TIF_##fl)
159#define test_task_syscall_work(t, fl) \
160 test_ti_thread_flag(task_thread_info(t), TIF_##fl)
161#define clear_task_syscall_work(t, fl) \
162 clear_ti_thread_flag(task_thread_info(t), TIF_##fl)
163#endif /* !CONFIG_GENERIC_ENTRY */
164
ea811747
PZ
165#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
166
0f60a8ef
KC
167#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
168static inline int arch_within_stack_frames(const void * const stack,
169 const void * const stackend,
170 const void *obj, unsigned long len)
171{
172 return 0;
173}
174#endif
175
f5509cc1
KC
176#ifdef CONFIG_HARDENED_USERCOPY
177extern void __check_object_size(const void *ptr, unsigned long n,
178 bool to_user);
179
a85d6b82
KC
180static __always_inline void check_object_size(const void *ptr, unsigned long n,
181 bool to_user)
f5509cc1 182{
81409e9e
KC
183 if (!__builtin_constant_p(n))
184 __check_object_size(ptr, n, to_user);
f5509cc1
KC
185}
186#else
187static inline void check_object_size(const void *ptr, unsigned long n,
188 bool to_user)
189{ }
190#endif /* CONFIG_HARDENED_USERCOPY */
191
b0377fed
AV
192extern void __compiletime_error("copy source size is too small")
193__bad_copy_from(void);
194extern void __compiletime_error("copy destination size is too small")
195__bad_copy_to(void);
196
197static inline void copy_overflow(int size, unsigned long count)
198{
199 WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
200}
201
9dd819a1 202static __always_inline __must_check bool
b0377fed
AV
203check_copy_size(const void *addr, size_t bytes, bool is_source)
204{
205 int sz = __compiletime_object_size(addr);
206 if (unlikely(sz >= 0 && sz < bytes)) {
207 if (!__builtin_constant_p(bytes))
208 copy_overflow(sz, bytes);
209 else if (is_source)
210 __bad_copy_from();
211 else
212 __bad_copy_to();
213 return false;
214 }
6d13de14
KC
215 if (WARN_ON_ONCE(bytes > INT_MAX))
216 return false;
b0377fed
AV
217 check_object_size(addr, bytes, is_source);
218 return true;
219}
220
e9ea1e7f
KH
221#ifndef arch_setup_new_exec
222static inline void arch_setup_new_exec(void) { }
223#endif
224
4e4c22c7 225#endif /* __KERNEL__ */
1da177e4
LT
226
227#endif /* _LINUX_THREAD_INFO_H */