lin
2025-04-23 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* 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
 
#include <linux/types.h>
#include <linux/bug.h>
#include <linux/restart_block.h>
 
#ifdef CONFIG_THREAD_INFO_IN_TASK
/*
 * For CONFIG_THREAD_INFO_IN_TASK kernels we need <asm/current.h> for the
 * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels,
 * including <asm/current.h> can cause a circular dependency on some platforms.
 */
#include <asm/current.h>
#define current_thread_info() ((struct thread_info *)current)
#endif
 
#include <linux/bitops.h>
#include <asm/thread_info.h>
 
#ifdef __KERNEL__
 
#define THREADINFO_GFP    (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | __GFP_ZERO)
 
/*
 * 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)
{
   set_bit(flag, (unsigned long *)&ti->flags);
}
 
static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
{
   clear_bit(flag, (unsigned long *)&ti->flags);
}
 
static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
{
   return test_and_set_bit(flag, (unsigned long *)&ti->flags);
}
 
static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
{
   return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
}
 
static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
{
   return test_bit(flag, (unsigned long *)&ti->flags);
}
 
#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)
 
#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
 
#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
 
#ifdef CONFIG_HARDENED_USERCOPY
extern void __check_object_size(const void *ptr, unsigned long n,
                   bool to_user);
 
static __always_inline void check_object_size(const void *ptr, unsigned long n,
                         bool to_user)
{
   if (!__builtin_constant_p(n))
       __check_object_size(ptr, n, to_user);
}
#else
static inline void check_object_size(const void *ptr, unsigned long n,
                    bool to_user)
{ }
#endif /* CONFIG_HARDENED_USERCOPY */
 
#endif    /* __KERNEL__ */
 
#endif /* _LINUX_THREAD_INFO_H */