summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/cpu/sparc/sparc.h
blob: 3c5f0574f51832f020a47f29f07703d1082de10a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*  sparc.h
 *
 *  This include file contains information pertaining to the Motorola
 *  SPARC processor family.
 *
 *  $Id$
 */

#ifndef _INCLUDE_SPARC_h
#define _INCLUDE_SPARC_h

#ifdef __cplusplus
extern "C" {
#endif

/*
 *  The following define the CPU Family and Model within the family
 *
 *  NOTE: The string "REPLACE_THIS_WITH_THE_CPU_MODEL" is replaced
 *        with the name of the appropriate macro for this target CPU.
 */
 
#ifdef sparc
#undef sparc
#endif
#define sparc

#ifdef REPLACE_THIS_WITH_THE_CPU_MODEL
#undef REPLACE_THIS_WITH_THE_CPU_MODEL
#endif
#define REPLACE_THIS_WITH_THE_CPU_MODEL
 
#ifdef REPLACE_THIS_WITH_THE_BSP
#undef REPLACE_THIS_WITH_THE_BSP
#endif
#define REPLACE_THIS_WITH_THE_BSP

/*
 *  This file contains the information required to build
 *  RTEMS for a particular member of the "sparc"
 *  family when executing in protected mode.  It does
 *  this by setting variables to indicate which implementation
 *  dependent features are present in a particular member
 *  of the family.
 *
 *  Currently recognized feature flags:
 *
 *    + SPARC_HAS_FPU 
 *        0 - no HW FPU
 *        1 - has HW FPU (assumed to be compatible w/90C602)
 *
 *    + SPARC_HAS_BITSCAN 
 *        0 - does not have scan instructions
 *        1 - has scan instruction  (no support implemented)
 * 
 */
 
#if defined(erc32)
 
#define CPU_MODEL_NAME  "erc32"
#define SPARC_HAS_FPU     1
#define SPARC_HAS_BITSCAN 0
 
#else
 
#error "Unsupported CPU Model"
 
#endif

/*
 *  Define the name of the CPU family.
 */

#define CPU_NAME "SPARC"

/*
 *  Standard nop
 */

#define nop() \
  do { \
    asm volatile ( "nop" ); \
  } while ( 0 )

/*
 *  Some macros to aid in accessing special registers.
 */

#define sparc_get_psr( _psr ) \
  do { \
     (_psr) = 0; \
     asm volatile( "rd %%psr, %0" :  "=r" (_psr) : "0" (_psr) ); \
  } while ( 0 )

#define sparc_set_psr( _psr ) \
  do { \
    asm volatile ( "wr   %%g0,%0,%%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \
    nop(); nop(); nop(); \
  } while ( 0 )

#define sparc_get_tbr( _tbr ) \
  do { \
     asm volatile( "rd %%tbr, %0" :  "=r" (_tbr) : "0" (_tbr) ); \
  } while ( 0 )

#define sparc_set_tbr( _tbr ) \
  do { \
  } while ( 0 )

#define sparc_get_wim( _wim ) \
  do { \
     asm volatile( "rd %%wim, %0" :  "=r" (_wim) : "0" (_wim) ); \
  } while ( 0 )

#define sparc_set_wim( _wim ) \
  do { \
  } while ( 0 )

/*
 *  Manipulate the interrupt level in the psr 
 *
 */

#define SPARC_PIL_MASK  0x00000F00

#define sparc_disable_interrupts( _level ) \
  do { register unsigned int _mask = SPARC_PIL_MASK; \
    (_level) = 0; \
    \
    asm volatile ( "rd   %%psr,%0 ; \
                    wr   %0,%1,%%psr " \
                    : "=r" ((_level)), "=r" (_mask) \
                    : "0" ((_level)), "1" (_mask) \
    ); \
    nop(); nop(); nop(); \
  } while ( 0 )
 
#define sparc_enable_interrupts( _level ) \
  do { unsigned int _tmp; \
    sparc_get_psr( _tmp ); \
    _tmp &= ~SPARC_PIL_MASK; \
    _tmp |= (_level) & SPARC_PIL_MASK; \
    sparc_set_psr( _tmp ); \
  } while ( 0 ) 
  
 
#define sparc_flash_interrupts( _level ) \
  do { \
      register unsigned32 _ignored = 0; \
      sparc_enable_interrupts( (_level) ); \
      sparc_disable_interrupts( _ignored ); \
  } while ( 0 )

#define sparc_set_interrupt_level( _new_level ) \
  do { register unsigned32 _new_psr_level = 0; \
    \
    sparc_get_psr( _new_psr_level ); \
    _new_psr_level &= ~SPARC_PIL_MASK; \
    _new_psr_level |= (((_new_level) << 8) & SPARC_PIL_MASK); \
    sparc_set_psr( _new_psr_level ); \
  } while ( 0 )

#define sparc_get_interrupt_level( _level ) \
  do { \
    register unsigned32 _psr_level = 0; \
    \
    sparc_get_psr( _psr_level ); \
    (_level) = (_psr_level & SPARC_PIL_MASK) >> 8; \
  } while ( 0 )

#ifdef __cplusplus
}
#endif

#endif /* ! _INCLUDE_SPARC_h */
/* end of include file */