blob: 4fdbf55f95e50b93bd7e8b520c965df6e63d0b72 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _ASM_M68K_THREAD_INFO_H
2#define _ASM_M68K_THREAD_INFO_H
3
4#include <asm/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <asm/page.h>
6
7struct thread_info {
8 struct task_struct *task; /* main task structure */
9 struct exec_domain *exec_domain; /* execution domain */
Jesper Juhldcd497f2005-06-23 00:09:07 -070010 int preempt_count; /* 0 => preemptable, <0 => BUG */
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 __u32 cpu; /* should always be 0 on m68k */
12 struct restart_block restart_block;
13
14 __u8 supervisor_stack[0];
15};
16
17#define PREEMPT_ACTIVE 0x4000000
18
19#define INIT_THREAD_INFO(tsk) \
20{ \
21 .task = &tsk, \
22 .exec_domain = &default_exec_domain, \
23 .restart_block = { \
24 .fn = do_no_restart_syscall, \
25 }, \
26}
27
28/* THREAD_SIZE should be 8k, so handle differently for 4k and 8k machines */
29#if PAGE_SHIFT == 13 /* 8k machines */
30#define alloc_thread_info(tsk) ((struct thread_info *)__get_free_pages(GFP_KERNEL,0))
31#define free_thread_info(ti) free_pages((unsigned long)(ti),0)
32#else /* otherwise assume 4k pages */
33#define alloc_thread_info(tsk) ((struct thread_info *)__get_free_pages(GFP_KERNEL,1))
34#define free_thread_info(ti) free_pages((unsigned long)(ti),1)
35#endif /* PAGE_SHIFT == 13 */
36
Al Viroabd03752005-11-13 16:06:58 -080037#define init_thread_info (init_task.thread.info)
Linus Torvalds1da177e2005-04-16 15:20:36 -070038#define init_stack (init_thread_union.stack)
39
Al Viroabd03752005-11-13 16:06:58 -080040#define task_thread_info(tsk) (&(tsk)->thread.info)
41#define current_thread_info() task_thread_info(current)
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
43#define __HAVE_THREAD_FUNCTIONS
44
Al Viroabd03752005-11-13 16:06:58 -080045#define setup_thread_stack(p, org) ({ \
46 *(struct task_struct **)(p)->thread_info = (p); \
47 task_thread_info(p)->task = (p); \
48})
49
50#define end_of_stack(p) ((unsigned long *)(p)->thread_info + 1)
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
53#define TIF_DELAYED_TRACE 1 /* single step a syscall */
54#define TIF_NOTIFY_RESUME 2 /* resumption notification requested */
55#define TIF_SIGPENDING 3 /* signal pending */
56#define TIF_NEED_RESCHED 4 /* rescheduling necessary */
57#define TIF_MEMDIE 5
58
59extern int thread_flag_fixme(void);
60
61/*
62 * flag set/clear/test wrappers
63 * - pass TIF_xxxx constants to these functions
64 */
65
66#define __set_tsk_thread_flag(tsk, flag, val) ({ \
67 switch (flag) { \
68 case TIF_SIGPENDING: \
69 tsk->thread.work.sigpending = val; \
70 break; \
71 case TIF_NEED_RESCHED: \
72 tsk->thread.work.need_resched = val; \
73 break; \
74 case TIF_SYSCALL_TRACE: \
75 tsk->thread.work.syscall_trace = val; \
76 break; \
77 case TIF_MEMDIE: \
78 tsk->thread.work.memdie = val; \
79 break; \
80 default: \
81 thread_flag_fixme(); \
82 } \
83})
84
85#define __get_tsk_thread_flag(tsk, flag) ({ \
86 int ___res; \
87 switch (flag) { \
88 case TIF_SIGPENDING: \
89 ___res = tsk->thread.work.sigpending; \
90 break; \
91 case TIF_NEED_RESCHED: \
92 ___res = tsk->thread.work.need_resched; \
93 break; \
94 case TIF_SYSCALL_TRACE: \
95 ___res = tsk->thread.work.syscall_trace;\
96 break; \
97 case TIF_MEMDIE: \
98 ___res = tsk->thread.work.memdie;\
99 break; \
100 default: \
101 ___res = thread_flag_fixme(); \
102 } \
103 ___res; \
104})
105
106#define __get_set_tsk_thread_flag(tsk, flag, val) ({ \
107 int __res = __get_tsk_thread_flag(tsk, flag); \
108 __set_tsk_thread_flag(tsk, flag, val); \
109 __res; \
110})
111
112#define set_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, ~0)
113#define clear_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, 0)
114#define test_and_set_tsk_thread_flag(tsk, flag) __get_set_tsk_thread_flag(tsk, flag, ~0)
115#define test_tsk_thread_flag(tsk, flag) __get_tsk_thread_flag(tsk, flag)
116
117#define set_thread_flag(flag) set_tsk_thread_flag(current, flag)
118#define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag)
119#define test_thread_flag(flag) test_tsk_thread_flag(current, flag)
120
121#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
122#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
123
124#endif /* _ASM_M68K_THREAD_INFO_H */