diff options
Diffstat (limited to 'include/asm-arm/processor.h')
| -rw-r--r-- | include/asm-arm/processor.h | 134 | 
1 files changed, 134 insertions, 0 deletions
| diff --git a/include/asm-arm/processor.h b/include/asm-arm/processor.h new file mode 100644 index 000000000..445d4495b --- /dev/null +++ b/include/asm-arm/processor.h @@ -0,0 +1,134 @@ +/* + *  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 */ |