blob: e6cede37bcd6d64f0dd66b29d1ad0aad9fe481e3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* 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
Steven Rostedtce6bd422007-12-05 15:46:09 +010010#include <linux/types.h>
Al Viroedd63a22012-04-27 13:42:45 -040011#include <linux/bug.h>
Mark Rutland7d1ab812016-10-19 19:28:12 +010012#include <linux/restart_block.h>
Oleg Nesterov376a76a2021-02-01 18:46:41 +010013#include <linux/errno.h>
Steven Rostedtce6bd422007-12-05 15:46:09 +010014
Thomas Gleixnera332d862008-02-10 09:04:12 +010015struct timespec;
16struct compat_timespec;
17
Andy Lutomirskic65eacb2016-09-13 14:29:24 -070018#ifdef CONFIG_THREAD_INFO_IN_TASK
Mark Rutlandbe8c7b62016-10-19 19:28:13 +010019/*
20 * For CONFIG_THREAD_INFO_IN_TASK kernels we need <asm/current.h> for the
21 * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels,
22 * including <asm/current.h> can cause a circular dependency on some platforms.
23 */
24#include <asm/current.h>
Andy Lutomirskic65eacb2016-09-13 14:29:24 -070025#define current_thread_info() ((struct thread_info *)current)
26#endif
27
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/bitops.h>
29#include <asm/thread_info.h>
30
31#ifdef __KERNEL__
32
Oleg Nesterov376a76a2021-02-01 18:46:41 +010033#ifndef arch_set_restart_data
34#define arch_set_restart_data(restart) do { } while (0)
35#endif
36
37static inline long set_restart_fn(struct restart_block *restart,
38 long (*fn)(struct restart_block *))
39{
40 restart->fn = fn;
41 arch_set_restart_data(restart);
42 return -ERESTART_RESTARTBLOCK;
43}
44
Kees Cook6a19e262018-04-20 14:55:31 -070045#define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | __GFP_ZERO)
Thomas Gleixner2889f602012-05-05 15:05:41 +000046
Linus Torvalds1da177e2005-04-16 15:20:36 -070047/*
48 * flag set/clear/test wrappers
49 * - pass TIF_xxxx constants to these functions
50 */
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
53{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010054 set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055}
56
57static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
58{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010059 clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070060}
61
62static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
63{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010064 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070065}
66
67static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
68{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010069 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070070}
71
72static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
73{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010074 return test_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075}
76
Roman Zippel3b66a1e2005-11-13 16:06:59 -080077#define set_thread_flag(flag) \
78 set_ti_thread_flag(current_thread_info(), flag)
79#define clear_thread_flag(flag) \
80 clear_ti_thread_flag(current_thread_info(), flag)
81#define test_and_set_thread_flag(flag) \
82 test_and_set_ti_thread_flag(current_thread_info(), flag)
83#define test_and_clear_thread_flag(flag) \
84 test_and_clear_ti_thread_flag(current_thread_info(), flag)
85#define test_thread_flag(flag) \
86 test_ti_thread_flag(current_thread_info(), flag)
Linus Torvalds1da177e2005-04-16 15:20:36 -070087
Peter Zijlstraea811742013-09-11 12:43:13 +020088#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
89
Kees Cook0f60a8e2016-07-12 16:19:48 -070090#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
91static inline int arch_within_stack_frames(const void * const stack,
92 const void * const stackend,
93 const void *obj, unsigned long len)
94{
95 return 0;
96}
97#endif
98
Kees Cookf5509cc2016-06-07 11:05:33 -070099#ifdef CONFIG_HARDENED_USERCOPY
100extern void __check_object_size(const void *ptr, unsigned long n,
101 bool to_user);
102
Kees Cooka85d6b82016-09-07 09:39:32 -0700103static __always_inline void check_object_size(const void *ptr, unsigned long n,
104 bool to_user)
Kees Cookf5509cc2016-06-07 11:05:33 -0700105{
Kees Cook81409e92016-08-31 16:04:21 -0700106 if (!__builtin_constant_p(n))
107 __check_object_size(ptr, n, to_user);
Kees Cookf5509cc2016-06-07 11:05:33 -0700108}
109#else
110static inline void check_object_size(const void *ptr, unsigned long n,
111 bool to_user)
112{ }
113#endif /* CONFIG_HARDENED_USERCOPY */
114
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700115#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
117#endif /* _LINUX_THREAD_INFO_H */