#ifndef __ASM_SH64_THREAD_INFO_H
#define __ASM_SH64_THREAD_INFO_H

/*
 * SuperH 5 version
 * Copyright (C) 2003  Paul Mundt
 */

#ifdef __KERNEL__

#ifndef __ASSEMBLY__
#include <asm/registers.h>

/*
 * low level task data that entry.S needs immediate access to
 * - this struct should fit entirely inside of one cache line
 * - this struct shares the supervisor stack pages
 * - if the contents of this structure are changed, the assembly constants must also be changed
 */
struct thread_info {
	struct task_struct	*task;		/* main task structure */
	struct exec_domain	*exec_domain;	/* execution domain */
	unsigned long		flags;		/* low level flags */
	/* Put the 4 32-bit fields together to make asm offsetting easier. */
	__s32			preempt_count; /* 0 => preemptable, <0 => BUG */
	__u16			cpu;

	mm_segment_t		addr_limit;
	struct restart_block	restart_block;

	__u8			supervisor_stack[0];
};

/*
 * macros/functions for gaining access to the thread information structure
 */
#define INIT_THREAD_INFO(tsk)			\
{						\
	.task		= &tsk,			\
	.exec_domain	= &default_exec_domain,	\
	.flags		= 0,			\
	.cpu		= 0,			\
	.preempt_count	= 1,			\
	.addr_limit     = KERNEL_DS,            \
	.restart_block	= {			\
		.fn = do_no_restart_syscall,	\
	},					\
}

#define init_thread_info	(init_thread_union.thread_info)
#define init_stack		(init_thread_union.stack)

/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
{
	struct thread_info *ti;

	__asm__ __volatile__ ("getcon " __KCR0 ", %0\n\t" : "=r" (ti));

	return ti;
}

/* thread information allocation */
#define alloc_thread_info(ti) ((struct thread_info *) __get_free_pages(GFP_KERNEL,2))
#define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)

#endif /* __ASSEMBLY__ */

#define PREEMPT_ACTIVE		0x4000000

/* thread information flags */
#define TIF_SYSCALL_TRACE	0	/* syscall trace active */
#define TIF_SIGPENDING		2	/* signal pending */
#define TIF_NEED_RESCHED	3	/* rescheduling necessary */

#define THREAD_SIZE	16384

#endif /* __KERNEL__ */

#endif /* __ASM_SH64_THREAD_INFO_H */
