source: rtems/cpukit/score/cpu/nios2/include/rtems/score/cpu.h @ 27bbc05

5
Last change on this file since 27bbc05 was 27bbc05, checked in by Sebastian Huber <sebastian.huber@…>, on 08/02/18 at 12:49:01

score: Remove CPU_PARTITION_ALIGNMENT

Use the CPU_SIZEOF_POINTER alignment instead. The internal alignment
requirement is defined by the use of Chain_Node (consisting of two
pointers) to manage the free chain of partitions.

It seems that previously the condition

CPU_PARTITION_ALIGNMENT >= sizeof(Chain_Node)

was true on all CPU ports. Now, we need an additional check.

Update #3482.

  • Property mode set to 100644
File size: 9.4 KB
RevLine 
[4f5740f]1/**
2 * @file
3 *
4 * @brief Altera Nios II CPU Department Source
5 */
6
[7a28ac8]7/*
[2a5880f1]8 *  Copyright (c) 2011 embedded brains GmbH
[7a28ac8]9 *
[2a5880f1]10 *  Copyright (c) 2006 Kolja Waschk (rtemsdev/ixo.de)
[80f7732]11 *
[2a5880f1]12 *  COPYRIGHT (c) 1989-2004.
[7a28ac8]13 *  On-Line Applications Research Corporation (OAR).
14 *
15 *  The license and distribution terms for this file may be
16 *  found in the file LICENSE in this distribution or at
[c499856]17 *  http://www.rtems.org/license/LICENSE.
[7a28ac8]18 */
19
20#ifndef _RTEMS_SCORE_CPU_H
21#define _RTEMS_SCORE_CPU_H
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
[00acca28]27#include <rtems/score/basedefs.h>
[89b85e51]28#include <rtems/score/nios2.h>
[7a28ac8]29
30#define CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
31
[2a5880f1]32#define CPU_INTERRUPT_NUMBER_OF_VECTORS 32
33
34#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
35
[e2d0c68]36#define CPU_PROVIDES_ISR_IS_IN_PROGRESS TRUE
[2a5880f1]37
[8b94c03]38#define CPU_ISR_PASSES_FRAME_POINTER FALSE
[7a28ac8]39
[2a5880f1]40#define CPU_HARDWARE_FP FALSE
[7a28ac8]41
[2a5880f1]42#define CPU_SOFTWARE_FP FALSE
[7a28ac8]43
[2a5880f1]44#define CPU_CONTEXT_FP_SIZE 0
[7a28ac8]45
[2a5880f1]46#define CPU_ALL_TASKS_ARE_FP FALSE
[7a28ac8]47
[2a5880f1]48#define CPU_IDLE_TASK_IS_FP FALSE
[7a28ac8]49
[2a5880f1]50#define CPU_USE_DEFERRED_FP_SWITCH FALSE
[7a28ac8]51
[84e6f15]52#define CPU_ENABLE_ROBUST_THREAD_DISPATCH FALSE
53
[2a5880f1]54#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
[7a28ac8]55
[2a5880f1]56#define CPU_STACK_GROWS_UP FALSE
57
[a8865f8]58/* FIXME: Is this the right value? */
59#define CPU_CACHE_LINE_BYTES 32
60
61#define CPU_STRUCTURE_ALIGNMENT \
62  RTEMS_SECTION( ".sdata" ) RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
[7a28ac8]63
[2a5880f1]64#define CPU_STACK_MINIMUM_SIZE (4 * 1024)
[7a28ac8]65
[f1738ed]66#define CPU_SIZEOF_POINTER 4
67
[7a28ac8]68/*
[2a5880f1]69 * Alignment value according to "Nios II Processor Reference" chapter 7
70 * "Application Binary Interface" section "Memory Alignment".
[7a28ac8]71 */
[2a5880f1]72#define CPU_ALIGNMENT 4
[7a28ac8]73
[2a5880f1]74#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
[7a28ac8]75
[e2d0c68]76/*
77 * Alignment value according to "Nios II Processor Reference" chapter 7
78 * "Application Binary Interface" section "Stacks".
79 */
80#define CPU_STACK_ALIGNMENT 4
[2a5880f1]81
[c8df844]82#define CPU_INTERRUPT_STACK_ALIGNMENT CPU_CACHE_LINE_BYTES
83
[e2d0c68]84/*
85 * A Nios II configuration with an external interrupt controller (EIC) supports
86 * up to 64 interrupt levels.  A Nios II configuration with an internal
87 * interrupt controller (IIC) has only two interrupt levels (enabled and
88 * disabled).  The _CPU_ISR_Get_level() and _CPU_ISR_Set_level() functions will
89 * take care about configuration specific mappings.
90 */
91#define CPU_MODES_INTERRUPT_MASK 0x3f
[2a5880f1]92
93#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
94
95#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
[10fd4aac]96
[decff899]97#define CPU_MAXIMUM_PROCESSORS 32
98
[2a5880f1]99#ifndef ASM
[7a28ac8]100
101/**
[40ae1fd]102 * @brief Thread register context.
103 *
104 * The thread register context covers the non-volatile registers, the thread
105 * stack pointer, the return address, and the processor status.
106 *
107 * There is no need to save the global pointer (gp) since it is a system wide
108 * constant and set-up with the C runtime environment.
[e2d0c68]109 *
110 * The @a thread_dispatch_disabled field is used for the external interrupt
111 * controller (EIC) support.
112 *
113 * @see _Nios2_Thread_dispatch_disabled
[7a28ac8]114 */
115typedef struct {
[40ae1fd]116  uint32_t r16;
117  uint32_t r17;
118  uint32_t r18;
119  uint32_t r19;
120  uint32_t r20;
121  uint32_t r21;
122  uint32_t r22;
123  uint32_t r23;
124  uint32_t fp;
[e2d0c68]125  uint32_t status;
[40ae1fd]126  uint32_t sp;
127  uint32_t ra;
[e2d0c68]128  uint32_t thread_dispatch_disabled;
[9f1412b9]129  uint32_t stack_mpubase;
130  uint32_t stack_mpuacc;
[7a28ac8]131} Context_Control;
132
133#define _CPU_Context_Get_SP( _context ) \
134  (_context)->sp
135
[8b94c03]136typedef void CPU_Interrupt_frame;
[7a28ac8]137
138typedef struct {
[2a5880f1]139  uint32_t r1;
140  uint32_t r2;
141  uint32_t r3;
142  uint32_t r4;
143  uint32_t r5;
144  uint32_t r6;
145  uint32_t r7;
146  uint32_t r8;
147  uint32_t r9;
148  uint32_t r10;
149  uint32_t r11;
150  uint32_t r12;
151  uint32_t r13;
152  uint32_t r14;
153  uint32_t r15;
154  uint32_t r16;
155  uint32_t r17;
156  uint32_t r18;
157  uint32_t r19;
158  uint32_t r20;
159  uint32_t r21;
160  uint32_t r22;
161  uint32_t r23;
162  uint32_t gp;
163  uint32_t fp;
164  uint32_t sp;
165  uint32_t ra;
166  uint32_t et;
167  uint32_t ea;
168  uint32_t status;
169  uint32_t ienable;
170  uint32_t ipending;
[7a28ac8]171} CPU_Exception_frame;
172
[03b7789]173#define _CPU_Initialize_vectors()
[a385489]174
175/**
[e2d0c68]176 * @brief Macro to disable interrupts.
177 *
178 * The processor status before disabling the interrupts will be stored in
179 * @a _isr_cookie.  This value will be used in _CPU_ISR_Flash() and
180 * _CPU_ISR_Enable().
181 *
182 * The global symbol _Nios2_ISR_Status_mask will be used to clear the bits in
183 * the status register representing the interrupt level.  The global symbol
184 * _Nios2_ISR_Status_bits will be used to set the bits representing an
185 * interrupt level that disables interrupts.  Both global symbols must be
186 * provided by the board support package.
187 *
188 * In case the Nios II uses the internal interrupt controller (IIC), then only
189 * the PIE status bit is used.
190 *
191 * In case the Nios II uses the external interrupt controller (EIC), then the
192 * RSIE status bit or the IL status field is used depending on the interrupt
193 * handling variant and the shadow register usage.
[a385489]194 */
[7a28ac8]195#define _CPU_ISR_Disable( _isr_cookie ) \
[2a5880f1]196  do { \
[e2d0c68]197    int _tmp; \
198    __asm__ volatile ( \
199      "rdctl %0, status\n" \
200      "movhi %1, %%hiadj(_Nios2_ISR_Status_mask)\n" \
201      "addi %1, %1, %%lo(_Nios2_ISR_Status_mask)\n" \
202      "and %1, %0, %1\n" \
203      "ori %1, %1, %%lo(_Nios2_ISR_Status_bits)\n" \
204      "wrctl status, %1" \
205      : "=&r" (_isr_cookie), "=&r" (_tmp) \
206    ); \
[2a5880f1]207  } while ( 0 )
[7a28ac8]208
[a385489]209/**
[e2d0c68]210 * @brief Macro to restore the processor status.
211 *
212 * The @a _isr_cookie must contain the processor status returned by
213 * _CPU_ISR_Disable().  The value is not modified.
[a385489]214 */
[2a5880f1]215#define _CPU_ISR_Enable( _isr_cookie ) \
[e2d0c68]216  __builtin_wrctl( 0, (int) _isr_cookie )
[7a28ac8]217
[a385489]218/**
[e2d0c68]219 * @brief Macro to restore the processor status and disable the interrupts
220 * again.
221 *
222 * The @a _isr_cookie must contain the processor status returned by
223 * _CPU_ISR_Disable().  The value is not modified.
224 *
225 * This flash code is optimal for all Nios II configurations.  The rdctl does
[4f5740f]226 * not flush the pipeline and has only a late result penalty.  The wrctl on
227 * the other hand leads to a pipeline flush.
[a385489]228 */
[7a28ac8]229#define _CPU_ISR_Flash( _isr_cookie ) \
[2a5880f1]230  do { \
[e2d0c68]231    int _status = __builtin_rdctl( 0 ); \
[2a5880f1]232    __builtin_wrctl( 0, (int) _isr_cookie ); \
[e2d0c68]233    __builtin_wrctl( 0, _status ); \
[2a5880f1]234  } while ( 0 )
[7a28ac8]235
[408609f6]236bool _CPU_ISR_Is_enabled( uint32_t level );
237
[a385489]238/**
[e2d0c68]239 * @brief Sets the interrupt level for the executing thread.
240 *
241 * The valid values of @a new_level depend on the Nios II configuration.  A
242 * value of zero represents enabled interrupts in all configurations.
243 *
244 * @see _CPU_ISR_Get_level()
[a385489]245 */
[e2d0c68]246void _CPU_ISR_Set_level( uint32_t new_level );
[7a28ac8]247
[a385489]248/**
[e2d0c68]249 * @brief Returns the interrupt level of the executing thread.
[a385489]250 *
[e2d0c68]251 * @retval 0 Interrupts are enabled.
252 * @retval otherwise The value depends on the Nios II configuration.  In case
253 * of an internal interrupt controller (IIC) the only valid value is one which
254 * indicates disabled interrupts.  In case of an external interrupt controller
255 * (EIC) there are two possibilities.  Firstly if the RSIE status bit is used
256 * to disable interrupts, then one is the only valid value indicating disabled
257 * interrupts.  Secondly if the IL status field is used to disable interrupts,
258 * then this value will be returned.  Interrupts are disabled at the maximum
259 * level specified by the _Nios2_ISR_Status_bits.
[a385489]260 */
[2a5880f1]261uint32_t _CPU_ISR_Get_level( void );
[7a28ac8]262
[a385489]263/**
[e2d0c68]264 * @brief Initializes the CPU context.
[43e0599]265 *
[e2d0c68]266 * The following steps are performed:
[a385489]267 *  - setting a starting address
268 *  - preparing the stack
269 *  - preparing the stack and frame pointers
270 *  - setting the proper interrupt level in the context
271 *
[e2d0c68]272 * @param[in] context points to the context area
273 * @param[in] stack_area_begin is the low address of the allocated stack area
274 * @param[in] stack_area_size is the size of the stack area in bytes
[a385489]275 * @param[in] new_level is the interrupt level for the task
276 * @param[in] entry_point is the task's entry point
[e2d0c68]277 * @param[in] is_fp is set to @c true if the task is a floating point task
[022851a]278 * @param[in] tls_area is the thread-local storage (TLS) area
[7a28ac8]279 */
[a385489]280void _CPU_Context_Initialize(
[e2d0c68]281  Context_Control *context,
282  void *stack_area_begin,
283  size_t stack_area_size,
284  uint32_t new_level,
285  void (*entry_point)( void ),
[022851a]286  bool is_fp,
287  void *tls_area
[a385489]288);
[7a28ac8]289
290#define _CPU_Context_Restart_self( _the_context ) \
[2a5880f1]291  _CPU_Context_restore( (_the_context) );
[7a28ac8]292
[f82752a4]293void _CPU_Fatal_halt( uint32_t _source, uint32_t _error )
[143696a]294  RTEMS_NO_RETURN;
[7a28ac8]295
[43e0599]296/**
[4f5740f]297 * @brief CPU initialization.
[43e0599]298 */
[2a5880f1]299void _CPU_Initialize( void );
[7a28ac8]300
[43e0599]301/**
[4f5740f]302 * @brief CPU ISR install raw handler.
[43e0599]303 */
[7a28ac8]304void _CPU_ISR_install_raw_handler(
[2a5880f1]305  uint32_t vector,
306  proc_ptr new_handler,
307  proc_ptr *old_handler
[7a28ac8]308);
309
[43e0599]310/**
[4f5740f]311 * @brief CPU ISR install vector.
[43e0599]312 */
[7a28ac8]313void _CPU_ISR_install_vector(
[2a5880f1]314  uint32_t vector,
315  proc_ptr new_handler,
316  proc_ptr *old_handler
[7a28ac8]317);
318
[2a5880f1]319void _CPU_Context_switch( Context_Control *run, Context_Control *heir );
[7a28ac8]320
321void _CPU_Context_restore(
322  Context_Control *new_context
[143696a]323) RTEMS_NO_RETURN;
[7a28ac8]324
[815994f]325void _CPU_Exception_frame_print( const CPU_Exception_frame *frame );
326
[2a5880f1]327static inline uint32_t CPU_swap_u32( uint32_t value )
[7a28ac8]328{
[2a5880f1]329  uint32_t byte1, byte2, byte3, byte4, swapped;
[80f7732]330
[7a28ac8]331  byte4 = (value >> 24) & 0xff;
332  byte3 = (value >> 16) & 0xff;
333  byte2 = (value >> 8)  & 0xff;
334  byte1 =  value        & 0xff;
[80f7732]335
[7a28ac8]336  swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
[2a5880f1]337
338  return swapped;
[7a28ac8]339}
340
341#define CPU_swap_u16( value ) \
342  (((value&0xff) << 8) | ((value >> 8)&0xff))
343
[24bf11e]344typedef uint32_t CPU_Counter_ticks;
345
[65f868c]346uint32_t _CPU_Counter_frequency( void );
347
[24bf11e]348CPU_Counter_ticks _CPU_Counter_read( void );
349
350static inline CPU_Counter_ticks _CPU_Counter_difference(
351  CPU_Counter_ticks second,
352  CPU_Counter_ticks first
353)
354{
355  return second - first;
356}
357
[00acca28]358/** Type that can store a 32-bit integer or a pointer. */
359typedef uintptr_t CPU_Uint32ptr;
360
[2a5880f1]361#endif /* ASM */
362
[7a28ac8]363#ifdef __cplusplus
364}
365#endif
366
367#endif
Note: See TracBrowser for help on using the repository browser.