[rtems commit] sparc: Add SPARC_IS_INTERRUPT_TRAP()

Sebastian Huber sebh at rtems.org
Fri Nov 6 13:07:26 UTC 2020


Module:    rtems
Branch:    master
Commit:    b7271f8c1e17bca5148039295c66d9d964a7c884
Changeset: http://git.rtems.org/rtems/commit/?id=b7271f8c1e17bca5148039295c66d9d964a7c884

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Nov  5 09:32:09 2020 +0100

sparc: Add SPARC_IS_INTERRUPT_TRAP()

Update #4171.

---

 bsps/sparc/erc32/include/erc32.h                   |  4 +---
 bsps/sparc/erc32/start/setvec.c                    |  9 +++------
 bsps/sparc/leon2/include/leon.h                    |  4 +---
 bsps/sparc/leon2/start/setvec.c                    |  9 +++------
 bsps/sparc/leon3/include/leon.h                    |  4 +---
 bsps/sparc/leon3/start/setvec.c                    |  9 +++------
 cpukit/score/cpu/sparc/include/rtems/score/sparc.h | 17 +++++++++++++++++
 7 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/bsps/sparc/erc32/include/erc32.h b/bsps/sparc/erc32/include/erc32.h
index 7db4a6c..2d278fc 100644
--- a/bsps/sparc/erc32/include/erc32.h
+++ b/bsps/sparc/erc32/include/erc32.h
@@ -87,9 +87,7 @@ extern "C" {
 
 #define ERC32_TRAP_SOURCE( _trap ) ((_trap) - 0x10)
 
-#define ERC32_Is_MEC_Trap( _trap ) \
-  ( (_trap) >= ERC32_TRAP_TYPE( ERC32_INTERRUPT_MASKED_ERRORS ) && \
-    (_trap) <= ERC32_TRAP_TYPE( ERC32_INTERRUPT_WATCHDOG_TIMEOUT ) )
+#define ERC32_Is_MEC_Trap( _trap ) SPARC_IS_INTERRUPT_TRAP( _trap )
 
 /*
  *  Structure for ERC32 memory mapped registers.
diff --git a/bsps/sparc/erc32/start/setvec.c b/bsps/sparc/erc32/start/setvec.c
index 0200f42..73bcc99 100644
--- a/bsps/sparc/erc32/start/setvec.c
+++ b/bsps/sparc/erc32/start/setvec.c
@@ -37,8 +37,6 @@ rtems_isr_entry set_vector(                   /* returns old vector */
 )
 {
   rtems_isr_entry previous_isr;
-  uint32_t        real_trap;
-  uint32_t        source;
 
   if ( type ) {
     rtems_interrupt_catch( handler, vector, &previous_isr );
@@ -50,11 +48,10 @@ rtems_isr_entry set_vector(                   /* returns old vector */
     );
   }
 
-  real_trap = SPARC_REAL_TRAP_NUMBER( vector );
+  if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
+    uint32_t source;
 
-  if ( ERC32_Is_MEC_Trap( real_trap ) ) {
-
-    source = ERC32_TRAP_SOURCE( real_trap );
+    source = ERC32_TRAP_SOURCE( SPARC_REAL_TRAP_NUMBER( vector ) );
 
     ERC32_Clear_interrupt( source );
     ERC32_Unmask_interrupt( source );
diff --git a/bsps/sparc/leon2/include/leon.h b/bsps/sparc/leon2/include/leon.h
index 2b3379f..49af308 100644
--- a/bsps/sparc/leon2/include/leon.h
+++ b/bsps/sparc/leon2/include/leon.h
@@ -84,9 +84,7 @@ extern "C" {
 
 #define LEON_TRAP_SOURCE( _trap ) ((_trap) - 0x10)
 
-#define LEON_INT_TRAP( _trap ) \
-  ( (_trap) >= LEON_TRAP_TYPE( LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR ) && \
-    (_trap) <= LEON_TRAP_TYPE( LEON_INTERRUPT_EMPTY6 ) )
+#define LEON_INT_TRAP( _trap ) SPARC_IS_INTERRUPT_TRAP( _trap )
 
 /*
  *  Structure for LEON memory mapped registers.
diff --git a/bsps/sparc/leon2/start/setvec.c b/bsps/sparc/leon2/start/setvec.c
index 3e41206..51647e3 100644
--- a/bsps/sparc/leon2/start/setvec.c
+++ b/bsps/sparc/leon2/start/setvec.c
@@ -43,19 +43,16 @@ rtems_isr_entry set_vector(                   /* returns old vector */
 )
 {
   rtems_isr_entry previous_isr;
-  uint32_t      real_trap;
-  uint32_t      source;
 
   if ( type )
     rtems_interrupt_catch( handler, vector, &previous_isr );
   else
     _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr );
 
-  real_trap = SPARC_REAL_TRAP_NUMBER( vector );
+  if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
+    uint32_t source;
 
-  if ( LEON_INT_TRAP( real_trap ) ) {
-
-    source = LEON_TRAP_SOURCE( real_trap );
+    source = LEON_TRAP_SOURCE( SPARC_REAL_TRAP_NUMBER( vector ) );
 
     LEON_Clear_interrupt( source );
     LEON_Unmask_interrupt( source );
diff --git a/bsps/sparc/leon3/include/leon.h b/bsps/sparc/leon3/include/leon.h
index f70fae5..5ab0d45 100644
--- a/bsps/sparc/leon3/include/leon.h
+++ b/bsps/sparc/leon3/include/leon.h
@@ -46,9 +46,7 @@ extern "C" {
 
 #define LEON_TRAP_SOURCE( _trap ) ((_trap) - 0x10)
 
-#define LEON_INT_TRAP( _trap ) \
-  ( (_trap) >= 0x11 && \
-    (_trap) <= 0x1F )
+#define LEON_INT_TRAP( _trap ) SPARC_IS_INTERRUPT_TRAP( _trap )
 
 /* /\* */
 /*  *  This is used to manipulate the on-chip registers. */
diff --git a/bsps/sparc/leon3/start/setvec.c b/bsps/sparc/leon3/start/setvec.c
index 5b5888d..987e505 100644
--- a/bsps/sparc/leon3/start/setvec.c
+++ b/bsps/sparc/leon3/start/setvec.c
@@ -42,19 +42,16 @@ rtems_isr_entry set_vector(                   /* returns old vector */
 )
 {
   rtems_isr_entry previous_isr;
-  uint32_t      real_trap;
-  uint32_t      source;
 
   if ( type )
     rtems_interrupt_catch( handler, vector, &previous_isr );
   else
     _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr );
 
-  real_trap = SPARC_REAL_TRAP_NUMBER( vector );
+  if ( SPARC_IS_INTERRUPT_TRAP( vector ) ) {
+    uint32_t source;
 
-  if ( LEON_INT_TRAP( real_trap ) ) {
-
-    source = LEON_TRAP_SOURCE( real_trap );
+    source = LEON_TRAP_SOURCE( SPARC_REAL_TRAP_NUMBER( vector ) );
 
     LEON_Clear_interrupt( source );
     LEON_Unmask_interrupt( source );
diff --git a/cpukit/score/cpu/sparc/include/rtems/score/sparc.h b/cpukit/score/cpu/sparc/include/rtems/score/sparc.h
index f38e002..0cf8b2d 100644
--- a/cpukit/score/cpu/sparc/include/rtems/score/sparc.h
+++ b/cpukit/score/cpu/sparc/include/rtems/score/sparc.h
@@ -206,6 +206,23 @@ extern "C" {
  */
 #define SPARC_REAL_TRAP_NUMBER( _trap ) ( ( _trap ) % 256 )
 
+/**
+ * @brief Checks if the real hardware vector number, synchronous trap number,
+ *   or asynchronous trap number is an interrupt trap.
+ *
+ * Interrupt traps are defined by Table 7-1 "Exception and Interrupt Request
+ * Priority and tt Values" in "The SPARC Architecture Manual: Version 8".
+ *
+ * @param _trap is the real hardware vector number, synchronous trap number, or
+ *   asynchronous trap number to check.
+ *
+ * @return Returns true, if the real hardware vector number, synchronous trap
+ *   number, or asynchronous trap number is an interrupt trap, otherwise false.
+ */
+#define SPARC_IS_INTERRUPT_TRAP( _trap ) \
+  ( SPARC_REAL_TRAP_NUMBER( _trap ) >= 0x11 && \
+    SPARC_REAL_TRAP_NUMBER( _trap ) <= 0x1f )
+
 #ifndef ASM
 
 /**



More information about the vc mailing list