source: rtems/cpukit/score/cpu/sparc/include/rtems/score/cpuimpl.h @ d0dd98c

Last change on this file since d0dd98c was d0dd98c, checked in by Sebastian Huber <sebastian.huber@…>, on 03/15/23 at 07:55:12

sparc: Add header files to Doxygen group

  • Property mode set to 100644
File size: 9.7 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSScoreCPUSPARC
7 *
8 * @brief This header file defines implementation interfaces pertaining to the
9 *   port of the executive to the SPARC processor.
10 */
11
12/*
13 * Copyright (c) 1989, 2007 On-Line Applications Research Corporation (OAR)
14 * Copyright (c) 2013, 2016 embedded brains GmbH
15 *
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 * 1. Redistributions of source code must retain the above copyright
20 *    notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 *    notice, this list of conditions and the following disclaimer in the
23 *    documentation and/or other materials provided with the distribution.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef _RTEMS_SCORE_CPUIMPL_H
39#define _RTEMS_SCORE_CPUIMPL_H
40
41#include <rtems/score/cpu.h>
42
43/**
44 * @defgroup RTEMSScoreCPUSPARC SPARC
45 *
46 * @ingroup RTEMSScoreCPU
47 *
48 * @brief SPARC Architecture Support
49 *
50 * @{
51 */
52
53/** This defines the size of the minimum stack frame. */
54#define SPARC_MINIMUM_STACK_FRAME_SIZE 0x60
55
56/*
57 *  Offsets of fields with CPU_Interrupt_frame for assembly routines.
58 */
59
60/** This macro defines an offset into the ISF for use in assembly. */
61#define ISF_PSR_OFFSET         SPARC_MINIMUM_STACK_FRAME_SIZE + 0x00
62/** This macro defines an offset into the ISF for use in assembly. */
63#define ISF_PC_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x04
64/** This macro defines an offset into the ISF for use in assembly. */
65#define ISF_NPC_OFFSET         SPARC_MINIMUM_STACK_FRAME_SIZE + 0x08
66/** This macro defines an offset into the ISF for use in assembly. */
67#define ISF_G1_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x0c
68/** This macro defines an offset into the ISF for use in assembly. */
69#define ISF_G2_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x10
70/** This macro defines an offset into the ISF for use in assembly. */
71#define ISF_G3_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x14
72/** This macro defines an offset into the ISF for use in assembly. */
73#define ISF_G4_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x18
74/** This macro defines an offset into the ISF for use in assembly. */
75#define ISF_G5_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x1c
76/** This macro defines an offset into the ISF for use in assembly. */
77#define ISF_G7_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x24
78/** This macro defines an offset into the ISF for use in assembly. */
79#define ISF_I0_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x28
80/** This macro defines an offset into the ISF for use in assembly. */
81#define ISF_I1_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x2c
82/** This macro defines an offset into the ISF for use in assembly. */
83#define ISF_I2_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x30
84/** This macro defines an offset into the ISF for use in assembly. */
85#define ISF_I3_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x34
86/** This macro defines an offset into the ISF for use in assembly. */
87#define ISF_I4_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x38
88/** This macro defines an offset into the ISF for use in assembly. */
89#define ISF_I5_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x3c
90/** This macro defines an offset into the ISF for use in assembly. */
91#define ISF_I6_FP_OFFSET       SPARC_MINIMUM_STACK_FRAME_SIZE + 0x40
92/** This macro defines an offset into the ISF for use in assembly. */
93#define ISF_I7_OFFSET          SPARC_MINIMUM_STACK_FRAME_SIZE + 0x44
94/** This macro defines an offset into the ISF for use in assembly. */
95#define ISF_Y_OFFSET           SPARC_MINIMUM_STACK_FRAME_SIZE + 0x48
96/** This macro defines an offset into the ISF for use in assembly. */
97#define ISF_TPC_OFFSET         SPARC_MINIMUM_STACK_FRAME_SIZE + 0x4c
98
99/** This defines the size of the ISF area for use in assembly. */
100#define CPU_INTERRUPT_FRAME_SIZE SPARC_MINIMUM_STACK_FRAME_SIZE + 0x50
101
102#define SPARC_FP_CONTEXT_OFFSET_F0_F1 0
103#define SPARC_FP_CONTEXT_OFFSET_F2_F3 8
104#define SPARC_FP_CONTEXT_OFFSET_F4_F5 16
105#define SPARC_FP_CONTEXT_OFFSET_F6_F7 24
106#define SPARC_FP_CONTEXT_OFFSET_F8_F9 32
107#define SPARC_FP_CONTEXT_OFFSET_F10_F11 40
108#define SPARC_FP_CONTEXT_OFFSET_F12_F13 48
109#define SPARC_FP_CONTEXT_OFFSET_F14_F15 56
110#define SPARC_FP_CONTEXT_OFFSET_F16_F17 64
111#define SPARC_FP_CONTEXT_OFFSET_F18_F19 72
112#define SPARC_FP_CONTEXT_OFFSET_F20_F21 80
113#define SPARC_FP_CONTEXT_OFFSET_F22_F23 88
114#define SPARC_FP_CONTEXT_OFFSET_F24_F25 96
115#define SPARC_FP_CONTEXT_OFFSET_F26_F27 104
116#define SPARC_FP_CONTEXT_OFFSET_F28_F29 112
117#define SPARC_FP_CONTEXT_OFFSET_F30_F31 120
118#define SPARC_FP_CONTEXT_OFFSET_FSR 128
119
120#if ( SPARC_HAS_FPU == 1 )
121  #define CPU_PER_CPU_CONTROL_SIZE 8
122#else
123  #define CPU_PER_CPU_CONTROL_SIZE 0
124#endif
125
126#define CPU_THREAD_LOCAL_STORAGE_VARIANT 20
127
128#if ( SPARC_HAS_FPU == 1 )
129  /**
130   * @brief Offset of the CPU_Per_CPU_control::fsr field relative to the
131   * Per_CPU_Control begin.
132   */
133  #define SPARC_PER_CPU_FSR_OFFSET 0
134
135  #if defined(SPARC_USE_LAZY_FP_SWITCH)
136    /**
137     * @brief Offset of the CPU_Per_CPU_control::fp_owner field relative to the
138     * Per_CPU_Control begin.
139     */
140    #define SPARC_PER_CPU_FP_OWNER_OFFSET 4
141  #endif
142#endif
143
144#define SPARC_REGISTER_WINDOW_OFFSET_LOCAL( i ) ( ( i ) * 4 )
145#define SPARC_REGISTER_WINDOW_OFFSET_INPUT( i ) ( ( i ) * 4 + 32 )
146#define SPARC_REGISTER_WINDOW_SIZE 64
147
148#define SPARC_EXCEPTION_OFFSET_PSR 0
149#define SPARC_EXCEPTION_OFFSET_PC 4
150#define SPARC_EXCEPTION_OFFSET_NPC 8
151#define SPARC_EXCEPTION_OFFSET_TRAP 12
152#define SPARC_EXCEPTION_OFFSET_WIM 16
153#define SPARC_EXCEPTION_OFFSET_Y 20
154#define SPARC_EXCEPTION_OFFSET_GLOBAL( i ) ( ( i ) * 4 + 24 )
155#define SPARC_EXCEPTION_OFFSET_OUTPUT( i ) ( ( i ) * 4 + 56 )
156#define SPARC_EXCEPTION_OFFSET_WINDOWS( i ) ( ( i ) * 64 + 88 )
157
158#if SPARC_HAS_FPU == 1
159#define SPARC_EXCEPTION_OFFSET_FSR 536
160#define SPARC_EXCEPTION_OFFSET_FP( i ) ( ( i ) * 8 + 544 )
161#define SPARC_EXCEPTION_FRAME_SIZE 672
162#else
163#define SPARC_EXCEPTION_FRAME_SIZE 536
164#endif
165
166#if defined(SPARC_USE_SYNCHRONOUS_FP_SWITCH)
167#define SPARC_FP_FRAME_OFFSET_FO_F1 (SPARC_MINIMUM_STACK_FRAME_SIZE + 0)
168#define SPARC_FP_FRAME_OFFSET_F2_F3 (SPARC_FP_FRAME_OFFSET_FO_F1 + 8)
169#define SPARC_FP_FRAME_OFFSET_F4_F5 (SPARC_FP_FRAME_OFFSET_F2_F3 + 8)
170#define SPARC_FP_FRAME_OFFSET_F6_F7 (SPARC_FP_FRAME_OFFSET_F4_F5 + 8)
171#define SPARC_FP_FRAME_OFFSET_F8_F9 (SPARC_FP_FRAME_OFFSET_F6_F7 + 8)
172#define SPARC_FP_FRAME_OFFSET_F1O_F11 (SPARC_FP_FRAME_OFFSET_F8_F9 + 8)
173#define SPARC_FP_FRAME_OFFSET_F12_F13 (SPARC_FP_FRAME_OFFSET_F1O_F11 + 8)
174#define SPARC_FP_FRAME_OFFSET_F14_F15 (SPARC_FP_FRAME_OFFSET_F12_F13 + 8)
175#define SPARC_FP_FRAME_OFFSET_F16_F17 (SPARC_FP_FRAME_OFFSET_F14_F15 + 8)
176#define SPARC_FP_FRAME_OFFSET_F18_F19 (SPARC_FP_FRAME_OFFSET_F16_F17 + 8)
177#define SPARC_FP_FRAME_OFFSET_F2O_F21 (SPARC_FP_FRAME_OFFSET_F18_F19 + 8)
178#define SPARC_FP_FRAME_OFFSET_F22_F23 (SPARC_FP_FRAME_OFFSET_F2O_F21 + 8)
179#define SPARC_FP_FRAME_OFFSET_F24_F25 (SPARC_FP_FRAME_OFFSET_F22_F23 + 8)
180#define SPARC_FP_FRAME_OFFSET_F26_F27 (SPARC_FP_FRAME_OFFSET_F24_F25 + 8)
181#define SPARC_FP_FRAME_OFFSET_F28_F29 (SPARC_FP_FRAME_OFFSET_F26_F27 + 8)
182#define SPARC_FP_FRAME_OFFSET_F3O_F31 (SPARC_FP_FRAME_OFFSET_F28_F29 + 8)
183#define SPARC_FP_FRAME_OFFSET_FSR (SPARC_FP_FRAME_OFFSET_F3O_F31 + 8)
184#define SPARC_FP_FRAME_SIZE (SPARC_FP_FRAME_OFFSET_FSR + 8)
185#endif
186
187#ifndef ASM
188
189#ifdef __cplusplus
190extern "C" {
191#endif
192
193typedef struct {
194#if ( SPARC_HAS_FPU == 1 )
195  /**
196   * @brief Memory location to store the FSR register during interrupt
197   * processing.
198   *
199   * This is a write-only field.  The FSR is written to force a completion of
200   * floating point operations in progress.
201   */
202  uint32_t fsr;
203
204#if defined(SPARC_USE_LAZY_FP_SWITCH)
205  /**
206   * @brief The current floating point owner.
207   */
208  struct _Thread_Control *fp_owner;
209#else
210  /* See Per_CPU_Control::Interrupt_frame */
211  uint32_t reserved_for_alignment_of_interrupt_frame;
212#endif
213#endif
214} CPU_Per_CPU_control;
215
216/**
217 * @brief The pointer to the current per-CPU control is available via register
218 * g6.
219 */
220register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__( "g6" );
221
222#define _CPU_Get_current_per_CPU_control() _SPARC_Per_CPU_current
223
224#define _CPU_Get_thread_executing() ( _SPARC_Per_CPU_current->executing )
225
226RTEMS_NO_RETURN void _CPU_Fatal_halt( uint32_t source, CPU_Uint32ptr error );
227
228void _CPU_Context_volatile_clobber( uintptr_t pattern );
229
230void _CPU_Context_validate( uintptr_t pattern );
231
232static inline void _CPU_Instruction_illegal( void )
233{
234  __asm__ volatile ( "unimp 0" );
235}
236
237static inline void _CPU_Instruction_no_operation( void )
238{
239  __asm__ volatile ( "nop" );
240}
241
242static inline void _CPU_Use_thread_local_storage(
243  const Context_Control *context
244)
245{
246   register uint32_t g7 __asm__( "g7" );
247
248   g7 = context->g7;
249
250   /* Make sure that the register assignment is not optimized away */
251   __asm__ volatile ( "" : : "r" ( g7 ) );
252}
253
254#ifdef __cplusplus
255}
256#endif
257
258#endif /* ASM */
259
260/** @} */
261
262#endif /* _RTEMS_SCORE_CPUIMPL_H */
Note: See TracBrowser for help on using the repository browser.