Blame view

include/asm-mips/processor.h 6.43 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
  /*
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
   * Copyright (C) 1994 Waldorf GMBH
   * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 Ralf Baechle
   * Copyright (C) 1996 Paul M. Antoine
   * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   */
  #ifndef _ASM_PROCESSOR_H
  #define _ASM_PROCESSOR_H
41c594ab6   Ralf Baechle   [MIPS] MT: Improv...
13
  #include <linux/cpumask.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  #include <linux/threads.h>
  
  #include <asm/cachectl.h>
  #include <asm/cpu.h>
  #include <asm/cpu-info.h>
  #include <asm/mipsregs.h>
  #include <asm/prefetch.h>
  #include <asm/system.h>
  
  /*
   * Return current * instruction pointer ("program counter").
   */
  #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  
  /*
   * System setup and hardware flags..
   */
  extern void (*cpu_wait)(void);
  
  extern unsigned int vced_count, vcei_count;
875d43e72   Ralf Baechle   [PATCH] mips: cle...
34
  #ifdef CONFIG_32BIT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
44
45
46
  /*
   * User space process size: 2GB. This is hardcoded into a few places,
   * so don't change it unless you know what you are doing.
   */
  #define TASK_SIZE	0x7fff8000UL
  
  /*
   * This decides where the kernel will search for a free chunk of vm
   * space during mmap's.
   */
  #define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 3))
  #endif
875d43e72   Ralf Baechle   [PATCH] mips: cle...
47
  #ifdef CONFIG_64BIT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /*
   * User space process size: 1TB. This is hardcoded into a few places,
   * so don't change it unless you know what you are doing.  TASK_SIZE
   * is limited to 1TB by the R4000 architecture; R10000 and better can
   * support 16TB; the architectural reserve for future expansion is
   * 8192EB ...
   */
  #define TASK_SIZE32	0x7fff8000UL
  #define TASK_SIZE	0x10000000000UL
  
  /*
   * This decides where the kernel will search for a free chunk of vm
   * space during mmap's.
   */
  #define TASK_UNMAPPED_BASE	((current->thread.mflags & MF_32BIT_ADDR) ? \
  	PAGE_ALIGN(TASK_SIZE32 / 3) : PAGE_ALIGN(TASK_SIZE / 3))
  #endif
  
  #define NUM_FPU_REGS	32
  
  typedef __u64 fpureg_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
  /*
   * It would be nice to add some more fields for emulator statistics, but there
   * are a number of fixed offsets in offset.h and elsewhere that would have to
   * be recalculated by hand.  So the additional information will be private to
   * the FPU emulator for now.  See asm-mips/fpu_emulator.h.
   */
eae89076e   Atsushi Nemoto   [MIPS] Unify mips...
75
  struct mips_fpu_struct {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
  	fpureg_t	fpr[NUM_FPU_REGS];
  	unsigned int	fcr31;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  #define INIT_FPU { \
eae89076e   Atsushi Nemoto   [MIPS] Unify mips...
80
  	{0,} \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  }
e50c0a8fa   Ralf Baechle   Support the MIPS3...
82
83
84
85
86
87
88
  #define NUM_DSP_REGS   6
  
  typedef __u32 dspreg_t;
  
  struct mips_dsp_state {
  	dspreg_t        dspr[NUM_DSP_REGS];
  	unsigned int    dspcontrol;
e50c0a8fa   Ralf Baechle   Support the MIPS3...
89
90
91
  };
  
  #define INIT_DSP {{0,},}
41c594ab6   Ralf Baechle   [MIPS] MT: Improv...
92
93
94
  #define INIT_CPUMASK { \
  	{0,} \
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
98
99
  typedef struct {
  	unsigned long seg;
  } mm_segment_t;
  
  #define ARCH_MIN_TASKALIGN	8
e50c0a8fa   Ralf Baechle   Support the MIPS3...
100
  struct mips_abi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
107
108
109
110
111
112
113
  /*
   * If you change thread_struct remember to change the #defines below too!
   */
  struct thread_struct {
  	/* Saved main processor registers. */
  	unsigned long reg16;
  	unsigned long reg17, reg18, reg19, reg20, reg21, reg22, reg23;
  	unsigned long reg29, reg30, reg31;
  
  	/* Saved cp0 stuff. */
  	unsigned long cp0_status;
  
  	/* Saved fpu/fpu emulator stuff. */
eae89076e   Atsushi Nemoto   [MIPS] Unify mips...
114
  	struct mips_fpu_struct fpu;
f088fc84f   Ralf Baechle   [MIPS] FPU affini...
115
116
117
118
119
120
  #ifdef CONFIG_MIPS_MT_FPAFF
  	/* Emulated instruction count */
  	unsigned long emulated_fp;
  	/* Saved per-thread scheduler affinity mask */
  	cpumask_t user_cpus_allowed;
  #endif /* CONFIG_MIPS_MT_FPAFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121

e50c0a8fa   Ralf Baechle   Support the MIPS3...
122
123
  	/* Saved state of the DSP ASE, if available. */
  	struct mips_dsp_state dsp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
127
128
129
130
131
132
  	/* Other stuff associated with the thread. */
  	unsigned long cp0_badvaddr;	/* Last user fault */
  	unsigned long cp0_baduaddr;	/* Last kernel fault accessing USEG */
  	unsigned long error_code;
  	unsigned long trap_no;
  #define MF_FIXADE	1		/* Fix address errors in software */
  #define MF_LOGADE	2		/* Log address errors to syslog */
  #define MF_32BIT_REGS	4		/* also implies 16/32 fprs */
  #define MF_32BIT_ADDR	8		/* 32-bit address space (o32/n32) */
41c594ab6   Ralf Baechle   [MIPS] MT: Improv...
133
  #define MF_FPUBOUND	0x10		/* thread bound to FPU-full CPU set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
  	unsigned long mflags;
  	unsigned long irix_trampoline;  /* Wheee... */
  	unsigned long irix_oldctx;
e50c0a8fa   Ralf Baechle   Support the MIPS3...
137
  	struct mips_abi *abi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
143
  };
  
  #define MF_ABI_MASK	(MF_32BIT_REGS | MF_32BIT_ADDR)
  #define MF_O32		(MF_32BIT_REGS | MF_32BIT_ADDR)
  #define MF_N32		MF_32BIT_ADDR
  #define MF_N64		0
f088fc84f   Ralf Baechle   [MIPS] FPU affini...
144
145
146
147
148
  #ifdef CONFIG_MIPS_MT_FPAFF
  #define FPAFF_INIT 0, INIT_CPUMASK,
  #else
  #define FPAFF_INIT
  #endif /* CONFIG_MIPS_MT_FPAFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  #define INIT_THREAD  { \
          /* \
           * saved main processor registers \
           */ \
  	0, 0, 0, 0, 0, 0, 0, 0, \
  	               0, 0, 0, \
  	/* \
  	 * saved cp0 stuff \
  	 */ \
  	0, \
  	/* \
  	 * saved fpu/fpu emulator stuff \
  	 */ \
  	INIT_FPU, \
  	/* \
f088fc84f   Ralf Baechle   [MIPS] FPU affini...
164
165
166
167
  	 * fpu affinity state (null if not FPAFF) \
  	 */ \
  	FPAFF_INIT \
  	/* \
e50c0a8fa   Ralf Baechle   Support the MIPS3...
168
169
170
171
  	 * saved dsp/dsp emulator stuff \
  	 */ \
  	INIT_DSP, \
  	/* \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  	 * Other stuff associated with the process \
  	 */ \
  	0, 0, 0, 0, \
  	/* \
  	 * For now the default is to fix address errors \
  	 */ \
  	MF_FIXADE, 0, 0 \
  }
  
  struct task_struct;
  
  /* Free all resources held by a thread. */
  #define release_thread(thread) do { } while(0)
  
  /* Prepare to copy thread state - unlazy all lazy status */
  #define prepare_to_copy(tsk)	do { } while (0)
  
  extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  
  extern unsigned long thread_saved_pc(struct task_struct *tsk);
  
  /*
   * Do necessary setup to start up a newly executed thread.
   */
  extern void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp);
  
  unsigned long get_wchan(struct task_struct *p);
75bb07e78   Al Viro   [PATCH] mips: tas...
199
  #define __KSTK_TOS(tsk) ((unsigned long)task_stack_page(tsk) + THREAD_SIZE - 32)
40bc9c671   Al Viro   [PATCH] mips: tas...
200
201
202
203
  #define task_pt_regs(tsk) ((struct pt_regs *)__KSTK_TOS(tsk) - 1)
  #define KSTK_EIP(tsk) (task_pt_regs(tsk)->cp0_epc)
  #define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[29])
  #define KSTK_STATUS(tsk) (task_pt_regs(tsk)->cp0_status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  
  #define cpu_relax()	barrier()
  
  /*
   * Return_address is a replacement for __builtin_return_address(count)
   * which on certain architectures cannot reasonably be implemented in GCC
   * (MIPS, Alpha) or is unuseable with -fomit-frame-pointer (i386).
   * Note that __builtin_return_address(x>=1) is forbidden because GCC
   * aborts compilation on some CPUs.  It's simply not possible to unwind
   * some CPU's stackframes.
   *
   * __builtin_return_address works only for non-leaf functions.  We avoid the
   * overhead of a function call by forcing the compiler to save the return
   * address register on the stack.
   */
  #define return_address() ({__asm__ __volatile__("":::"$31");__builtin_return_address(0);})
  
  #ifdef CONFIG_CPU_HAS_PREFETCH
  
  #define ARCH_HAS_PREFETCH
  
  extern inline void prefetch(const void *addr)
  {
  	__asm__ __volatile__(
  	"	.set	mips4		
  "
  	"	pref	%0, (%1)	
  "
  	"	.set	mips0		
  "
  	:
  	: "i" (Pref_Load), "r" (addr));
  }
  
  #endif
  
  #endif /* _ASM_PROCESSOR_H */