Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
alpha
include
asm
thread_info.h
Go to the documentation of this file.
1
#ifndef _ALPHA_THREAD_INFO_H
2
#define _ALPHA_THREAD_INFO_H
3
4
#ifdef __KERNEL__
5
6
#ifndef __ASSEMBLY__
7
#include <asm/processor.h>
8
#include <asm/types.h>
9
#include <
asm/hwrpb.h
>
10
#include <asm/sysinfo.h>
11
#endif
12
13
#ifndef __ASSEMBLY__
14
struct
thread_info
{
15
struct
pcb_struct
pcb;
/* palcode state */
16
17
struct
task_struct
*
task
;
/* main task structure */
18
unsigned
int
flags
;
/* low level flags */
19
unsigned
int
ieee_state;
/* see fpu.h */
20
21
struct
exec_domain
*
exec_domain
;
/* execution domain */
22
mm_segment_t
addr_limit
;
/* thread address space */
23
unsigned
cpu
;
/* current CPU */
24
int
preempt_count
;
/* 0 => preemptable, <0 => BUG */
25
unsigned
int
status
;
/* thread-synchronous flags */
26
27
int
bpt_nsaved;
28
unsigned
long
bpt_addr[2];
/* breakpoint handling */
29
unsigned
int
bpt_insn[2];
30
31
struct
restart_block
restart_block
;
32
};
33
34
/*
35
* Macros/functions for gaining access to the thread information structure.
36
*/
37
#define INIT_THREAD_INFO(tsk) \
38
{ \
39
.task = &tsk, \
40
.exec_domain = &default_exec_domain, \
41
.addr_limit = KERNEL_DS, \
42
.preempt_count = INIT_PREEMPT_COUNT, \
43
.restart_block = { \
44
.fn = do_no_restart_syscall, \
45
}, \
46
}
47
48
#define init_thread_info (init_thread_union.thread_info)
49
#define init_stack (init_thread_union.stack)
50
51
/* How to get the thread information struct from C. */
52
register
struct
thread_info
*__current_thread_info
__asm__
(
"$8"
);
53
#define current_thread_info() __current_thread_info
54
55
#endif
/* __ASSEMBLY__ */
56
57
/* Thread information allocation. */
58
#define THREAD_SIZE_ORDER 1
59
#define THREAD_SIZE (2*PAGE_SIZE)
60
61
#define PREEMPT_ACTIVE 0x40000000
62
63
/*
64
* Thread information flags:
65
* - these are process state flags and used from assembly
66
* - pending work-to-be-done flags come first and must be assigned to be
67
* within bits 0 to 7 to fit in and immediate operand.
68
*
69
* TIF_SYSCALL_TRACE is known to be 0 via blbs.
70
*/
71
#define TIF_SYSCALL_TRACE 0
/* syscall trace active */
72
#define TIF_NOTIFY_RESUME 1
/* callback before returning to user */
73
#define TIF_SIGPENDING 2
/* signal pending */
74
#define TIF_NEED_RESCHED 3
/* rescheduling necessary */
75
#define TIF_DIE_IF_KERNEL 9
/* dik recursion lock */
76
#define TIF_MEMDIE 13
/* is terminating due to OOM killer */
77
78
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
79
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
80
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
81
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
82
83
/* Work to do on interrupt/exception return. */
84
#define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
85
_TIF_NOTIFY_RESUME)
86
87
/* Work to do on any return to userspace. */
88
#define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \
89
| _TIF_SYSCALL_TRACE)
90
91
#define TS_UAC_NOPRINT 0x0001
/* ! Preserve the following three */
92
#define TS_UAC_NOFIX 0x0002
/* ! flags as they match */
93
#define TS_UAC_SIGBUS 0x0004
/* ! userspace part of 'osf_sysinfo' */
94
#define TS_RESTORE_SIGMASK 0x0008
/* restore signal mask in do_signal() */
95
#define TS_POLLING 0x0010
/* idle task polling need_resched,
96
skip sending interrupt */
97
98
#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
99
100
#ifndef __ASSEMBLY__
101
#define HAVE_SET_RESTORE_SIGMASK 1
102
static
inline
void
set_restore_sigmask(
void
)
103
{
104
struct
thread_info
*ti =
current_thread_info
();
105
ti->
status
|=
TS_RESTORE_SIGMASK
;
106
WARN_ON
(!
test_bit
(
TIF_SIGPENDING
, (
unsigned
long
*)&ti->
flags
));
107
}
108
static
inline
void
clear_restore_sigmask(
void
)
109
{
110
current_thread_info
()->status &= ~
TS_RESTORE_SIGMASK
;
111
}
112
static
inline
bool
test_restore_sigmask(
void
)
113
{
114
return
current_thread_info
()->status &
TS_RESTORE_SIGMASK
;
115
}
116
static
inline
bool
test_and_clear_restore_sigmask(
void
)
117
{
118
struct
thread_info
*ti =
current_thread_info
();
119
if
(!(ti->
status
&
TS_RESTORE_SIGMASK
))
120
return
false
;
121
ti->
status
&= ~
TS_RESTORE_SIGMASK
;
122
return
true
;
123
}
124
#endif
125
126
#define SET_UNALIGN_CTL(task,value) ({ \
127
__u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \
128
if (value & PR_UNALIGN_NOPRINT) \
129
status |= TS_UAC_NOPRINT; \
130
if (value & PR_UNALIGN_SIGBUS) \
131
status |= TS_UAC_SIGBUS; \
132
if (value & 4)
/* alpha-specific */
\
133
status |= TS_UAC_NOFIX; \
134
task_thread_info(task)->status = status; \
135
0; })
136
137
#define GET_UNALIGN_CTL(task,value) ({ \
138
__u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \
139
__u32 res = 0; \
140
if (status & TS_UAC_NOPRINT) \
141
res |= PR_UNALIGN_NOPRINT; \
142
if (status & TS_UAC_SIGBUS) \
143
res |= PR_UNALIGN_SIGBUS; \
144
if (status & TS_UAC_NOFIX) \
145
res |= 4; \
146
put_user(res, (int __user *)(value)); \
147
})
148
149
#endif
/* __KERNEL__ */
150
#endif
/* _ALPHA_THREAD_INFO_H */
Generated on Thu Jan 10 2013 12:50:39 for Linux Kernel by
1.8.2