thread_info.h 3.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/* thread_info.h: common low-level thread information accessors
 *
 * Copyright (C) 2002  David Howells (dhowells@redhat.com)
 * - Incorporating suggestions made by Linus Torvalds
 */

#ifndef _LINUX_THREAD_INFO_H
#define _LINUX_THREAD_INFO_H

10
#include <linux/types.h>
11
#include <linux/bug.h>
12

13 14 15
struct timespec;
struct compat_timespec;

L
Linus Torvalds 已提交
16
/*
17
 * System call restart block.
L
Linus Torvalds 已提交
18 19 20
 */
struct restart_block {
	long (*fn)(struct restart_block *);
21
	union {
22
		/* For futex_wait and futex_wait_requeue_pi */
23
		struct {
24
			u32 __user *uaddr;
25 26
			u32 val;
			u32 flags;
27
			u32 bitset;
28
			u64 time;
29
			u32 __user *uaddr2;
30
		} futex;
31 32
		/* For nanosleep */
		struct {
33
			clockid_t clockid;
34 35 36 37 38 39
			struct timespec __user *rmtp;
#ifdef CONFIG_COMPAT
			struct compat_timespec __user *compat_rmtp;
#endif
			u64 expires;
		} nanosleep;
40 41 42 43 44 45 46 47
		/* For poll */
		struct {
			struct pollfd __user *ufds;
			int nfds;
			int has_timeout;
			unsigned long tv_sec;
			unsigned long tv_nsec;
		} poll;
48
	};
L
Linus Torvalds 已提交
49 50 51 52 53 54 55 56 57
};

extern long do_no_restart_syscall(struct restart_block *parm);

#include <linux/bitops.h>
#include <asm/thread_info.h>

#ifdef __KERNEL__

58
#ifdef CONFIG_DEBUG_STACK_USAGE
59 60
# define THREADINFO_GFP		(GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | \
				 __GFP_ZERO)
61
#else
62
# define THREADINFO_GFP		(GFP_KERNEL_ACCOUNT | __GFP_NOTRACK)
63 64
#endif

L
Linus Torvalds 已提交
65 66 67 68 69 70 71
/*
 * flag set/clear/test wrappers
 * - pass TIF_xxxx constants to these functions
 */

static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
{
72
	set_bit(flag, (unsigned long *)&ti->flags);
L
Linus Torvalds 已提交
73 74 75 76
}

static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
{
77
	clear_bit(flag, (unsigned long *)&ti->flags);
L
Linus Torvalds 已提交
78 79 80 81
}

static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
{
82
	return test_and_set_bit(flag, (unsigned long *)&ti->flags);
L
Linus Torvalds 已提交
83 84 85 86
}

static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
{
87
	return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
L
Linus Torvalds 已提交
88 89 90 91
}

static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
{
92
	return test_bit(flag, (unsigned long *)&ti->flags);
L
Linus Torvalds 已提交
93 94
}

95 96 97 98 99 100 101 102 103 104 105
#define set_thread_flag(flag) \
	set_ti_thread_flag(current_thread_info(), flag)
#define clear_thread_flag(flag) \
	clear_ti_thread_flag(current_thread_info(), flag)
#define test_and_set_thread_flag(flag) \
	test_and_set_ti_thread_flag(current_thread_info(), flag)
#define test_and_clear_thread_flag(flag) \
	test_and_clear_ti_thread_flag(current_thread_info(), flag)
#define test_thread_flag(flag) \
	test_ti_thread_flag(current_thread_info(), flag)

106 107
#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)

108 109 110 111 112 113 114 115 116
#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
static inline int arch_within_stack_frames(const void * const stack,
					   const void * const stackend,
					   const void *obj, unsigned long len)
{
	return 0;
}
#endif

K
Kees Cook 已提交
117 118 119 120 121 122 123
#ifdef CONFIG_HARDENED_USERCOPY
extern void __check_object_size(const void *ptr, unsigned long n,
					bool to_user);

static inline void check_object_size(const void *ptr, unsigned long n,
				     bool to_user)
{
124 125
	if (!__builtin_constant_p(n))
		__check_object_size(ptr, n, to_user);
K
Kees Cook 已提交
126 127 128 129 130 131 132
}
#else
static inline void check_object_size(const void *ptr, unsigned long n,
				     bool to_user)
{ }
#endif /* CONFIG_HARDENED_USERCOPY */

133
#endif	/* __KERNEL__ */
L
Linus Torvalds 已提交
134 135

#endif /* _LINUX_THREAD_INFO_H */