RTEMS
6.3
Toggle main menu visibility
Loading...
Searching...
No Matches
cpukit
score
cpu
sparc
include
rtems
score
sparc.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: BSD-2-Clause */
2
17
18
/*
19
* COPYRIGHT (c) 1989-2011.
20
* On-Line Applications Research Corporation (OAR).
21
*
22
* Redistribution and use in source and binary forms, with or without
23
* modification, are permitted provided that the following conditions
24
* are met:
25
* 1. Redistributions of source code must retain the above copyright
26
* notice, this list of conditions and the following disclaimer.
27
* 2. Redistributions in binary form must reproduce the above copyright
28
* notice, this list of conditions and the following disclaimer in the
29
* documentation and/or other materials provided with the distribution.
30
*
31
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
32
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
35
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
39
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41
* POSSIBILITY OF SUCH DAMAGE.
42
*/
43
44
#ifndef _RTEMS_SCORE_SPARC_H
45
#define _RTEMS_SCORE_SPARC_H
46
47
#include <
rtems/score/basedefs.h
>
48
49
#ifdef __cplusplus
50
extern
"C"
{
51
#endif
52
53
/*
54
*
55
* Currently recognized feature flags:
56
*
57
* + SPARC_HAS_FPU
58
* 0 - no HW FPU
59
* 1 - has HW FPU (assumed to be compatible w/90C602)
60
*
61
* + SPARC_HAS_BITSCAN
62
* 0 - does not have scan instructions
63
* 1 - has scan instruction (not currently implemented)
64
*
65
* + SPARC_NUMBER_OF_REGISTER_WINDOWS
66
* 8 is the most common number supported by SPARC implementations.
67
* SPARC_PSR_CWP_MASK is derived from this value.
68
*/
69
76
#define SPARC_HAS_BITSCAN 0
77
84
#define SPARC_NUMBER_OF_REGISTER_WINDOWS 8
85
90
#if defined(__FIX_LEON3FT_B2BST)
91
#define SPARC_LEON3FT_B2BST_NOP nop
92
#else
93
#define SPARC_LEON3FT_B2BST_NOP
94
#endif
95
101
#if defined(_SOFT_FLOAT)
102
#define SPARC_HAS_FPU 0
103
#else
104
#define SPARC_HAS_FPU 1
105
#endif
106
111
#if SPARC_HAS_FPU
112
#define CPU_MODEL_NAME "w/FPU"
113
#else
114
#define CPU_MODEL_NAME "w/soft-float"
115
#endif
116
120
#define CPU_NAME "SPARC"
121
122
/*
123
* Miscellaneous constants
124
*/
125
131
#if (SPARC_NUMBER_OF_REGISTER_WINDOWS == 8)
132
#define SPARC_PSR_CWP_MASK 0x07
/* bits 0 - 4 */
133
#elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 16)
134
#define SPARC_PSR_CWP_MASK 0x0F
/* bits 0 - 4 */
135
#elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 32)
136
#define SPARC_PSR_CWP_MASK 0x1F
/* bits 0 - 4 */
137
#else
138
#error "Unsupported number of register windows for this cpu"
139
#endif
140
142
#define SPARC_PSR_ET_MASK 0x00000020
/* bit 5 */
144
#define SPARC_PSR_PS_MASK 0x00000040
/* bit 6 */
146
#define SPARC_PSR_S_MASK 0x00000080
/* bit 7 */
148
#define SPARC_PSR_PIL_MASK 0x00000F00
/* bits 8 - 11 */
150
#define SPARC_PSR_EF_MASK 0x00001000
/* bit 12 */
152
#define SPARC_PSR_EC_MASK 0x00002000
/* bit 13 */
154
#define SPARC_PSR_ICC_MASK 0x00F00000
/* bits 20 - 23 */
156
#define SPARC_PSR_VER_MASK 0x0F000000
/* bits 24 - 27 */
158
#define SPARC_PSR_IMPL_MASK 0xF0000000
/* bits 28 - 31 */
159
161
#define SPARC_PSR_CWP_BIT_POSITION 0
/* bits 0 - 4 */
163
#define SPARC_PSR_ET_BIT_POSITION 5
/* bit 5 */
165
#define SPARC_PSR_PS_BIT_POSITION 6
/* bit 6 */
167
#define SPARC_PSR_S_BIT_POSITION 7
/* bit 7 */
169
#define SPARC_PSR_PIL_BIT_POSITION 8
/* bits 8 - 11 */
171
#define SPARC_PSR_EF_BIT_POSITION 12
/* bit 12 */
173
#define SPARC_PSR_EC_BIT_POSITION 13
/* bit 13 */
175
#define SPARC_PSR_ICC_BIT_POSITION 20
/* bits 20 - 23 */
177
#define SPARC_PSR_VER_BIT_POSITION 24
/* bits 24 - 27 */
179
#define SPARC_PSR_IMPL_BIT_POSITION 28
/* bits 28 - 31 */
180
181
#define LEON3_ASR17_PROCESSOR_INDEX_SHIFT 28
182
183
/* SPARC Software Trap number definitions */
184
#define SPARC_SWTRAP_SYSCALL 0
185
#define SPARC_SWTRAP_IRQDIS 9
186
#define SPARC_SWTRAP_IRQEN 10
187
#if SPARC_HAS_FPU == 1
188
#define SPARC_SWTRAP_IRQDIS_FP 11
189
#endif
190
195
#define SPARC_SYNCHRONOUS_TRAP_BIT_MASK 0x100
196
206
#define SPARC_ASYNCHRONOUS_TRAP( _vector ) ( _vector )
207
217
#define SPARC_SYNCHRONOUS_TRAP( _vector ) ( ( _vector ) + 256 )
218
228
#define SPARC_REAL_TRAP_NUMBER( _trap ) ( ( _trap ) % 256 )
229
243
#define SPARC_IS_INTERRUPT_TRAP( _trap ) \
244
( SPARC_REAL_TRAP_NUMBER( _trap ) >= 0x11 && \
245
SPARC_REAL_TRAP_NUMBER( _trap ) <= 0x1f )
246
261
#define SPARC_INTERRUPT_TRAP_TO_SOURCE( _trap ) \
262
( SPARC_REAL_TRAP_NUMBER( _trap ) - 0x10 )
263
273
#define SPARC_INTERRUPT_SOURCE_TO_TRAP( _source ) \
274
( SPARC_ASYNCHRONOUS_TRAP( _source ) + 0x10 )
275
276
#ifndef ASM
277
281
#define nop() \
282
do { \
283
__asm__ volatile ( "nop" ); \
284
} while ( 0 )
285
291
#if defined(RTEMS_PARAVIRT)
292
293
uint32_t _SPARC_Get_PSR(
void
);
294
295
#define sparc_get_psr( _psr ) \
296
(_psr) = _SPARC_Get_PSR()
297
298
#else
/* RTEMS_PARAVIRT */
299
300
#define sparc_get_psr( _psr ) \
301
do { \
302
(_psr) = 0; \
303
__asm__ volatile( "rd %%psr, %0" : "=r" (_psr) : "0" (_psr) ); \
304
} while ( 0 )
305
306
#endif
/* RTEMS_PARAVIRT */
307
313
#if defined(RTEMS_PARAVIRT)
314
315
void
_SPARC_Set_PSR( uint32_t new_psr );
316
317
#define sparc_set_psr( _psr ) \
318
_SPARC_Set_PSR( _psr )
319
320
#else
/* RTEMS_PARAVIRT */
321
322
#define sparc_set_psr( _psr ) \
323
do { \
324
__asm__ volatile ( "mov %0, %%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \
325
nop(); \
326
nop(); \
327
nop(); \
328
} while ( 0 )
329
330
#endif
/* RTEMS_PARAVIRT */
331
337
#if defined(RTEMS_PARAVIRT)
338
339
uint32_t _SPARC_Get_TBR(
void
);
340
341
#define sparc_get_tbr( _tbr ) \
342
(_tbr) = _SPARC_Get_TBR()
343
344
#else
/* RTEMS_PARAVIRT */
345
346
#define sparc_get_tbr( _tbr ) \
347
do { \
348
(_tbr) = 0;
/* to avoid unitialized warnings */
\
349
__asm__ volatile( "rd %%tbr, %0" : "=r" (_tbr) : "0" (_tbr) ); \
350
} while ( 0 )
351
352
#endif
/* RTEMS_PARAVIRT */
353
359
#if defined(RTEMS_PARAVIRT)
360
361
void
_SPARC_Set_TBR( uint32_t new_tbr );
362
363
#define sparc_set_tbr( _tbr ) \
364
_SPARC_Set_TBR((_tbr))
365
366
#else
/* RTEMS_PARAVIRT */
367
368
#define sparc_set_tbr( _tbr ) \
369
do { \
370
__asm__ volatile( "wr %0, 0, %%tbr" : "=r" (_tbr) : "0" (_tbr) ); \
371
} while ( 0 )
372
373
#endif
/* RTEMS_PARAVIRT */
374
380
#define sparc_get_wim( _wim ) \
381
do { \
382
__asm__ volatile( "rd %%wim, %0" : "=r" (_wim) : "0" (_wim) ); \
383
} while ( 0 )
384
390
#define sparc_set_wim( _wim ) \
391
do { \
392
__asm__ volatile( "wr %0, %%wim" : "=r" (_wim) : "0" (_wim) ); \
393
nop(); \
394
nop(); \
395
nop(); \
396
} while ( 0 )
397
403
#define sparc_get_y( _y ) \
404
do { \
405
__asm__ volatile( "rd %%y, %0" : "=r" (_y) : "0" (_y) ); \
406
} while ( 0 )
407
413
#define sparc_set_y( _y ) \
414
do { \
415
__asm__ volatile( "wr %0, %%y" : "=r" (_y) : "0" (_y) ); \
416
} while ( 0 )
417
425
static
inline
uint32_t sparc_disable_interrupts(
void
)
426
{
427
register
uint32_t psr __asm__(
"g1"
);
/* return value of trap handler */
428
#ifdef __FIX_LEON3FT_TN0018
429
__asm__
volatile
(
"ta %1\n\tnop\n\t"
:
"=r"
(psr) :
"i"
(SPARC_SWTRAP_IRQDIS));
430
#else
431
__asm__
volatile
(
"ta %1\n\t"
:
"=r"
(psr) :
"i"
(SPARC_SWTRAP_IRQDIS));
432
#endif
433
return
psr;
434
}
435
443
static
inline
void
sparc_enable_interrupts(uint32_t psr)
444
{
445
register
uint32_t _psr __asm__(
"g1"
) = psr;
/* input to trap handler */
446
447
/*
448
* The trap instruction has a higher trap priority than the interrupts
449
* according to "The SPARC Architecture Manual: Version 8", Table 7-1
450
* "Exception and Interrupt Request Priority and tt Values". Add a nop to
451
* prevent a trap instruction right after the interrupt enable trap.
452
*/
453
__asm__
volatile
(
"ta %0\nnop\n"
::
"i"
(SPARC_SWTRAP_IRQEN),
"r"
(_psr));
454
}
455
478
RTEMS_NO_RETURN
void
sparc_syscall_exit
(
479
uint32_t exitcode1,
480
uint32_t exitcode2
481
);
482
490
#define sparc_flash_interrupts( _psr ) \
491
do { \
492
sparc_enable_interrupts( (_psr) ); \
493
_psr = sparc_disable_interrupts(); \
494
} while ( 0 )
495
503
#define sparc_get_interrupt_level( _level ) \
504
do { \
505
uint32_t _psr_level = 0; \
506
\
507
sparc_get_psr( _psr_level ); \
508
(_level) = \
509
(_psr_level & SPARC_PSR_PIL_MASK) >> SPARC_PSR_PIL_BIT_POSITION; \
510
} while ( 0 )
511
512
static
inline
uint32_t _LEON3_Get_current_processor(
void
)
513
{
514
uint32_t asr17;
515
516
__asm__
volatile
(
517
"rd %%asr17, %0"
518
:
"=&r"
(asr17)
519
);
520
521
return
asr17 >> LEON3_ASR17_PROCESSOR_INDEX_SHIFT;
522
}
523
524
#endif
/* ASM */
525
526
#ifdef __cplusplus
527
}
528
#endif
529
530
#endif
/* _RTEMS_SCORE_SPARC_H */
basedefs.h
This header file provides basic definitions used by the API and the implementation.
RTEMS_NO_RETURN
#define RTEMS_NO_RETURN
Tells the compiler in a function declaration that this function does not return.
Definition
basedefs.h:386
sparc_syscall_exit
RTEMS_NO_RETURN void sparc_syscall_exit(uint32_t exitcode1, uint32_t exitcode2)
SPARC exit through system call 1.
Generated by
1.18.0