[PATCH 2/2] score: Statically initialize _ISR_Vector_table

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Apr 29 07:52:12 UTC 2014


---
 c/src/lib/libbsp/mips/shared/irq/exception.S      |    1 -
 c/src/lib/libbsp/sparc/shared/irq_asm.S           |    2 +-
 c/src/lib/libcpu/sparc64/shared/score/interrupt.S |    1 -
 cpukit/sapi/include/confdefs.h                    |   28 ---------------------
 cpukit/score/cpu/arm/rtems/score/cpu.h            |    4 ---
 cpukit/score/cpu/bfin/cpu_asm.S                   |    5 +--
 cpukit/score/cpu/h8300/cpu_asm.S                  |    4 +--
 cpukit/score/cpu/i386/rtems/score/cpu.h           |    7 -----
 cpukit/score/cpu/m68k/cpu_asm.S                   |    9 +-----
 cpukit/score/cpu/mips/cpu_asm.S                   |    1 -
 cpukit/score/cpu/mips/rtems/score/cpu.h           |    9 ------
 cpukit/score/cpu/nios2/Makefile.am                |    1 -
 cpukit/score/cpu/nios2/nios2-initialize-vectors.c |   25 ------------------
 cpukit/score/cpu/nios2/rtems/score/cpu.h          |    2 +-
 cpukit/score/cpu/no_cpu/rtems/score/cpu.h         |   17 ++++++++----
 cpukit/score/cpu/powerpc/rtems/score/cpu.h        |   10 -------
 cpukit/score/cpu/v850/rtems/score/cpu.h           |   19 --------------
 cpukit/score/include/rtems/score/isr.h            |   14 +---------
 cpukit/score/src/isr.c                            |   12 ++++++---
 testsuites/sptests/spfatal07/testcase.h           |    4 ---
 testsuites/sptests/spintr_err01/init.c            |    2 +-
 21 files changed, 28 insertions(+), 149 deletions(-)
 delete mode 100644 cpukit/score/cpu/nios2/nios2-initialize-vectors.c

diff --git a/c/src/lib/libbsp/mips/shared/irq/exception.S b/c/src/lib/libbsp/mips/shared/irq/exception.S
index 55fdf27..8ac1035 100644
--- a/c/src/lib/libbsp/mips/shared/irq/exception.S
+++ b/c/src/lib/libbsp/mips/shared/irq/exception.S
@@ -88,7 +88,6 @@
 
 
 .extern _Thread_Dispatch
-.extern _ISR_Vector_table
 
 /*  void __ISR_Handler()
  *
diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S b/c/src/lib/libbsp/sparc/shared/irq_asm.S
index c0ba479..3a86ad5 100644
--- a/c/src/lib/libbsp/sparc/shared/irq_asm.S
+++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S
@@ -423,7 +423,7 @@ dont_fix_pil2:
          */
 
         sethi    %hi(SYM(_ISR_Vector_table)), %g4
-        ld       [%g4+%lo(SYM(_ISR_Vector_table))], %g4
+        or       %g4, %lo(SYM(_ISR_Vector_table)), %g4
         and      %l3, 0xFF, %g5         ! remove synchronous trap indicator
         sll      %g5, 2, %g5            ! g5 = offset into table
         ld       [%g4 + %g5], %g4       ! g4 = _ISR_Vector_table[ vector ]
diff --git a/c/src/lib/libcpu/sparc64/shared/score/interrupt.S b/c/src/lib/libcpu/sparc64/shared/score/interrupt.S
index 53b634a..0a01554 100644
--- a/c/src/lib/libcpu/sparc64/shared/score/interrupt.S
+++ b/c/src/lib/libcpu/sparc64/shared/score/interrupt.S
@@ -249,7 +249,6 @@ PUBLIC(_ISR_Handler)
      *        we just enabled traps.  It is definitely in g2.
      */
     setx  SYM(_ISR_Vector_table), %o5, %g1
-    ldx      [%g1], %g1
     and      %g2, 0x1FF, %o5        ! remove synchronous trap indicator
     sll      %o5, 3, %o5            ! o5 = offset into table
     ldx      [%g1 + %o5], %g1       ! g1 = _ISR_Vector_table[ vector ]
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index c58915c4..ad432ed 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -2284,31 +2284,6 @@ const rtems_libio_helper rtems_fs_init_helper =
 #endif
 
 /**
- * On architectures that use Simple Vectored Interrupts, it is RTEMS
- * responsibility to allocate the vector table.  This avoids reserving
- * the memory on architectures that use the Programmable Interrupt
- * Controller Vectored Interrupts.
- */
-#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
-  /*
-   *  This is a (hopefully) temporary hack.  On the mips, the number of
-   *  vectors is NOT statically defined.  But it has to be statically
-   *  defined for this to work.  This is an issue looking for a nice
-   *  solution.
-   */
-  #if defined(__mips__)
-    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
-      _Configure_From_workspace( (sizeof(ISR_Handler_entry) * 256))
-  #else
-    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
-      _Configure_From_workspace( \
-        (sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS))
-  #endif
-#else
-  #define CONFIGURE_INTERRUPT_VECTOR_TABLE 0
-#endif
-
-/**
  * RTEMS uses two instance of an internal mutex class.  This accounts
  * for these mutexes.
  */
@@ -2337,7 +2312,6 @@ const rtems_libio_helper rtems_fs_init_helper =
  */
 #define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
   ( CONFIGURE_MEMORY_FOR_IDLE_TASK +                /* IDLE and stack */ \
-    CONFIGURE_INTERRUPT_VECTOR_TABLE +             /* interrupt vectors */ \
     CONFIGURE_INTERRUPT_STACK_MEMORY +             /* interrupt stack */ \
     CONFIGURE_API_MUTEX_MEMORY                     /* allocation mutex */ \
   )
@@ -2755,7 +2729,6 @@ const rtems_libio_helper rtems_fs_init_helper =
     uint32_t POSIX;
 
     /* System overhead pieces */
-    uint32_t INTERRUPT_VECTOR_TABLE;
     uint32_t INTERRUPT_STACK_MEMORY;
     uint32_t MEMORY_FOR_IDLE_TASK;
 
@@ -2810,7 +2783,6 @@ const rtems_libio_helper rtems_fs_init_helper =
     CONFIGURE_MEMORY_FOR_POSIX,
 
     /* System overhead pieces */
-    CONFIGURE_INTERRUPT_VECTOR_TABLE,
     CONFIGURE_INTERRUPT_STACK_MEMORY,
     CONFIGURE_MEMORY_FOR_IDLE_TASK,
 
diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h b/cpukit/score/cpu/arm/rtems/score/cpu.h
index ccf8c9a..cb9dc7c 100644
--- a/cpukit/score/cpu/arm/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/rtems/score/cpu.h
@@ -171,10 +171,6 @@
 
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
 
-#define CPU_INTERRUPT_NUMBER_OF_VECTORS 8
-
-#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
-
 #define CPU_PROVIDES_ISR_IS_IN_PROGRESS FALSE
 
 #define CPU_STACK_MINIMUM_SIZE (1024 * 4)
diff --git a/cpukit/score/cpu/bfin/cpu_asm.S b/cpukit/score/cpu/bfin/cpu_asm.S
index d594f92..015caef 100644
--- a/cpukit/score/cpu/bfin/cpu_asm.S
+++ b/cpukit/score/cpu/bfin/cpu_asm.S
@@ -359,9 +359,8 @@ vectorIDLoop:
 	if !cc jump vectorIDLoop;
 
 	[--sp] = r2;
-	p0.h = SYM(_ISR_Vector_table);
-	p0.l = SYM(_ISR_Vector_table);
-	r2 = [p0];
+	r2.h = SYM(_ISR_Vector_table);
+	r2.l = SYM(_ISR_Vector_table);
 	r1 = r0 << 2;
 	r1 = r1 + r2;
 	p0 = r1;
diff --git a/cpukit/score/cpu/h8300/cpu_asm.S b/cpukit/score/cpu/h8300/cpu_asm.S
index 0dc79a9..9e89a83 100644
--- a/cpukit/score/cpu/h8300/cpu_asm.S
+++ b/cpukit/score/cpu/h8300/cpu_asm.S
@@ -133,12 +133,10 @@ nested:
 	
 /* Vector to ISR */
 
-	mov.l	@SYM(_ISR_Vector_table),er1
 	mov		er0,er2	; copy vector
 	shll.l	er2
 	shll.l	er2		; vector = vector * 4 (sizeof(int))
-	add.l	er2,er1
-    mov.l	@er1,er1
+	mov.l	@(SYM(_ISR_Vector_table), er2),er1
 	jsr		@er1	; er0 = arg1 =vector
 	
 	orc		#0xc0,ccr
diff --git a/cpukit/score/cpu/i386/rtems/score/cpu.h b/cpukit/score/cpu/i386/rtems/score/cpu.h
index be22d9e..a9957cb 100644
--- a/cpukit/score/cpu/i386/rtems/score/cpu.h
+++ b/cpukit/score/cpu/i386/rtems/score/cpu.h
@@ -316,13 +316,6 @@ SCORE_EXTERN Context_Control_fp  _CPU_Null_fp_context;
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 1024
 
 /*
- *  i386 family supports 256 distinct vectors.
- */
-
-#define CPU_INTERRUPT_NUMBER_OF_VECTORS      256
-#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
-
-/*
  *  This is defined if the port has a special way to report the ISR nesting
  *  level.  Most ports maintain the variable _ISR_Nest_level.
  */
diff --git a/cpukit/score/cpu/m68k/cpu_asm.S b/cpukit/score/cpu/m68k/cpu_asm.S
index 4db6723..a31c158 100644
--- a/cpukit/score/cpu/m68k/cpu_asm.S
+++ b/cpukit/score/cpu/m68k/cpu_asm.S
@@ -276,13 +276,8 @@ SYM (_ISR_Handler):
 
         addql   #1,ISR_NEST_LEVEL        | one nest level deeper
 
-        movel   SYM (_ISR_Vector_table),a0 | a0= base of RTEMS table
-#if ( M68K_HAS_PREINDEXING == 1 )
-        movel   (a0,d0:w:1),a0           | a0 = address of user routine
-#else
-        addal   d0,a0                    | a0 = address of vector
-        movel   (a0),a0                  | a0 = address of user routine
-#endif
+        lea     SYM(_ISR_Vector_table),a0
+        movel   (a0,d0),a0               | a0 = address of user routine
 
         lsrl    #2,d0                    | d0 = vector number
         movel   d0,a7 at -                  | push vector number
diff --git a/cpukit/score/cpu/mips/cpu_asm.S b/cpukit/score/cpu/mips/cpu_asm.S
index 3450451..c58aee1 100644
--- a/cpukit/score/cpu/mips/cpu_asm.S
+++ b/cpukit/score/cpu/mips/cpu_asm.S
@@ -583,7 +583,6 @@ FRAME(_CPU_Context_restore,sp,0,ra)
 ENDFRAME(_CPU_Context_restore)
 
 .extern _Thread_Dispatch
-.extern _ISR_Vector_table
 
 /*  void _DBG_Handler()
  *
diff --git a/cpukit/score/cpu/mips/rtems/score/cpu.h b/cpukit/score/cpu/mips/rtems/score/cpu.h
index b871969..392a995 100644
--- a/cpukit/score/cpu/mips/rtems/score/cpu.h
+++ b/cpukit/score/cpu/mips/rtems/score/cpu.h
@@ -660,15 +660,6 @@ SCORE_EXTERN Context_Control_fp  _CPU_Null_fp_context;
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
 
 /*
- *  This defines the number of entries in the ISR_Vector_table managed
- *  by RTEMS.
- */
-
-extern unsigned int mips_interrupt_number_of_vectors;
-#define CPU_INTERRUPT_NUMBER_OF_VECTORS      (mips_interrupt_number_of_vectors)
-#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
-
-/*
  *  Should be large enough to run all RTEMS tests.  This ensures
  *  that a "reasonable" small application should not have any problems.
  */
diff --git a/cpukit/score/cpu/nios2/Makefile.am b/cpukit/score/cpu/nios2/Makefile.am
index 62286cd..6004467 100644
--- a/cpukit/score/cpu/nios2/Makefile.am
+++ b/cpukit/score/cpu/nios2/Makefile.am
@@ -33,7 +33,6 @@ libscorecpu_a_SOURCES += nios2-fatal-halt.c
 libscorecpu_a_SOURCES += nios2-iic-low-level.S
 libscorecpu_a_SOURCES += nios2-iic-irq.c
 libscorecpu_a_SOURCES += nios2-initialize.c
-libscorecpu_a_SOURCES += nios2-initialize-vectors.c
 libscorecpu_a_SOURCES += nios2-isr-get-level.c
 libscorecpu_a_SOURCES += nios2-isr-install-raw-handler.c
 libscorecpu_a_SOURCES += nios2-isr-install-vector.c
diff --git a/cpukit/score/cpu/nios2/nios2-initialize-vectors.c b/cpukit/score/cpu/nios2/nios2-initialize-vectors.c
deleted file mode 100644
index da1ee4b..0000000
--- a/cpukit/score/cpu/nios2/nios2-initialize-vectors.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2011 embedded brains GmbH
- *
- * Copyright (c) 2006 Kolja Waschk (rtemsdev/ixo.de)
- *
- * COPYRIGHT (c) 1989-2006
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#ifdef HAVE_CONFIG_H
-  #include "config.h"
-#endif
-
-#include <rtems/score/isr.h>
-
-#include <string.h>
-
-void _CPU_Initialize_vectors( void )
-{
-  memset(_ISR_Vector_table, 0, sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS);
-}
diff --git a/cpukit/score/cpu/nios2/rtems/score/cpu.h b/cpukit/score/cpu/nios2/rtems/score/cpu.h
index 6c62a1f..fcfef8d 100644
--- a/cpukit/score/cpu/nios2/rtems/score/cpu.h
+++ b/cpukit/score/cpu/nios2/rtems/score/cpu.h
@@ -192,7 +192,7 @@ typedef struct {
   uint32_t ipending;
 } CPU_Exception_frame;
 
-void _CPU_Initialize_vectors( void );
+#define _CPU_Initialize_vectors()
 
 /**
  * @brief Macro to disable interrupts.
diff --git a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
index 959fb58..fbf207a 100644
--- a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
+++ b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
@@ -686,19 +686,24 @@ SCORE_EXTERN Context_Control_fp  _CPU_Null_fp_context;
 /**
  * @ingroup CPUInterrupt
  * 
- * This defines the number of entries in the @ref _ISR_Vector_table managed
- * by RTEMS.
+ * This defines the number of entries in the _ISR_Vector_table managed by RTEMS
+ * in case CPU_SIMPLE_VECTORED_INTERRUPTS is defined to TRUE.  It must be a
+ * compile-time constant.
  *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
+ * It must be undefined in case CPU_SIMPLE_VECTORED_INTERRUPTS is defined to
+ * FALSE.
  */
 #define CPU_INTERRUPT_NUMBER_OF_VECTORS      32
 
 /**
  * @ingroup CPUInterrupt
  * 
- * This defines the highest interrupt vector number for this port.
+ * This defines the highest interrupt vector number for this port in case
+ * CPU_SIMPLE_VECTORED_INTERRUPTS is defined to TRUE.  It must be less than
+ * CPU_INTERRUPT_NUMBER_OF_VECTORS.  It may be not a compile-time constant.
+ *
+ * It must be undefined in case CPU_SIMPLE_VECTORED_INTERRUPTS is defined to
+ * FALSE.
  */
 #define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
 
diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
index 3130b35..3a51b31 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
@@ -599,16 +599,6 @@ SCORE_EXTERN struct {
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
 
 /*
- *  This defines the number of entries in the ISR_Vector_table managed
- *  by RTEMS.
- *
- *  NOTE: CPU_INTERRUPT_NUMBER_OF_VECTORS and 
- *        CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER are only used on
- *        Simple Vectored Architectures and thus are not defined
- *        for this architecture.
- */
-
-/*
  *  This is defined if the port has a special way to report the ISR nesting
  *  level.  Most ports maintain the variable _ISR_Nest_level. Note that
  *  this is not an option - RTEMS/score _relies_ on _ISR_Nest_level
diff --git a/cpukit/score/cpu/v850/rtems/score/cpu.h b/cpukit/score/cpu/v850/rtems/score/cpu.h
index 35ed6e6..7234d67 100644
--- a/cpukit/score/cpu/v850/rtems/score/cpu.h
+++ b/cpukit/score/cpu/v850/rtems/score/cpu.h
@@ -549,25 +549,6 @@ typedef struct {
  */
 #define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
 
-/* XXX this should not be needed on PIC architectures */
-/* XXX evaluate removing it */
-#if 0
-/**
- * This defines the number of entries in the @ref _ISR_Vector_table managed
- * by RTEMS.
- *
- * Port Specific Information:
- *
- * XXX document implementation including references if appropriate
- */
-#define CPU_INTERRUPT_NUMBER_OF_VECTORS      32
-#endif
-
-/**
- * This defines the highest interrupt vector number for this port.
- */
-#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER  (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
-
 /**
  * This is defined if the port has a special way to report the ISR nesting
  * level.  Most ports maintain the variable @a _ISR_Nest_level.
diff --git a/cpukit/score/include/rtems/score/isr.h b/cpukit/score/include/rtems/score/isr.h
index f1ac5ae..dcb25e1 100644
--- a/cpukit/score/include/rtems/score/isr.h
+++ b/cpukit/score/include/rtems/score/isr.h
@@ -71,22 +71,10 @@ typedef ISR_Handler ( *ISR_Handler_entry )(
 #endif
 
 /**
- *  This constant promotes out the number of vectors truly supported by
- *  the current CPU being used.  This is usually the number of distinct vectors
- *  the cpu can vector.
- */
-#define ISR_NUMBER_OF_VECTORS                CPU_INTERRUPT_NUMBER_OF_VECTORS
-
-/**
- *  This constant promotes out the highest valid interrupt vector number.
- */
-#define ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER  CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER
-
-/**
  *  The following declares the Vector Table.  Application
  *  interrupt service routines are vectored by the ISR Handler via this table.
  */
-SCORE_EXTERN ISR_Handler_entry *_ISR_Vector_table;
+extern ISR_Handler_entry _ISR_Vector_table[ CPU_INTERRUPT_NUMBER_OF_VECTORS ];
 #endif
 
 /**
diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c
index 07f3e61..1ae6e59 100644
--- a/cpukit/score/src/isr.c
+++ b/cpukit/score/src/isr.c
@@ -26,15 +26,19 @@
 #include <rtems/score/wkspace.h>
 #include <rtems/config.h>
 
+#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
+  ISR_Handler_entry _ISR_Vector_table[ CPU_INTERRUPT_NUMBER_OF_VECTORS ];
+#elif defined(CPU_INTERRUPT_NUMBER_OF_VECTORS)
+  #error "CPU_INTERRUPT_NUMBER_OF_VECTORS is defined for non-simple vectored interrupts"
+#elif defined(CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER)
+  #error "CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER is defined for non-simple vectored interrupts"
+#endif
+
 void _ISR_Handler_initialization( void )
 {
   _ISR_Nest_level = 0;
 
 #if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
-  _ISR_Vector_table = _Workspace_Allocate_or_fatal_error(
-     sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS
-  );
-
   _CPU_Initialize_vectors();
 #endif
 
diff --git a/testsuites/sptests/spfatal07/testcase.h b/testsuites/sptests/spfatal07/testcase.h
index 25fc8f2..e18563c 100644
--- a/testsuites/sptests/spfatal07/testcase.h
+++ b/testsuites/sptests/spfatal07/testcase.h
@@ -37,10 +37,6 @@ rtems_initialization_tasks_table Initialization_tasks[] = {
 #define FATAL_ERROR_EXPECTED_ERROR       \
           INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
 
-#if CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE
-  #define CONFIGURE_MEMORY_OVERHEAD (sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS)
-#endif
-
 #if CPU_ALLOCATE_INTERRUPT_STACK == TRUE
   #define CONFIGURE_INTERRUPT_STACK_SIZE (STACK_MINIMUM_SIZE - 1)
 #endif
diff --git a/testsuites/sptests/spintr_err01/init.c b/testsuites/sptests/spintr_err01/init.c
index c2c39ae..84ebfdb 100644
--- a/testsuites/sptests/spintr_err01/init.c
+++ b/testsuites/sptests/spintr_err01/init.c
@@ -36,7 +36,7 @@ rtems_task Init(
   rtems_isr_entry   old_service_routine;
     status = rtems_interrupt_catch(
       Service_routine,
-      ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER + 10,
+      CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER + 1,
       &old_service_routine
     );
     fatal_directive_status(
-- 
1.7.7




More information about the devel mailing list