RTEMS 5.2
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
mips.h
Go to the documentation of this file.
1
14/*
15 * COPYRIGHT (c) 1989-2001.
16 * On-Line Applications Research Corporation (OAR).
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#ifndef _RTEMS_SCORE_MIPS_H
24#define _RTEMS_SCORE_MIPS_H
25
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#ifndef ASM
39#include <rtems/mips/idtcpu.h>
40#endif
41
42/*
43 * SR bits that enable/disable interrupts
44 *
45 * NOTE: XXX what about SR_ERL?
46 */
47
48#if (__mips == 3) || (__mips == 32)
49#ifdef ASM
50#define SR_INTERRUPT_ENABLE_BITS 0x01
51#else
52#define SR_INTERRUPT_ENABLE_BITS SR_IE
53#endif
54
55#elif __mips == 1
56#define SR_INTERRUPT_ENABLE_BITS SR_IEC
57
58#else
59#error "mips interrupt enable bits: unknown architecture level!"
60#endif
61
62/*
63 * This file contains the information required to build
64 * RTEMS for a particular member of the "no cpu"
65 * family when executing in protected mode. It does
66 * this by setting variables to indicate which implementation
67 * dependent features are present in a particular member
68 * of the family.
69 */
70
71#if defined(__mips_soft_float)
72#define MIPS_HAS_FPU 0
73#else
74#define MIPS_HAS_FPU 1
75#endif
76
77
78#if (__mips == 1)
79#define CPU_MODEL_NAME "ISA Level 1 or 2"
80#elif (__mips == 3) || (__mips == 32)
81#if defined(__mips64)
82#define CPU_MODEL_NAME "ISA Level 4"
83#else
84#define CPU_MODEL_NAME "ISA Level 3"
85#endif
86#else
87#error "Unknown MIPS ISA level"
88#endif
89
90/*
91 * Define the name of the CPU family.
92 */
93
94#define CPU_NAME "MIPS"
95
96/*
97 * RTEMS Vector numbers for exception conditions. This is a direct
98 * map to the causes.
99 */
100
101#define MIPS_EXCEPTION_BASE 0
102
103#define MIPS_EXCEPTION_INT MIPS_EXCEPTION_BASE+0
104#define MIPS_EXCEPTION_MOD MIPS_EXCEPTION_BASE+1
105#define MIPS_EXCEPTION_TLBL MIPS_EXCEPTION_BASE+2
106#define MIPS_EXCEPTION_TLBS MIPS_EXCEPTION_BASE+3
107#define MIPS_EXCEPTION_ADEL MIPS_EXCEPTION_BASE+4
108#define MIPS_EXCEPTION_ADES MIPS_EXCEPTION_BASE+5
109#define MIPS_EXCEPTION_IBE MIPS_EXCEPTION_BASE+6
110#define MIPS_EXCEPTION_DBE MIPS_EXCEPTION_BASE+7
111#define MIPS_EXCEPTION_SYSCALL MIPS_EXCEPTION_BASE+8
112#define MIPS_EXCEPTION_BREAK MIPS_EXCEPTION_BASE+9
113#define MIPS_EXCEPTION_RI MIPS_EXCEPTION_BASE+10
114#define MIPS_EXCEPTION_CPU MIPS_EXCEPTION_BASE+11
115#define MIPS_EXCEPTION_OVERFLOW MIPS_EXCEPTION_BASE+12
116#define MIPS_EXCEPTION_TRAP MIPS_EXCEPTION_BASE+13
117#define MIPS_EXCEPTION_VCEI MIPS_EXCEPTION_BASE+14
118/* FPE only on mips2 and higher */
119#define MIPS_EXCEPTION_FPE MIPS_EXCEPTION_BASE+15
120#define MIPS_EXCEPTION_C2E MIPS_EXCEPTION_BASE+16
121/* 17-22 reserved */
122#define MIPS_EXCEPTION_WATCH MIPS_EXCEPTION_BASE+23
123/* 24-30 reserved */
124#define MIPS_EXCEPTION_VCED MIPS_EXCEPTION_BASE+31
125
126#define MIPS_INTERRUPT_BASE MIPS_EXCEPTION_BASE+32
127
128/*
129 * Some macros to access registers
130 */
131
132#define mips_get_sr( _x ) \
133 do { \
134 __asm__ volatile( "mfc0 %0, $12; nop" : "=r" (_x) : ); \
135 } while (0)
136
137#define mips_set_sr( _x ) \
138 do { \
139 unsigned int __x = (_x); \
140 __asm__ volatile( "mtc0 %0, $12; nop" : : "r" (__x) ); \
141 } while (0)
142
143
144/*
145 * Access the Cause register
146 */
147
148#define mips_get_cause( _x ) \
149 do { \
150 __asm__ volatile( "mfc0 %0, $13; nop" : "=r" (_x) : ); \
151 } while (0)
152
153
154#define mips_set_cause( _x ) \
155 do { \
156 unsigned int __x = (_x); \
157 __asm__ volatile( "mtc0 %0, $13; nop" : : "r" (__x) ); \
158 } while (0)
159
160
161
162
163/*
164 * Access the Debug Cache Invalidate Control register
165 */
166
167#define mips_get_dcic( _x ) \
168 do { \
169 __asm__ volatile( "mfc0 %0, $7; nop" : "=r" (_x) : ); \
170 } while (0)
171
172
173#define mips_set_dcic( _x ) \
174 do { \
175 unsigned int __x = (_x); \
176 __asm__ volatile( "mtc0 %0, $7; nop" : : "r" (__x) ); \
177 } while (0)
178
179
180
181
182/*
183 * Access the Breakpoint Program Counter & Mask registers
184 * (_x for BPC, _y for mask)
185 */
186
187#define mips_get_bpcrm( _x, _y ) \
188 do { \
189 __asm__ volatile( "mfc0 %0, $3; nop" : "=r" (_x) : ); \
190 __asm__ volatile( "mfc0 %0, $11; nop" : "=r" (_y) : ); \
191 } while (0)
192
193
194#define mips_set_bpcrm( _x, _y ) \
195 do { \
196 unsigned int __x = (_x); \
197 unsigned int __y = (_y); \
198 __asm__ volatile( "mtc0 %0, $11; nop" : : "r" (__y) ); \
199 __asm__ volatile( "mtc0 %0, $3; nop" : : "r" (__x) ); \
200 } while (0)
201
202
203
204
205
206
207/*
208 * Access the Breakpoint Data Address & Mask registers
209 * (_x for BDA, _y for mask)
210 */
211
212#define mips_get_bdarm( _x, _y ) \
213 do { \
214 __asm__ volatile( "mfc0 %0, $5; nop" : "=r" (_x) : ); \
215 __asm__ volatile( "mfc0 %0, $9; nop" : "=r" (_y) : ); \
216 } while (0)
217
218
219#define mips_set_bdarm( _x, _y ) \
220 do { \
221 unsigned int __x = (_x); \
222 unsigned int __y = (_y); \
223 __asm__ volatile( "mtc0 %0, $9; nop" : : "r" (__y) ); \
224 __asm__ volatile( "mtc0 %0, $5; nop" : : "r" (__x) ); \
225 } while (0)
226
227
228
229
230
231
232
233/*
234 * Access FCR31
235 */
236
237#if ( MIPS_HAS_FPU == 1 )
238
239#define mips_get_fcr31( _x ) \
240 do { \
241 __asm__ volatile( "cfc1 %0, $31; nop" : "=r" (_x) : ); \
242 } while(0)
243
244
245#define mips_set_fcr31( _x ) \
246 do { \
247 unsigned int __x = (_x); \
248 __asm__ volatile( "ctc1 %0, $31; nop" : : "r" (__x) ); \
249 } while(0)
250
251#else
252
253#define mips_get_fcr31( _x )
254#define mips_set_fcr31( _x )
255
256#endif
257
258/*
259 * Manipulate interrupt mask
260 *
261 * mips_unmask_interrupt( _mask)
262 * enables interrupts - mask is positioned so it only needs to be or'ed
263 * into the status reg. This also does some other things !!!! Caution
264 * should be used if invoking this while in the middle of a debugging
265 * session where the client may have nested interrupts.
266 *
267 * mips_mask_interrupt( _mask )
268 * disable the interrupt - mask is the complement of the bits to be
269 * cleared - i.e. to clear ext int 5 the mask would be - 0xffff7fff
270 *
271 *
272 * NOTE: mips_mask_interrupt() used to be disable_int().
273 * mips_unmask_interrupt() used to be enable_int().
274 *
275 */
276
277#define mips_enable_in_interrupt_mask( _mask ) \
278 do { \
279 unsigned int _sr; \
280 mips_get_sr( _sr ); \
281 _sr |= (_mask); \
282 mips_set_sr( _sr ); \
283 } while (0)
284
285#define mips_disable_in_interrupt_mask( _mask ) \
286 do { \
287 unsigned int _sr; \
288 mips_get_sr( _sr ); \
289 _sr &= ~(_mask); \
290 mips_set_sr( _sr ); \
291 } while (0)
292
293#ifdef __cplusplus
294}
295#endif
296
298#endif /* _RTEMS_SCORE_MIPS_H */
299/* end of include file */
CPU Related Definitions.