1 /* thread_info.h: common low-level thread information accessors 2 * 3 * Copyright (C) 2002 David Howells ([email protected]) 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 12 struct timespec; 13 struct compat_timespec; 14 15 /* 16 * System call restart block. 17 */ 18 struct restart_block { 19 long (*fn)(struct restart_block *); 20 union { 21 struct { 22 unsigned long arg0, arg1, arg2, arg3; 23 }; 24 /* For futex_wait */ 25 struct { 26 u32 *uaddr; 27 u32 val; 28 u32 flags; 29 u32 bitset; 30 u64 time; 31 } futex; 32 /* For nanosleep */ 33 struct { 34 clockid_t index; 35 struct timespec __user *rmtp; 36 #ifdef CONFIG_COMPAT 37 struct compat_timespec __user *compat_rmtp; 38 #endif 39 u64 expires; 40 } nanosleep; 41 }; 42 }; 43 44 extern long do_no_restart_syscall(struct restart_block *parm); 45 46 #include <linux/bitops.h> 47 #include <asm/thread_info.h> 48 49 #ifdef __KERNEL__ 50 51 /* 52 * flag set/clear/test wrappers 53 * - pass TIF_xxxx constants to these functions 54 */ 55 56 static inline void set_ti_thread_flag(struct thread_info *ti, int flag) 57 { 58 set_bit(flag, (unsigned long *)&ti->flags); 59 } 60 61 static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) 62 { 63 clear_bit(flag, (unsigned long *)&ti->flags); 64 } 65 66 static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) 67 { 68 return test_and_set_bit(flag, (unsigned long *)&ti->flags); 69 } 70 71 static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) 72 { 73 return test_and_clear_bit(flag, (unsigned long *)&ti->flags); 74 } 75 76 static inline int test_ti_thread_flag(struct thread_info *ti, int flag) 77 { 78 return test_bit(flag, (unsigned long *)&ti->flags); 79 } 80 81 #define set_thread_flag(flag) \ 82 set_ti_thread_flag(current_thread_info(), flag) 83 #define clear_thread_flag(flag) \ 84 clear_ti_thread_flag(current_thread_info(), flag) 85 #define test_and_set_thread_flag(flag) \ 86 test_and_set_ti_thread_flag(current_thread_info(), flag) 87 #define test_and_clear_thread_flag(flag) \ 88 test_and_clear_ti_thread_flag(current_thread_info(), flag) 89 #define test_thread_flag(flag) \ 90 test_ti_thread_flag(current_thread_info(), flag) 91 92 #define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) 93 #define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) 94 95 #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK 96 /* 97 * An arch can define its own version of set_restore_sigmask() to get the 98 * job done however works, with or without TIF_RESTORE_SIGMASK. 99 */ 100 #define HAVE_SET_RESTORE_SIGMASK 1 101 102 /** 103 * set_restore_sigmask() - make sure saved_sigmask processing gets done 104 * 105 * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code 106 * will run before returning to user mode, to process the flag. For 107 * all callers, TIF_SIGPENDING is already set or it's no harm to set 108 * it. TIF_RESTORE_SIGMASK need not be in the set of bits that the 109 * arch code will notice on return to user mode, in case those bits 110 * are scarce. We set TIF_SIGPENDING here to ensure that the arch 111 * signal code always gets run when TIF_RESTORE_SIGMASK is set. 112 */ 113 static inline void set_restore_sigmask(void) 114 { 115 set_thread_flag(TIF_RESTORE_SIGMASK); 116 set_thread_flag(TIF_SIGPENDING); 117 } 118 #endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */ 119 120 #endif /* __KERNEL__ */ 121 122 #endif /* _LINUX_THREAD_INFO_H */ 123