source: rtems/cpukit/score/src/isr.c @ 03b7789

4.11
Last change on this file since 03b7789 was 03b7789, checked in by Sebastian Huber <sebastian.huber@…>, on Apr 26, 2014 at 1:09:10 PM

score: Statically initialize _ISR_Vector_table

  • Property mode set to 100644
File size: 2.5 KB
Line 
1/**
2 *  @file
3 *
4 *  @brief Initialize the ISR handler
5 *  @ingroup ScoreISR
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2012.
10 *  On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/score/isr.h>
22#include <rtems/score/address.h>
23#include <rtems/score/interr.h>
24#include <rtems/score/percpu.h>
25#include <rtems/score/stackimpl.h>
26#include <rtems/score/wkspace.h>
27#include <rtems/config.h>
28
29#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
30  ISR_Handler_entry _ISR_Vector_table[ CPU_INTERRUPT_NUMBER_OF_VECTORS ];
31#elif defined(CPU_INTERRUPT_NUMBER_OF_VECTORS)
32  #error "CPU_INTERRUPT_NUMBER_OF_VECTORS is defined for non-simple vectored interrupts"
33#elif defined(CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER)
34  #error "CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER is defined for non-simple vectored interrupts"
35#endif
36
37void _ISR_Handler_initialization( void )
38{
39  _ISR_Nest_level = 0;
40
41#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
42  _CPU_Initialize_vectors();
43#endif
44
45#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
46  {
47    size_t stack_size = rtems_configuration_get_interrupt_stack_size();
48    uint32_t cpu_max = rtems_configuration_get_maximum_processors();
49    uint32_t cpu_index;
50
51    if ( !_Stack_Is_enough( stack_size ) )
52      _Terminate(
53        INTERNAL_ERROR_CORE,
54        true,
55        INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
56      );
57
58    for ( cpu_index = 0 ; cpu_index < cpu_max; ++cpu_index ) {
59      Per_CPU_Control *cpu = _Per_CPU_Get_by_index( cpu_index );
60      void *low = _Workspace_Allocate_or_fatal_error( stack_size );
61      void *high = _Addresses_Add_offset( low, stack_size );
62
63#if (CPU_STACK_ALIGNMENT != 0)
64      high = _Addresses_Align_down( high, CPU_STACK_ALIGNMENT );
65#endif
66
67      cpu->interrupt_stack_low = low;
68      cpu->interrupt_stack_high = high;
69
70      /*
71       * Interrupt stack might have to be aligned and/or setup in a specific
72       * way.  Do not use the local low or high variables here since
73       * _CPU_Interrupt_stack_setup() is a nasty macro that might want to play
74       * with the real memory locations.
75       */
76#if defined(_CPU_Interrupt_stack_setup)
77      _CPU_Interrupt_stack_setup(
78        cpu->interrupt_stack_low,
79        cpu->interrupt_stack_high
80      );
81#endif
82    }
83  }
84
85#endif
86
87#if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE )
88  _CPU_Install_interrupt_stack();
89#endif
90}
Note: See TracBrowser for help on using the repository browser.