23 #ifndef _RTEMS_SCORE_SPARC_H 24 #define _RTEMS_SCORE_SPARC_H 26 #include <rtems/score/types.h> 55 #define SPARC_HAS_BITSCAN 0 63 #define SPARC_NUMBER_OF_REGISTER_WINDOWS 8 70 #if defined(_SOFT_FLOAT) 71 #define SPARC_HAS_FPU 0 73 #define SPARC_HAS_FPU 1 81 #define CPU_MODEL_NAME "w/FPU" 83 #define CPU_MODEL_NAME "w/soft-float" 89 #define CPU_NAME "SPARC" 100 #if (SPARC_NUMBER_OF_REGISTER_WINDOWS == 8) 101 #define SPARC_PSR_CWP_MASK 0x07 102 #elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 16) 103 #define SPARC_PSR_CWP_MASK 0x0F 104 #elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 32) 105 #define SPARC_PSR_CWP_MASK 0x1F 107 #error "Unsupported number of register windows for this cpu" 111 #define SPARC_PSR_ET_MASK 0x00000020 113 #define SPARC_PSR_PS_MASK 0x00000040 115 #define SPARC_PSR_S_MASK 0x00000080 117 #define SPARC_PSR_PIL_MASK 0x00000F00 119 #define SPARC_PSR_EF_MASK 0x00001000 121 #define SPARC_PSR_EC_MASK 0x00002000 123 #define SPARC_PSR_ICC_MASK 0x00F00000 125 #define SPARC_PSR_VER_MASK 0x0F000000 127 #define SPARC_PSR_IMPL_MASK 0xF0000000 130 #define SPARC_PSR_CWP_BIT_POSITION 0 132 #define SPARC_PSR_ET_BIT_POSITION 5 134 #define SPARC_PSR_PS_BIT_POSITION 6 136 #define SPARC_PSR_S_BIT_POSITION 7 138 #define SPARC_PSR_PIL_BIT_POSITION 8 140 #define SPARC_PSR_EF_BIT_POSITION 12 142 #define SPARC_PSR_EC_BIT_POSITION 13 144 #define SPARC_PSR_ICC_BIT_POSITION 20 146 #define SPARC_PSR_VER_BIT_POSITION 24 148 #define SPARC_PSR_IMPL_BIT_POSITION 28 150 #define LEON3_ASR17_PROCESSOR_INDEX_SHIFT 28 153 #define SPARC_SWTRAP_SYSCALL 0 154 #define SPARC_SWTRAP_IRQDIS 9 155 #define SPARC_SWTRAP_IRQEN 10 164 __asm__ volatile ( "nop" ); \ 172 #if defined(RTEMS_PARAVIRT) 174 uint32_t _SPARC_Get_PSR(
void );
176 #define sparc_get_psr( _psr ) \ 177 (_psr) = _SPARC_Get_PSR() 181 #define sparc_get_psr( _psr ) \ 184 __asm__ volatile( "rd %%psr, %0" : "=r" (_psr) : "0" (_psr) ); \ 194 #if defined(RTEMS_PARAVIRT) 196 void _SPARC_Set_PSR( uint32_t new_psr );
198 #define sparc_set_psr( _psr ) \ 199 _SPARC_Set_PSR( _psr ) 203 #define sparc_set_psr( _psr ) \ 205 __asm__ volatile ( "mov %0, %%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \ 218 #if defined(RTEMS_PARAVIRT) 220 uint32_t _SPARC_Get_TBR(
void );
222 #define sparc_get_tbr( _tbr ) \ 223 (_tbr) = _SPARC_Get_TBR() 227 #define sparc_get_tbr( _tbr ) \ 230 __asm__ volatile( "rd %%tbr, %0" : "=r" (_tbr) : "0" (_tbr) ); \ 240 #if defined(RTEMS_PARAVIRT) 242 void _SPARC_Set_TBR( uint32_t new_tbr );
244 #define sparc_set_tbr( _tbr ) \ 245 _SPARC_Set_TBR((_tbr)) 249 #define sparc_set_tbr( _tbr ) \ 251 __asm__ volatile( "wr %0, 0, %%tbr" : "=r" (_tbr) : "0" (_tbr) ); \ 261 #define sparc_get_wim( _wim ) \ 263 __asm__ volatile( "rd %%wim, %0" : "=r" (_wim) : "0" (_wim) ); \ 271 #define sparc_set_wim( _wim ) \ 273 __asm__ volatile( "wr %0, %%wim" : "=r" (_wim) : "0" (_wim) ); \ 284 #define sparc_get_y( _y ) \ 286 __asm__ volatile( "rd %%y, %0" : "=r" (_y) : "0" (_y) ); \ 294 #define sparc_set_y( _y ) \ 296 __asm__ volatile( "wr %0, %%y" : "=r" (_y) : "0" (_y) ); \ 306 static inline uint32_t sparc_disable_interrupts(
void)
308 register uint32_t psr
__asm__(
"g1");
309 __asm__
volatile (
"ta %1\n\t" :
"=r" (psr) :
"i" (SPARC_SWTRAP_IRQDIS));
320 static inline void sparc_enable_interrupts(uint32_t psr)
322 register uint32_t _psr
__asm__(
"g1") = psr;
330 __asm__ volatile (
"ta %0\nnop\n" ::
"i" (SPARC_SWTRAP_IRQEN),
"r" (_psr));
365 #define sparc_flash_interrupts( _psr ) \ 367 sparc_enable_interrupts( (_psr) ); \ 368 _psr = sparc_disable_interrupts(); \ 378 #define sparc_get_interrupt_level( _level ) \ 380 register uint32_t _psr_level = 0; \ 382 sparc_get_psr( _psr_level ); \ 384 (_psr_level & SPARC_PSR_PIL_MASK) >> SPARC_PSR_PIL_BIT_POSITION; \ 387 static inline uint32_t _LEON3_Get_current_processor(
void )
396 return asr17 >> LEON3_ASR17_PROCESSOR_INDEX_SHIFT;
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