X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-arm%2Fthread_info.h;h=cfbccb63c67b4df54523fa3942b2ba6b096bd09b;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=ab1a6f4d6593563fabede4571755a55ec757cd86;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h index ab1a6f4d6..cfbccb63c 100644 --- a/include/asm-arm/thread_info.h +++ b/include/asm-arm/thread_info.h @@ -12,12 +12,18 @@ #ifdef __KERNEL__ +#include +#include + +#define THREAD_SIZE_ORDER 1 +#define THREAD_SIZE 8192 +#define THREAD_START_SP (THREAD_SIZE - 8) + #ifndef __ASSEMBLY__ struct task_struct; struct exec_domain; -#include #include #include #include @@ -40,11 +46,11 @@ struct cpu_context_save { /* * low level task data that entry.S needs immediate access to. - * We assume cpu_context follows immedately after cpu_domain. + * __switch_to() assumes cpu_context follows immediately after cpu_domain. */ struct thread_info { unsigned long flags; /* low level flags */ - __s32 preempt_count; /* 0 => preemptable, <0 => bug */ + int preempt_count; /* 0 => preemptable, <0 => bug */ mm_segment_t addr_limit; /* address limit */ struct task_struct *task; /* main task structure */ struct exec_domain *exec_domain; /* execution domain */ @@ -52,8 +58,10 @@ struct thread_info { __u32 cpu_domain; /* cpu domain */ struct cpu_context_save cpu_context; /* cpu context */ __u8 used_cp[16]; /* thread used copro */ - union fp_state fpstate; - struct restart_block restart_block; + unsigned long tp_value; + union fp_state fpstate __attribute__((aligned(8))); + union vfp_state vfpstate; + struct restart_block restart_block; }; #define INIT_THREAD_INFO(tsk) \ @@ -82,38 +90,29 @@ static inline struct thread_info *current_thread_info(void) __attribute_const__; static inline struct thread_info *current_thread_info(void) { register unsigned long sp asm ("sp"); - return (struct thread_info *)(sp & ~0x1fff); + return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); } -#define THREAD_SIZE (8192) - extern struct thread_info *alloc_thread_info(struct task_struct *task); extern void free_thread_info(struct thread_info *); -#define get_thread_info(ti) get_task_struct((ti)->task) -#define put_thread_info(ti) put_task_struct((ti)->task) - #define thread_saved_pc(tsk) \ - ((unsigned long)(pc_pointer((tsk)->thread_info->cpu_context.pc))) + ((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc))) #define thread_saved_fp(tsk) \ - ((unsigned long)((tsk)->thread_info->cpu_context.fp)) - -#else /* !__ASSEMBLY__ */ + ((unsigned long)(task_thread_info(tsk)->cpu_context.fp)) -#define TI_FLAGS 0 -#define TI_PREEMPT 4 -#define TI_ADDR_LIMIT 8 -#define TI_TASK 12 -#define TI_EXEC_DOMAIN 16 -#define TI_CPU 20 -#define TI_CPU_DOMAIN 24 -#define TI_CPU_SAVE 28 -#define TI_USED_CP 76 -#define TI_FPSTATE (TI_USED_CP+16) +extern void iwmmxt_task_disable(struct thread_info *); +extern void iwmmxt_task_copy(struct thread_info *, void *); +extern void iwmmxt_task_restore(struct thread_info *, void *); +extern void iwmmxt_task_release(struct thread_info *); #endif -#define PREEMPT_ACTIVE 0x04000000 +/* + * We use bit 30 of the preempt_count to indicate that kernel + * preemption is occuring. See include/asm-arm/hardirq.h. + */ +#define PREEMPT_ACTIVE 0x40000000 /* * thread information flags: @@ -128,15 +127,16 @@ extern void free_thread_info(struct thread_info *); #define TIF_SIGPENDING 1 #define TIF_NEED_RESCHED 2 #define TIF_SYSCALL_TRACE 8 -#define TIF_USED_FPU 16 -#define TIF_POLLING_NRFLAG 17 +#define TIF_POLLING_NRFLAG 16 +#define TIF_USING_IWMMXT 17 +#define TIF_MEMDIE 18 #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) -#define _TIF_USED_FPU (1 << TIF_USED_FPU) #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) +#define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) /* * Change these and you break ASM code in entry-common.S