1cddafa35SGreg Ungerer #ifndef _ASM_M68K_THREAD_INFO_H
2cddafa35SGreg Ungerer #define _ASM_M68K_THREAD_INFO_H
3cddafa35SGreg Ungerer 
4cddafa35SGreg Ungerer #include <asm/types.h>
5cddafa35SGreg Ungerer #include <asm/page.h>
6cddafa35SGreg Ungerer 
7cddafa35SGreg Ungerer /*
8cddafa35SGreg Ungerer  * On machines with 4k pages we default to an 8k thread size, though we
9cddafa35SGreg Ungerer  * allow a 4k with config option. Any other machine page size then
10cddafa35SGreg Ungerer  * the thread size must match the page size (which is 8k and larger here).
11cddafa35SGreg Ungerer  */
12cddafa35SGreg Ungerer #if PAGE_SHIFT < 13
13cddafa35SGreg Ungerer #ifdef CONFIG_4KSTACKS
14cddafa35SGreg Ungerer #define THREAD_SIZE	4096
1549148020SSam Ravnborg #else
16cddafa35SGreg Ungerer #define THREAD_SIZE	8192
1749148020SSam Ravnborg #endif
18cddafa35SGreg Ungerer #else
19cddafa35SGreg Ungerer #define THREAD_SIZE	PAGE_SIZE
20cddafa35SGreg Ungerer #endif
21cddafa35SGreg Ungerer #define THREAD_SIZE_ORDER	((THREAD_SIZE / PAGE_SIZE) - 1)
22cddafa35SGreg Ungerer 
23cddafa35SGreg Ungerer #ifndef __ASSEMBLY__
24cddafa35SGreg Ungerer 
25cddafa35SGreg Ungerer struct thread_info {
26cddafa35SGreg Ungerer 	struct task_struct	*task;		/* main task structure */
27cddafa35SGreg Ungerer 	unsigned long		flags;
28cddafa35SGreg Ungerer 	struct exec_domain	*exec_domain;	/* execution domain */
29cddafa35SGreg Ungerer 	int			preempt_count;	/* 0 => preemptable, <0 => BUG */
30cddafa35SGreg Ungerer 	__u32			cpu;		/* should always be 0 on m68k */
31cddafa35SGreg Ungerer 	unsigned long		tp_value;	/* thread pointer */
32cddafa35SGreg Ungerer 	struct restart_block    restart_block;
33cddafa35SGreg Ungerer };
34cddafa35SGreg Ungerer #endif /* __ASSEMBLY__ */
35cddafa35SGreg Ungerer 
36cddafa35SGreg Ungerer #define PREEMPT_ACTIVE		0x4000000
37cddafa35SGreg Ungerer 
38cddafa35SGreg Ungerer #define INIT_THREAD_INFO(tsk)			\
39cddafa35SGreg Ungerer {						\
40cddafa35SGreg Ungerer 	.task		= &tsk,			\
41cddafa35SGreg Ungerer 	.exec_domain	= &default_exec_domain,	\
42cddafa35SGreg Ungerer 	.preempt_count	= INIT_PREEMPT_COUNT,	\
43cddafa35SGreg Ungerer 	.restart_block = {			\
44cddafa35SGreg Ungerer 		.fn = do_no_restart_syscall,	\
45cddafa35SGreg Ungerer 	},					\
46cddafa35SGreg Ungerer }
47cddafa35SGreg Ungerer 
48cddafa35SGreg Ungerer #define init_stack		(init_thread_union.stack)
49cddafa35SGreg Ungerer 
50cddafa35SGreg Ungerer #ifdef CONFIG_MMU
51cddafa35SGreg Ungerer 
52cddafa35SGreg Ungerer #ifndef __ASSEMBLY__
53cddafa35SGreg Ungerer #include <asm/current.h>
54cddafa35SGreg Ungerer #endif
55cddafa35SGreg Ungerer 
56cddafa35SGreg Ungerer #ifdef ASM_OFFSETS_C
57cddafa35SGreg Ungerer #define task_thread_info(tsk)	((struct thread_info *) NULL)
58cddafa35SGreg Ungerer #else
59cddafa35SGreg Ungerer #include <asm/asm-offsets.h>
60cddafa35SGreg Ungerer #define task_thread_info(tsk)	((struct thread_info *)((char *)tsk+TASK_TINFO))
61cddafa35SGreg Ungerer #endif
62cddafa35SGreg Ungerer 
63cddafa35SGreg Ungerer #define init_thread_info	(init_task.thread.info)
64cddafa35SGreg Ungerer #define task_stack_page(tsk)	((tsk)->stack)
65cddafa35SGreg Ungerer #define current_thread_info()	task_thread_info(current)
66cddafa35SGreg Ungerer 
67cddafa35SGreg Ungerer #define __HAVE_THREAD_FUNCTIONS
68cddafa35SGreg Ungerer 
69cddafa35SGreg Ungerer #define setup_thread_stack(p, org) ({			\
70cddafa35SGreg Ungerer 	*(struct task_struct **)(p)->stack = (p);	\
71cddafa35SGreg Ungerer 	task_thread_info(p)->task = (p);		\
72cddafa35SGreg Ungerer })
73cddafa35SGreg Ungerer 
74cddafa35SGreg Ungerer #define end_of_stack(p)		((unsigned long *)(p)->stack + 1)
75cddafa35SGreg Ungerer 
76cddafa35SGreg Ungerer #else /* !CONFIG_MMU */
77cddafa35SGreg Ungerer 
78cddafa35SGreg Ungerer #ifndef __ASSEMBLY__
79cddafa35SGreg Ungerer /* how to get the thread information struct from C */
80cddafa35SGreg Ungerer static inline struct thread_info *current_thread_info(void)
81cddafa35SGreg Ungerer {
82cddafa35SGreg Ungerer 	struct thread_info *ti;
83cddafa35SGreg Ungerer 	__asm__(
84cddafa35SGreg Ungerer 		"move.l %%sp, %0 \n\t"
85cddafa35SGreg Ungerer 		"and.l  %1, %0"
86cddafa35SGreg Ungerer 		: "=&d"(ti)
87cddafa35SGreg Ungerer 		: "di" (~(THREAD_SIZE-1))
88cddafa35SGreg Ungerer 		);
89cddafa35SGreg Ungerer 	return ti;
90cddafa35SGreg Ungerer }
91cddafa35SGreg Ungerer #endif
92cddafa35SGreg Ungerer 
93cddafa35SGreg Ungerer #define init_thread_info	(init_thread_union.thread_info)
94cddafa35SGreg Ungerer 
95cddafa35SGreg Ungerer #endif /* CONFIG_MMU */
96cddafa35SGreg Ungerer 
97cddafa35SGreg Ungerer /* entry.S relies on these definitions!
98cddafa35SGreg Ungerer  * bits 0-7 are tested at every exception exit
99cddafa35SGreg Ungerer  * bits 8-15 are also tested at syscall exit
100cddafa35SGreg Ungerer  */
101cddafa35SGreg Ungerer #define TIF_SIGPENDING		6	/* signal pending */
102cddafa35SGreg Ungerer #define TIF_NEED_RESCHED	7	/* rescheduling necessary */
103cddafa35SGreg Ungerer #define TIF_DELAYED_TRACE	14	/* single step a syscall */
104cddafa35SGreg Ungerer #define TIF_SYSCALL_TRACE	15	/* syscall trace active */
105cddafa35SGreg Ungerer #define TIF_MEMDIE		16	/* is terminating due to OOM killer */
106cddafa35SGreg Ungerer #define TIF_FREEZE		17	/* thread is freezing for suspend */
107cddafa35SGreg Ungerer 
108cddafa35SGreg Ungerer #endif	/* _ASM_M68K_THREAD_INFO_H */
109