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