hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *  arch/arm/include/asm/thread_info.h
 *
 *  Copyright (C) 2002 Russell King.
 */
#ifndef __ASM_ARM_THREAD_INFO_H
#define __ASM_ARM_THREAD_INFO_H
 
#ifdef __KERNEL__
 
#include <linux/compiler.h>
#include <asm/fpstate.h>
#include <asm/page.h>
 
#define THREAD_SIZE_ORDER    1
#define THREAD_SIZE        (PAGE_SIZE << THREAD_SIZE_ORDER)
#define THREAD_START_SP        (THREAD_SIZE - 8)
 
#ifndef __ASSEMBLY__
 
struct task_struct;
 
#include <dovetail/thread_info.h>
#include <asm/types.h>
 
typedef unsigned long mm_segment_t;
 
struct cpu_context_save {
   __u32    r4;
   __u32    r5;
   __u32    r6;
   __u32    r7;
   __u32    r8;
   __u32    r9;
   __u32    sl;
   __u32    fp;
   __u32    sp;
   __u32    pc;
   __u32    extra[2];        /* Xscale 'acc' register, etc */
};
 
/*
 * low level task data that entry.S needs immediate access to.
 * __switch_to() assumes cpu_context follows immediately after cpu_domain.
 */
struct thread_info {
   unsigned long        flags;        /* low level flags */
   __u32            local_flags;    /* local (synchronous) flags */
   int            preempt_count;    /* 0 => preemptable, <0 => bug */
   mm_segment_t        addr_limit;    /* address limit */
   struct task_struct    *task;        /* main task structure */
   __u32            cpu;        /* cpu */
   __u32            cpu_domain;    /* cpu domain */
#ifdef CONFIG_STACKPROTECTOR_PER_TASK
   unsigned long        stack_canary;
#endif
   struct cpu_context_save    cpu_context;    /* cpu context */
   __u32            syscall;    /* syscall number */
   __u8            used_cp[16];    /* thread used copro */
   unsigned long        tp_value[2];    /* TLS registers */
#ifdef CONFIG_CRUNCH
   struct crunch_state    crunchstate;
#endif
   union fp_state        fpstate __attribute__((aligned(8)));
   union vfp_state        vfpstate;
#ifdef CONFIG_ARM_THUMBEE
   unsigned long        thumbee_state;    /* ThumbEE Handler Base register */
#endif
   struct oob_thread_state    oob_state; /* co-kernel thread state */
};
 
#define INIT_THREAD_INFO(tsk)                        \
{                                    \
   .task        = &tsk,                        \
   .flags        = 0,                        \
   .local_flags    = 0,                        \
   .preempt_count    = INIT_PREEMPT_COUNT,                \
   .addr_limit    = KERNEL_DS,                    \
}
 
#define ti_local_flags(__ti)    ((__ti)->local_flags)
 
/*
 * how to get the thread information struct from C
 */
static inline struct thread_info *current_thread_info(void) __attribute_const__;
 
static inline struct thread_info *current_thread_info(void)
{
   return (struct thread_info *)
       (current_stack_pointer & ~(THREAD_SIZE - 1));
}
 
#define thread_saved_pc(tsk)    \
   ((unsigned long)(task_thread_info(tsk)->cpu_context.pc))
#define thread_saved_sp(tsk)    \
   ((unsigned long)(task_thread_info(tsk)->cpu_context.sp))
 
#ifndef CONFIG_THUMB2_KERNEL
#define thread_saved_fp(tsk)    \
   ((unsigned long)(task_thread_info(tsk)->cpu_context.fp))
#else
#define thread_saved_fp(tsk)    \
   ((unsigned long)(task_thread_info(tsk)->cpu_context.r7))
#endif
 
extern void crunch_task_disable(struct thread_info *);
extern void crunch_task_copy(struct thread_info *, void *);
extern void crunch_task_restore(struct thread_info *, void *);
extern void crunch_task_release(struct thread_info *);
 
extern void iwmmxt_task_disable(struct thread_info *);
extern void iwmmxt_task_copy(struct thread_info *, void *);
extern void iwmmxt_task_restore(struct thread_info *, void *);
extern void iwmmxt_task_release(struct thread_info *);
extern void iwmmxt_task_switch(struct thread_info *);
 
extern void vfp_sync_hwstate(struct thread_info *);
extern void vfp_flush_hwstate(struct thread_info *);
 
struct user_vfp;
struct user_vfp_exc;
 
extern int vfp_preserve_user_clear_hwstate(struct user_vfp *,
                      struct user_vfp_exc *);
extern int vfp_restore_user_hwstate(struct user_vfp *,
                   struct user_vfp_exc *);
#endif
 
/*
 * thread information flags:
 *  TIF_USEDFPU        - FPU was used by this task this quantum (SMP)
 *  TIF_POLLING_NRFLAG    - true if poll_idle() is polling TIF_NEED_RESCHED
 *
 * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
 */
#define TIF_SIGPENDING        0    /* signal pending */
#define TIF_NEED_RESCHED    1    /* rescheduling necessary */
#define TIF_NOTIFY_RESUME    2    /* callback before returning to user */
#define TIF_UPROBE        3    /* breakpointed or singlestepping */
#define TIF_SYSCALL_TRACE    4    /* syscall trace active */
#define TIF_SYSCALL_AUDIT    5    /* syscall auditing active */
#define TIF_SYSCALL_TRACEPOINT    6    /* syscall tracepoint instrumentation */
#define TIF_SECCOMP        7    /* seccomp syscall filtering active */
#define TIF_NOTIFY_SIGNAL    8    /* signal notifications exist */
 
#define TIF_USING_IWMMXT    17
#define TIF_MEMDIE        18    /* is terminating due to OOM killer */
#define TIF_RESTORE_SIGMASK    20
#define TIF_MAYDAY        21    /* emergency trap pending */
#define TIF_RETUSER        22    /* INBAND_TASK_RETUSER is pending */
 
#define _TIF_SIGPENDING        (1 << TIF_SIGPENDING)
#define _TIF_NEED_RESCHED    (1 << TIF_NEED_RESCHED)
#define _TIF_NOTIFY_RESUME    (1 << TIF_NOTIFY_RESUME)
#define _TIF_UPROBE        (1 << TIF_UPROBE)
#define _TIF_SYSCALL_TRACE    (1 << TIF_SYSCALL_TRACE)
#define _TIF_SYSCALL_AUDIT    (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_TRACEPOINT    (1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_SECCOMP        (1 << TIF_SECCOMP)
#define _TIF_NOTIFY_SIGNAL    (1 << TIF_NOTIFY_SIGNAL)
#define _TIF_USING_IWMMXT    (1 << TIF_USING_IWMMXT)
#define _TIF_MAYDAY        (1 << TIF_MAYDAY)
#define _TIF_RETUSER        (1 << TIF_RETUSER)
 
/* Checks for any syscall work in entry-common.S */
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
              _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)
 
/*
 * Change these and you break ASM code in entry-common.S
 */
#define _TIF_WORK_MASK        (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
                _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
                _TIF_NOTIFY_SIGNAL | _TIF_RETUSER)
 
/*
 * Local (synchronous) thread flags.
 */
#define _TLF_OOB        0x0001
#define _TLF_DOVETAIL        0x0002
#define _TLF_OFFSTAGE        0x0004
#define _TLF_OOBTRAP        0x0008
 
#endif /* __KERNEL__ */
#endif /* __ASM_ARM_THREAD_INFO_H */