blob: 2b5b10eed74ff52fc5b11fe911be7d84b08eda77 [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>
Steven Rostedtce6bd422007-12-05 15:46:09 +010012
Thomas Gleixnera332d862008-02-10 09:04:12 +010013struct timespec;
14struct compat_timespec;
15
Linus Torvalds1da177e2005-04-16 15:20:36 -070016/*
Steven Rostedtce6bd422007-12-05 15:46:09 +010017 * System call restart block.
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 */
19struct restart_block {
20 long (*fn)(struct restart_block *);
Steven Rostedtce6bd422007-12-05 15:46:09 +010021 union {
Darren Hart52400ba2009-04-03 13:40:49 -070022 /* For futex_wait and futex_wait_requeue_pi */
Steven Rostedtce6bd422007-12-05 15:46:09 +010023 struct {
Namhyung Kima3c74c52010-09-14 21:43:47 +090024 u32 __user *uaddr;
Steven Rostedtce6bd422007-12-05 15:46:09 +010025 u32 val;
26 u32 flags;
Thomas Gleixnercd689982008-02-01 17:45:14 +010027 u32 bitset;
Steven Rostedtce6bd422007-12-05 15:46:09 +010028 u64 time;
Namhyung Kima3c74c52010-09-14 21:43:47 +090029 u32 __user *uaddr2;
Steven Rostedtce6bd422007-12-05 15:46:09 +010030 } futex;
Thomas Gleixnera332d862008-02-10 09:04:12 +010031 /* For nanosleep */
32 struct {
Thomas Gleixnerab8177b2011-05-20 13:05:15 +020033 clockid_t clockid;
Thomas Gleixnera332d862008-02-10 09:04:12 +010034 struct timespec __user *rmtp;
35#ifdef CONFIG_COMPAT
36 struct compat_timespec __user *compat_rmtp;
37#endif
38 u64 expires;
39 } nanosleep;
Thomas Gleixnerbe5dad22008-08-31 08:19:15 -070040 /* 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;
Steven Rostedtce6bd422007-12-05 15:46:09 +010048 };
Linus Torvalds1da177e2005-04-16 15:20:36 -070049};
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
Thomas Gleixner2889f602012-05-05 15:05:41 +000058#ifdef CONFIG_DEBUG_STACK_USAGE
Vladimir Davydov5d097052016-01-14 15:18:21 -080059# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
60 __GFP_ZERO)
Thomas Gleixner2889f602012-05-05 15:05:41 +000061#else
Vladimir Davydov5d097052016-01-14 15:18:21 -080062# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
Thomas Gleixner2889f602012-05-05 15:05:41 +000063#endif
64
Linus Torvalds1da177e2005-04-16 15:20:36 -070065/*
66 * flag set/clear/test wrappers
67 * - pass TIF_xxxx constants to these functions
68 */
69
Linus Torvalds1da177e2005-04-16 15:20:36 -070070static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
71{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010072 set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070073}
74
75static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
76{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010077 clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070078}
79
80static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
81{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010082 return test_and_set_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083}
84
85static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
86{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010087 return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088}
89
90static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
91{
Jeremy Fitzhardinge5548fec2008-01-30 13:30:55 +010092 return test_bit(flag, (unsigned long *)&ti->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093}
94
Roman Zippel3b66a1e2005-11-13 16:06:59 -080095#define set_thread_flag(flag) \
96 set_ti_thread_flag(current_thread_info(), flag)
97#define clear_thread_flag(flag) \
98 clear_ti_thread_flag(current_thread_info(), flag)
99#define test_and_set_thread_flag(flag) \
100 test_and_set_ti_thread_flag(current_thread_info(), flag)
101#define test_and_clear_thread_flag(flag) \
102 test_and_clear_ti_thread_flag(current_thread_info(), flag)
103#define test_thread_flag(flag) \
104 test_ti_thread_flag(current_thread_info(), flag)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Peter Zijlstraea811742013-09-11 12:43:13 +0200106#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
107
Kees Cook0f60a8e2016-07-12 16:19:48 -0700108#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
109static inline int arch_within_stack_frames(const void * const stack,
110 const void * const stackend,
111 const void *obj, unsigned long len)
112{
113 return 0;
114}
115#endif
116
Kees Cookf5509cc2016-06-07 11:05:33 -0700117#ifdef CONFIG_HARDENED_USERCOPY
118extern void __check_object_size(const void *ptr, unsigned long n,
119 bool to_user);
120
Kees Cooka85d6b82016-09-07 09:39:32 -0700121static __always_inline void check_object_size(const void *ptr, unsigned long n,
122 bool to_user)
Kees Cookf5509cc2016-06-07 11:05:33 -0700123{
Kees Cook81409e92016-08-31 16:04:21 -0700124 if (!__builtin_constant_p(n))
125 __check_object_size(ptr, n, to_user);
Kees Cookf5509cc2016-06-07 11:05:33 -0700126}
127#else
128static inline void check_object_size(const void *ptr, unsigned long n,
129 bool to_user)
130{ }
131#endif /* CONFIG_HARDENED_USERCOPY */
132
Roland McGrath4e4c22c2008-04-30 00:53:06 -0700133#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
135#endif /* _LINUX_THREAD_INFO_H */