1 /*
2  *  linux/include/asm-arm/processor.h
3  *
4  *  Copyright (C) 1995-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 
11 #ifndef __ASM_ARM_PROCESSOR_H
12 #define __ASM_ARM_PROCESSOR_H
13 
14 /*
15  * Default implementation of macro that returns current
16  * instruction pointer ("program counter").
17  */
18 #define current_text_addr() ({ __label__ _l; _l: &&_l;})
19 
20 #define FP_SIZE 35
21 
22 struct fp_hard_struct {
23 	unsigned int save[FP_SIZE];		/* as yet undefined */
24 };
25 
26 struct fp_soft_struct {
27 	unsigned int save[FP_SIZE];		/* undefined information */
28 };
29 
30 union fp_state {
31 	struct fp_hard_struct	hard;
32 	struct fp_soft_struct	soft;
33 };
34 
35 typedef unsigned long mm_segment_t;		/* domain register	*/
36 
37 #ifdef __KERNEL__
38 
39 #define EISA_bus 0
40 #define MCA_bus 0
41 #define MCA_bus__is_a_macro
42 
43 #include <asm/atomic.h>
44 #include <asm/ptrace.h>
45 #if 0	/* XXX###XXX */
46 #include <asm/arch/memory.h>
47 #endif	/* XXX###XXX */
48 #include <asm/proc-armv/processor.h>
49 #include <asm/types.h>
50 
51 union debug_insn {
52 	u32	arm;
53 	u16	thumb;
54 };
55 
56 struct debug_entry {
57 	u32			address;
58 	union debug_insn	insn;
59 };
60 
61 struct debug_info {
62 	int			nsaved;
63 	struct debug_entry	bp[2];
64 };
65 
66 struct thread_struct {
67 	atomic_t			refcount;
68 							/* fault info	  */
69 	unsigned long			address;
70 	unsigned long			trap_no;
71 	unsigned long			error_code;
72 							/* floating point */
73 	union fp_state			fpstate;
74 							/* debugging	  */
75 	struct debug_info		debug;
76 							/* context info	  */
77 	struct context_save_struct	*save;
78 	EXTRA_THREAD_STRUCT
79 };
80 
81 #define INIT_THREAD  {					\
82 	refcount:	ATOMIC_INIT(1),			\
83 	EXTRA_THREAD_STRUCT_INIT			\
84 }
85 
86 /*
87  * Return saved PC of a blocked thread.
88  */
thread_saved_pc(struct thread_struct * t)89 static inline unsigned long thread_saved_pc(struct thread_struct *t)
90 {
91 	return t->save ? pc_pointer(t->save->pc) : 0;
92 }
93 
thread_saved_fp(struct thread_struct * t)94 static inline unsigned long thread_saved_fp(struct thread_struct *t)
95 {
96 	return t->save ? t->save->fp : 0;
97 }
98 
99 /* Forward declaration, a strange C thing */
100 struct task_struct;
101 
102 /* Free all resources held by a thread. */
103 extern void release_thread(struct task_struct *);
104 
105 /* Copy and release all segment info associated with a VM */
106 #define copy_segments(tsk, mm)		do { } while (0)
107 #define release_segments(mm)		do { } while (0)
108 
109 unsigned long get_wchan(struct task_struct *p);
110 
111 #define THREAD_SIZE	(8192)
112 
113 extern struct task_struct *alloc_task_struct(void);
114 extern void __free_task_struct(struct task_struct *);
115 #define get_task_struct(p)	atomic_inc(&(p)->thread.refcount)
116 #define free_task_struct(p)					\
117  do {								\
118 	if (atomic_dec_and_test(&(p)->thread.refcount))		\
119 		__free_task_struct((p));			\
120  } while (0)
121 
122 #define init_task	(init_task_union.task)
123 #define init_stack	(init_task_union.stack)
124 
125 #define cpu_relax()	barrier()
126 
127 /*
128  * Create a new kernel thread
129  */
130 extern int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
131 
132 #endif
133 
134 #endif /* __ASM_ARM_PROCESSOR_H */
135