]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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> | |
3185bd26 | 10 | #include <asm/sysinfo.h> |
1da177e4 LT |
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 | ||
1da177e4 LT |
21 | mm_segment_t addr_limit; /* thread address space */ |
22 | unsigned cpu; /* current CPU */ | |
23 | int preempt_count; /* 0 => preemptable, <0 => BUG */ | |
3185bd26 | 24 | unsigned int status; /* thread-synchronous flags */ |
1da177e4 LT |
25 | |
26 | int bpt_nsaved; | |
27 | unsigned long bpt_addr[2]; /* breakpoint handling */ | |
28 | unsigned int bpt_insn[2]; | |
1da177e4 LT |
29 | }; |
30 | ||
31 | /* | |
32 | * Macros/functions for gaining access to the thread information structure. | |
33 | */ | |
34 | #define INIT_THREAD_INFO(tsk) \ | |
35 | { \ | |
36 | .task = &tsk, \ | |
1da177e4 | 37 | .addr_limit = KERNEL_DS, \ |
c99e6efe | 38 | .preempt_count = INIT_PREEMPT_COUNT, \ |
1da177e4 LT |
39 | } |
40 | ||
41 | #define init_thread_info (init_thread_union.thread_info) | |
42 | #define init_stack (init_thread_union.stack) | |
43 | ||
44 | /* How to get the thread information struct from C. */ | |
45 | register struct thread_info *__current_thread_info __asm__("$8"); | |
46 | #define current_thread_info() __current_thread_info | |
47 | ||
15f3c476 AM |
48 | #endif /* __ASSEMBLY__ */ |
49 | ||
1da177e4 | 50 | /* Thread information allocation. */ |
b69c49b7 | 51 | #define THREAD_SIZE_ORDER 1 |
1da177e4 | 52 | #define THREAD_SIZE (2*PAGE_SIZE) |
1da177e4 | 53 | |
1da177e4 LT |
54 | /* |
55 | * Thread information flags: | |
56 | * - these are process state flags and used from assembly | |
745dd240 MC |
57 | * - pending work-to-be-done flags come first and must be assigned to be |
58 | * within bits 0 to 7 to fit in and immediate operand. | |
1da177e4 LT |
59 | * |
60 | * TIF_SYSCALL_TRACE is known to be 0 via blbs. | |
61 | */ | |
62 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | |
745dd240 MC |
63 | #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ |
64 | #define TIF_SIGPENDING 2 /* signal pending */ | |
65 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | |
a9302e84 | 66 | #define TIF_SYSCALL_AUDIT 4 /* syscall audit active */ |
745dd240 | 67 | #define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */ |
0ddc9324 | 68 | #define TIF_MEMDIE 13 /* is terminating due to OOM killer */ |
2a705ad6 | 69 | #define TIF_POLLING_NRFLAG 14 /* idle is polling for TIF_NEED_RESCHED */ |
1da177e4 LT |
70 | |
71 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | |
1da177e4 LT |
72 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
73 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | |
d0420c83 | 74 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) |
a9302e84 | 75 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
2a705ad6 | 76 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
1da177e4 LT |
77 | |
78 | /* Work to do on interrupt/exception return. */ | |
d0420c83 DH |
79 | #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ |
80 | _TIF_NOTIFY_RESUME) | |
1da177e4 LT |
81 | |
82 | /* Work to do on any return to userspace. */ | |
83 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ | |
84 | | _TIF_SYSCALL_TRACE) | |
85 | ||
3185bd26 AV |
86 | #define TS_UAC_NOPRINT 0x0001 /* ! Preserve the following three */ |
87 | #define TS_UAC_NOFIX 0x0002 /* ! flags as they match */ | |
88 | #define TS_UAC_SIGBUS 0x0004 /* ! userspace part of 'osf_sysinfo' */ | |
89 | #define TS_RESTORE_SIGMASK 0x0008 /* restore signal mask in do_signal() */ | |
ed58a593 | 90 | |
3185bd26 AV |
91 | #ifndef __ASSEMBLY__ |
92 | #define HAVE_SET_RESTORE_SIGMASK 1 | |
93 | static inline void set_restore_sigmask(void) | |
94 | { | |
95 | struct thread_info *ti = current_thread_info(); | |
96 | ti->status |= TS_RESTORE_SIGMASK; | |
97 | WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags)); | |
98 | } | |
99 | static inline void clear_restore_sigmask(void) | |
100 | { | |
101 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | |
102 | } | |
103 | static inline bool test_restore_sigmask(void) | |
104 | { | |
105 | return current_thread_info()->status & TS_RESTORE_SIGMASK; | |
106 | } | |
107 | static inline bool test_and_clear_restore_sigmask(void) | |
108 | { | |
109 | struct thread_info *ti = current_thread_info(); | |
110 | if (!(ti->status & TS_RESTORE_SIGMASK)) | |
111 | return false; | |
112 | ti->status &= ~TS_RESTORE_SIGMASK; | |
113 | return true; | |
114 | } | |
115 | #endif | |
116 | ||
117 | #define SET_UNALIGN_CTL(task,value) ({ \ | |
118 | __u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \ | |
119 | if (value & PR_UNALIGN_NOPRINT) \ | |
120 | status |= TS_UAC_NOPRINT; \ | |
121 | if (value & PR_UNALIGN_SIGBUS) \ | |
122 | status |= TS_UAC_SIGBUS; \ | |
123 | if (value & 4) /* alpha-specific */ \ | |
124 | status |= TS_UAC_NOFIX; \ | |
125 | task_thread_info(task)->status = status; \ | |
ed58a593 IK |
126 | 0; }) |
127 | ||
128 | #define GET_UNALIGN_CTL(task,value) ({ \ | |
3185bd26 AV |
129 | __u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \ |
130 | __u32 res = 0; \ | |
131 | if (status & TS_UAC_NOPRINT) \ | |
132 | res |= PR_UNALIGN_NOPRINT; \ | |
133 | if (status & TS_UAC_SIGBUS) \ | |
134 | res |= PR_UNALIGN_SIGBUS; \ | |
135 | if (status & TS_UAC_NOFIX) \ | |
136 | res |= 4; \ | |
137 | put_user(res, (int __user *)(value)); \ | |
ed58a593 IK |
138 | }) |
139 | ||
1da177e4 LT |
140 | #endif /* __KERNEL__ */ |
141 | #endif /* _ALPHA_THREAD_INFO_H */ |