| /* | 
 |  *  linux/include/asm-arm/processor.h | 
 |  * | 
 |  *  Copyright (C) 1995-2002 Russell King | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or modify | 
 |  * it under the terms of the GNU General Public License version 2 as | 
 |  * published by the Free Software Foundation. | 
 |  */ | 
 |  | 
 | #ifndef __ASM_ARM_PROCESSOR_H | 
 | #define __ASM_ARM_PROCESSOR_H | 
 |  | 
 | /* | 
 |  * Default implementation of macro that returns current | 
 |  * instruction pointer ("program counter"). | 
 |  */ | 
 | #define current_text_addr() ({ __label__ _l; _l: &&_l;}) | 
 |  | 
 | #define FP_SIZE 35 | 
 |  | 
 | struct fp_hard_struct { | 
 | 	unsigned int save[FP_SIZE];		/* as yet undefined */ | 
 | }; | 
 |  | 
 | struct fp_soft_struct { | 
 | 	unsigned int save[FP_SIZE];		/* undefined information */ | 
 | }; | 
 |  | 
 | union fp_state { | 
 | 	struct fp_hard_struct	hard; | 
 | 	struct fp_soft_struct	soft; | 
 | }; | 
 |  | 
 | typedef unsigned long mm_segment_t;		/* domain register	*/ | 
 |  | 
 | #ifdef __KERNEL__ | 
 |  | 
 | #define EISA_bus 0 | 
 | #define MCA_bus 0 | 
 | #define MCA_bus__is_a_macro | 
 |  | 
 | #include <asm/atomic.h> | 
 | #include <asm/ptrace.h> | 
 | #if 0	/* XXX###XXX */ | 
 | #include <asm/arch/memory.h> | 
 | #endif	/* XXX###XXX */ | 
 | #include <asm/proc/processor.h> | 
 | #include <asm/types.h> | 
 |  | 
 | union debug_insn { | 
 | 	u32	arm; | 
 | 	u16	thumb; | 
 | }; | 
 |  | 
 | struct debug_entry { | 
 | 	u32			address; | 
 | 	union debug_insn	insn; | 
 | }; | 
 |  | 
 | struct debug_info { | 
 | 	int			nsaved; | 
 | 	struct debug_entry	bp[2]; | 
 | }; | 
 |  | 
 | struct thread_struct { | 
 | 	atomic_t			refcount; | 
 | 							/* fault info	  */ | 
 | 	unsigned long			address; | 
 | 	unsigned long			trap_no; | 
 | 	unsigned long			error_code; | 
 | 							/* floating point */ | 
 | 	union fp_state			fpstate; | 
 | 							/* debugging	  */ | 
 | 	struct debug_info		debug; | 
 | 							/* context info	  */ | 
 | 	struct context_save_struct	*save; | 
 | 	EXTRA_THREAD_STRUCT | 
 | }; | 
 |  | 
 | #define INIT_THREAD  {					\ | 
 | 	refcount:	ATOMIC_INIT(1),			\ | 
 | 	EXTRA_THREAD_STRUCT_INIT			\ | 
 | } | 
 |  | 
 | /* | 
 |  * Return saved PC of a blocked thread. | 
 |  */ | 
 | static inline unsigned long thread_saved_pc(struct thread_struct *t) | 
 | { | 
 | 	return t->save ? pc_pointer(t->save->pc) : 0; | 
 | } | 
 |  | 
 | static inline unsigned long thread_saved_fp(struct thread_struct *t) | 
 | { | 
 | 	return t->save ? t->save->fp : 0; | 
 | } | 
 |  | 
 | /* Forward declaration, a strange C thing */ | 
 | struct task_struct; | 
 |  | 
 | /* Free all resources held by a thread. */ | 
 | extern void release_thread(struct task_struct *); | 
 |  | 
 | /* Copy and release all segment info associated with a VM */ | 
 | #define copy_segments(tsk, mm)		do { } while (0) | 
 | #define release_segments(mm)		do { } while (0) | 
 |  | 
 | unsigned long get_wchan(struct task_struct *p); | 
 |  | 
 | #define THREAD_SIZE	(8192) | 
 |  | 
 | extern struct task_struct *alloc_task_struct(void); | 
 | extern void __free_task_struct(struct task_struct *); | 
 | #define get_task_struct(p)	atomic_inc(&(p)->thread.refcount) | 
 | #define free_task_struct(p)					\ | 
 |  do {								\ | 
 | 	if (atomic_dec_and_test(&(p)->thread.refcount))		\ | 
 | 		__free_task_struct((p));			\ | 
 |  } while (0) | 
 |  | 
 | #define init_task	(init_task_union.task) | 
 | #define init_stack	(init_task_union.stack) | 
 |  | 
 | #define cpu_relax()	barrier() | 
 |  | 
 | /* | 
 |  * Create a new kernel thread | 
 |  */ | 
 | extern int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | 
 |  | 
 | #endif | 
 |  | 
 | #endif /* __ASM_ARM_PROCESSOR_H */ |