Home | History | Annotate | Download | only in asm-arm
      1 /*
      2  *  linux/include/asm-arm/thread_info.h
      3  *
      4  *  Copyright (C) 2002 Russell King.
      5  *
      6  * This program is free software; you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License version 2 as
      8  * published by the Free Software Foundation.
      9  */
     10 #ifndef __ASM_ARM_THREAD_INFO_H
     11 #define __ASM_ARM_THREAD_INFO_H
     12 
     13 #ifdef __KERNEL__
     14 
     15 #include <linux/compiler.h>
     16 #include <asm/fpstate.h>
     17 
     18 #define THREAD_SIZE_ORDER	1
     19 #define THREAD_SIZE		8192
     20 #define THREAD_START_SP		(THREAD_SIZE - 8)
     21 
     22 #ifndef __ASSEMBLY__
     23 
     24 struct task_struct;
     25 struct exec_domain;
     26 
     27 #include <asm/ptrace.h>
     28 #include <asm/types.h>
     29 #include <asm/domain.h>
     30 
     31 typedef unsigned long mm_segment_t;
     32 
     33 struct cpu_context_save {
     34 	__u32	r4;
     35 	__u32	r5;
     36 	__u32	r6;
     37 	__u32	r7;
     38 	__u32	r8;
     39 	__u32	r9;
     40 	__u32	sl;
     41 	__u32	fp;
     42 	__u32	sp;
     43 	__u32	pc;
     44 	__u32	extra[2];		/* Xscale 'acc' register, etc */
     45 };
     46 
     47 /*
     48  * low level task data that entry.S needs immediate access to.
     49  * __switch_to() assumes cpu_context follows immediately after cpu_domain.
     50  */
     51 struct thread_info {
     52 	unsigned long		flags;		/* low level flags */
     53 	int			preempt_count;	/* 0 => preemptable, <0 => bug */
     54 	mm_segment_t		addr_limit;	/* address limit */
     55 	struct task_struct	*task;		/* main task structure */
     56 	struct exec_domain	*exec_domain;	/* execution domain */
     57 	__u32			cpu;		/* cpu */
     58 	__u32			cpu_domain;	/* cpu domain */
     59 	struct cpu_context_save	cpu_context;	/* cpu context */
     60 	__u8			used_cp[16];	/* thread used copro */
     61 	unsigned long		tp_value;
     62 	struct crunch_state	crunchstate;
     63 	union fp_state		fpstate __attribute__((aligned(8)));
     64 	union vfp_state		vfpstate;
     65 	struct restart_block	restart_block;
     66 };
     67 
     68 #define INIT_THREAD_INFO(tsk)						\
     69 {									\
     70 	.task		= &tsk,						\
     71 	.exec_domain	= &default_exec_domain,				\
     72 	.flags		= 0,						\
     73 	.preempt_count	= 1,						\
     74 	.addr_limit	= KERNEL_DS,					\
     75 	.cpu_domain	= domain_val(DOMAIN_USER, DOMAIN_MANAGER) |	\
     76 			  domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) |	\
     77 			  domain_val(DOMAIN_IO, DOMAIN_CLIENT),		\
     78 	.restart_block	= {						\
     79 		.fn	= do_no_restart_syscall,			\
     80 	},								\
     81 }
     82 
     83 #define init_thread_info	(init_thread_union.thread_info)
     84 #define init_stack		(init_thread_union.stack)
     85 
     86 /*
     87  * how to get the thread information struct from C
     88  */
     89 static inline struct thread_info *current_thread_info(void) __attribute_const__;
     90 
     91 static inline struct thread_info *current_thread_info(void)
     92 {
     93 	register unsigned long sp asm ("sp");
     94 	return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
     95 }
     96 
     97 extern struct thread_info *alloc_thread_info(struct task_struct *task);
     98 extern void free_thread_info(struct thread_info *);
     99 
    100 #define thread_saved_pc(tsk)	\
    101 	((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc)))
    102 #define thread_saved_fp(tsk)	\
    103 	((unsigned long)(task_thread_info(tsk)->cpu_context.fp))
    104 
    105 extern void crunch_task_disable(struct thread_info *);
    106 extern void crunch_task_copy(struct thread_info *, void *);
    107 extern void crunch_task_restore(struct thread_info *, void *);
    108 extern void crunch_task_release(struct thread_info *);
    109 
    110 extern void iwmmxt_task_disable(struct thread_info *);
    111 extern void iwmmxt_task_copy(struct thread_info *, void *);
    112 extern void iwmmxt_task_restore(struct thread_info *, void *);
    113 extern void iwmmxt_task_release(struct thread_info *);
    114 extern void iwmmxt_task_switch(struct thread_info *);
    115 
    116 #endif
    117 
    118 /*
    119  * We use bit 30 of the preempt_count to indicate that kernel
    120  * preemption is occurring.  See include/asm-arm/hardirq.h.
    121  */
    122 #define PREEMPT_ACTIVE	0x40000000
    123 
    124 /*
    125  * thread information flags:
    126  *  TIF_SYSCALL_TRACE	- syscall trace active
    127  *  TIF_NOTIFY_RESUME	- resumption notification requested
    128  *  TIF_SIGPENDING	- signal pending
    129  *  TIF_NEED_RESCHED	- rescheduling necessary
    130  *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
    131  *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
    132  */
    133 #define TIF_NOTIFY_RESUME	0
    134 #define TIF_SIGPENDING		1
    135 #define TIF_NEED_RESCHED	2
    136 #define TIF_SYSCALL_TRACE	8
    137 #define TIF_POLLING_NRFLAG	16
    138 #define TIF_USING_IWMMXT	17
    139 #define TIF_MEMDIE		18
    140 
    141 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
    142 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
    143 #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
    144 #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
    145 #define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)
    146 #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
    147 
    148 /*
    149  * Change these and you break ASM code in entry-common.S
    150  */
    151 #define _TIF_WORK_MASK		0x000000ff
    152 
    153 #endif /* __KERNEL__ */
    154 #endif /* __ASM_ARM_THREAD_INFO_H */
    155