[PATCH] m68k: m68k-specific thread_info changes
[pandora-kernel.git] / include / asm-m68k / thread_info.h
1 #ifndef _ASM_M68K_THREAD_INFO_H
2 #define _ASM_M68K_THREAD_INFO_H
3
4 #include <asm/types.h>
5 #include <asm/page.h>
6
7 struct thread_info {
8         struct task_struct      *task;          /* main task structure */
9         struct exec_domain      *exec_domain;   /* execution domain */
10         int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
11         __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
37 #define init_thread_info        (init_task.thread.info)
38 #define init_stack              (init_thread_union.stack)
39
40 #define task_thread_info(tsk)   (&(tsk)->thread.info)
41 #define current_thread_info()   task_thread_info(current)
42
43 #define __HAVE_THREAD_FUNCTIONS
44
45 #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
52 #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
59 extern 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 */