RTEMS CPU Kit with SuperCore  4.11.3
sparc.h
Go to the documentation of this file.
1 
14 /*
15  * COPYRIGHT (c) 1989-2011.
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_SPARC_H
24 #define _RTEMS_SCORE_SPARC_H
25 
26 #include <rtems/score/types.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 /*
33  *
34  * Currently recognized feature flags:
35  *
36  * + SPARC_HAS_FPU
37  * 0 - no HW FPU
38  * 1 - has HW FPU (assumed to be compatible w/90C602)
39  *
40  * + SPARC_HAS_BITSCAN
41  * 0 - does not have scan instructions
42  * 1 - has scan instruction (not currently implemented)
43  *
44  * + SPARC_NUMBER_OF_REGISTER_WINDOWS
45  * 8 is the most common number supported by SPARC implementations.
46  * SPARC_PSR_CWP_MASK is derived from this value.
47  */
48 
55 #define SPARC_HAS_BITSCAN 0
56 
63 #define SPARC_NUMBER_OF_REGISTER_WINDOWS 8
64 
70 #if defined(_SOFT_FLOAT)
71  #define SPARC_HAS_FPU 0
72 #else
73  #define SPARC_HAS_FPU 1
74 #endif
75 
80 #if SPARC_HAS_FPU
81  #define CPU_MODEL_NAME "w/FPU"
82 #else
83  #define CPU_MODEL_NAME "w/soft-float"
84 #endif
85 
89 #define CPU_NAME "SPARC"
90 
91 /*
92  * Miscellaneous constants
93  */
94 
100 #if (SPARC_NUMBER_OF_REGISTER_WINDOWS == 8)
101  #define SPARC_PSR_CWP_MASK 0x07 /* bits 0 - 4 */
102 #elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 16)
103  #define SPARC_PSR_CWP_MASK 0x0F /* bits 0 - 4 */
104 #elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 32)
105  #define SPARC_PSR_CWP_MASK 0x1F /* bits 0 - 4 */
106 #else
107  #error "Unsupported number of register windows for this cpu"
108 #endif
109 
111 #define SPARC_PSR_ET_MASK 0x00000020 /* bit 5 */
112 
113 #define SPARC_PSR_PS_MASK 0x00000040 /* bit 6 */
114 
115 #define SPARC_PSR_S_MASK 0x00000080 /* bit 7 */
116 
117 #define SPARC_PSR_PIL_MASK 0x00000F00 /* bits 8 - 11 */
118 
119 #define SPARC_PSR_EF_MASK 0x00001000 /* bit 12 */
120 
121 #define SPARC_PSR_EC_MASK 0x00002000 /* bit 13 */
122 
123 #define SPARC_PSR_ICC_MASK 0x00F00000 /* bits 20 - 23 */
124 
125 #define SPARC_PSR_VER_MASK 0x0F000000 /* bits 24 - 27 */
126 
127 #define SPARC_PSR_IMPL_MASK 0xF0000000 /* bits 28 - 31 */
128 
130 #define SPARC_PSR_CWP_BIT_POSITION 0 /* bits 0 - 4 */
131 
132 #define SPARC_PSR_ET_BIT_POSITION 5 /* bit 5 */
133 
134 #define SPARC_PSR_PS_BIT_POSITION 6 /* bit 6 */
135 
136 #define SPARC_PSR_S_BIT_POSITION 7 /* bit 7 */
137 
138 #define SPARC_PSR_PIL_BIT_POSITION 8 /* bits 8 - 11 */
139 
140 #define SPARC_PSR_EF_BIT_POSITION 12 /* bit 12 */
141 
142 #define SPARC_PSR_EC_BIT_POSITION 13 /* bit 13 */
143 
144 #define SPARC_PSR_ICC_BIT_POSITION 20 /* bits 20 - 23 */
145 
146 #define SPARC_PSR_VER_BIT_POSITION 24 /* bits 24 - 27 */
147 
148 #define SPARC_PSR_IMPL_BIT_POSITION 28 /* bits 28 - 31 */
149 
150 #define LEON3_ASR17_PROCESSOR_INDEX_SHIFT 28
151 
152 /* SPARC Software Trap number definitions */
153 #define SPARC_SWTRAP_SYSCALL 0
154 #define SPARC_SWTRAP_IRQDIS 9
155 #define SPARC_SWTRAP_IRQEN 10
156 
157 #ifndef ASM
158 
162 #define nop() \
163  do { \
164  __asm__ volatile ( "nop" ); \
165  } while ( 0 )
166 
172 #if defined(RTEMS_PARAVIRT)
173 
174 uint32_t _SPARC_Get_PSR( void );
175 
176 #define sparc_get_psr( _psr ) \
177  (_psr) = _SPARC_Get_PSR()
178 
179 #else /* RTEMS_PARAVIRT */
180 
181 #define sparc_get_psr( _psr ) \
182  do { \
183  (_psr) = 0; \
184  __asm__ volatile( "rd %%psr, %0" : "=r" (_psr) : "0" (_psr) ); \
185  } while ( 0 )
186 
187 #endif /* RTEMS_PARAVIRT */
188 
194 #if defined(RTEMS_PARAVIRT)
195 
196 void _SPARC_Set_PSR( uint32_t new_psr );
197 
198 #define sparc_set_psr( _psr ) \
199  _SPARC_Set_PSR( _psr )
200 
201 #else /* RTEMS_PARAVIRT */
202 
203 #define sparc_set_psr( _psr ) \
204  do { \
205  __asm__ volatile ( "mov %0, %%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \
206  nop(); \
207  nop(); \
208  nop(); \
209  } while ( 0 )
210 
211 #endif /* RTEMS_PARAVIRT */
212 
218 #if defined(RTEMS_PARAVIRT)
219 
220 uint32_t _SPARC_Get_TBR( void );
221 
222 #define sparc_get_tbr( _tbr ) \
223  (_tbr) = _SPARC_Get_TBR()
224 
225 #else /* RTEMS_PARAVIRT */
226 
227 #define sparc_get_tbr( _tbr ) \
228  do { \
229  (_tbr) = 0; /* to avoid unitialized warnings */ \
230  __asm__ volatile( "rd %%tbr, %0" : "=r" (_tbr) : "0" (_tbr) ); \
231  } while ( 0 )
232 
233 #endif /* RTEMS_PARAVIRT */
234 
240 #if defined(RTEMS_PARAVIRT)
241 
242 void _SPARC_Set_TBR( uint32_t new_tbr );
243 
244 #define sparc_set_tbr( _tbr ) \
245  _SPARC_Set_TBR((_tbr))
246 
247 #else /* RTEMS_PARAVIRT */
248 
249 #define sparc_set_tbr( _tbr ) \
250  do { \
251  __asm__ volatile( "wr %0, 0, %%tbr" : "=r" (_tbr) : "0" (_tbr) ); \
252  } while ( 0 )
253 
254 #endif /* RTEMS_PARAVIRT */
255 
261 #define sparc_get_wim( _wim ) \
262  do { \
263  __asm__ volatile( "rd %%wim, %0" : "=r" (_wim) : "0" (_wim) ); \
264  } while ( 0 )
265 
271 #define sparc_set_wim( _wim ) \
272  do { \
273  __asm__ volatile( "wr %0, %%wim" : "=r" (_wim) : "0" (_wim) ); \
274  nop(); \
275  nop(); \
276  nop(); \
277  } while ( 0 )
278 
284 #define sparc_get_y( _y ) \
285  do { \
286  __asm__ volatile( "rd %%y, %0" : "=r" (_y) : "0" (_y) ); \
287  } while ( 0 )
288 
294 #define sparc_set_y( _y ) \
295  do { \
296  __asm__ volatile( "wr %0, %%y" : "=r" (_y) : "0" (_y) ); \
297  } while ( 0 )
298 
306 static inline uint32_t sparc_disable_interrupts(void)
307 {
308  register uint32_t psr __asm__("g1"); /* return value of trap handler */
309  __asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
310  return psr;
311 }
312 
320 static inline void sparc_enable_interrupts(uint32_t psr)
321 {
322  register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
323 
324  /*
325  * The trap instruction has a higher trap priority than the interrupts
326  * according to "The SPARC Architecture Manual: Version 8", Table 7-1
327  * "Exception and Interrupt Request Priority and tt Values". Add a nop to
328  * prevent a trap instruction right after the interrupt enable trap.
329  */
330  __asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
331 }
332 
355 void sparc_syscall_exit(uint32_t exitcode1, uint32_t exitcode2)
357 
365 #define sparc_flash_interrupts( _psr ) \
366  do { \
367  sparc_enable_interrupts( (_psr) ); \
368  _psr = sparc_disable_interrupts(); \
369  } while ( 0 )
370 
378 #define sparc_get_interrupt_level( _level ) \
379  do { \
380  register uint32_t _psr_level = 0; \
381  \
382  sparc_get_psr( _psr_level ); \
383  (_level) = \
384  (_psr_level & SPARC_PSR_PIL_MASK) >> SPARC_PSR_PIL_BIT_POSITION; \
385  } while ( 0 )
386 
387 static inline uint32_t _LEON3_Get_current_processor( void )
388 {
389  uint32_t asr17;
390 
391  __asm__ volatile (
392  "rd %%asr17, %0"
393  : "=&r" (asr17)
394  );
395 
396  return asr17 >> LEON3_ASR17_PROCESSOR_INDEX_SHIFT;
397 }
398 
399 #endif
400 
401 #ifdef __cplusplus
402 }
403 #endif
404 
405 #endif /* _RTEMS_SCORE_SPARC_H */
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.
void sparc_syscall_exit(uint32_t exitcode1, uint32_t exitcode2)
SPARC exit through system call 1.
#define RTEMS_COMPILER_NO_RETURN_ATTRIBUTE
The following macro is a compiler specific way to indicate that the method will NOT return to the cal...
Definition: basedefs.h:162