1/*
2 * linux/arch/unicore32/include/asm/thread_info.h
3 *
4 * Code specific to PKUnity SoC and UniCore ISA
5 *
6 * Copyright (C) 2001-2010 GUAN Xue-tao
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12#ifndef __UNICORE_THREAD_INFO_H__
13#define __UNICORE_THREAD_INFO_H__
14
15#ifdef __KERNEL__
16
17#include <linux/compiler.h>
18#include <asm/fpstate.h>
19
20#define THREAD_SIZE_ORDER	1
21#define THREAD_SIZE		8192
22#define THREAD_START_SP		(THREAD_SIZE - 8)
23
24#ifndef __ASSEMBLY__
25
26struct task_struct;
27
28#include <asm/types.h>
29
30typedef struct {
31	unsigned long seg;
32} mm_segment_t;
33
34struct cpu_context_save {
35	__u32	r4;
36	__u32	r5;
37	__u32	r6;
38	__u32	r7;
39	__u32	r8;
40	__u32	r9;
41	__u32	r10;
42	__u32	r11;
43	__u32	r12;
44	__u32	r13;
45	__u32	r14;
46	__u32	r15;
47	__u32	r16;
48	__u32	r17;
49	__u32	r18;
50	__u32	r19;
51	__u32	r20;
52	__u32	r21;
53	__u32	r22;
54	__u32	r23;
55	__u32	r24;
56	__u32	r25;
57	__u32	r26;
58	__u32	fp;
59	__u32	sp;
60	__u32	pc;
61};
62
63/*
64 * low level task data that entry.S needs immediate access to.
65 * __switch_to() assumes cpu_context follows immediately after cpu_domain.
66 */
67struct thread_info {
68	unsigned long		flags;		/* low level flags */
69	int			preempt_count;	/* 0 => preemptable */
70						/* <0 => bug */
71	mm_segment_t		addr_limit;	/* address limit */
72	struct task_struct	*task;		/* main task structure */
73	__u32			cpu;		/* cpu */
74	struct cpu_context_save	cpu_context;	/* cpu context */
75	__u32			syscall;	/* syscall number */
76	__u8			used_cp[16];	/* thread used copro */
77#ifdef CONFIG_UNICORE_FPU_F64
78	struct fp_state		fpstate __attribute__((aligned(8)));
79#endif
80};
81
82#define INIT_THREAD_INFO(tsk)						\
83{									\
84	.task		= &tsk,						\
85	.flags		= 0,						\
86	.preempt_count	= INIT_PREEMPT_COUNT,				\
87	.addr_limit	= KERNEL_DS,					\
88}
89
90#define init_thread_info	(init_thread_union.thread_info)
91#define init_stack		(init_thread_union.stack)
92
93/*
94 * how to get the thread information struct from C
95 */
96static inline struct thread_info *current_thread_info(void) __attribute_const__;
97
98static inline struct thread_info *current_thread_info(void)
99{
100	register unsigned long sp asm ("sp");
101	return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
102}
103
104#define thread_saved_pc(tsk)	\
105	((unsigned long)(task_thread_info(tsk)->cpu_context.pc))
106#define thread_saved_sp(tsk)	\
107	((unsigned long)(task_thread_info(tsk)->cpu_context.sp))
108#define thread_saved_fp(tsk)	\
109	((unsigned long)(task_thread_info(tsk)->cpu_context.fp))
110
111#endif
112
113/*
114 * thread information flags:
115 *  TIF_SYSCALL_TRACE	- syscall trace active
116 *  TIF_SIGPENDING	- signal pending
117 *  TIF_NEED_RESCHED	- rescheduling necessary
118 *  TIF_NOTIFY_RESUME	- callback before returning to user
119 */
120#define TIF_SIGPENDING		0
121#define TIF_NEED_RESCHED	1
122#define TIF_NOTIFY_RESUME	2	/* callback before returning to user */
123#define TIF_SYSCALL_TRACE	8
124#define TIF_MEMDIE		18
125#define TIF_RESTORE_SIGMASK	20
126
127#define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
128#define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
129#define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
130#define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
131
132/*
133 * Change these and you break ASM code in entry-common.S
134 */
135#define _TIF_WORK_MASK \
136	(_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_NOTIFY_RESUME)
137
138#endif /* __KERNEL__ */
139#endif /* __UNICORE_THREAD_INFO_H__ */
140