[PATCH 2/8] or1k: Fix inconsistencies in _ISR_enable/disable/flash

jakob.viketoft at gmail.com jakob.viketoft at gmail.com
Sat Feb 20 23:00:16 UTC 2016


From: Jakob Viketoft <jakob.viketoft at aacmicrotec.com>

Close #2597
---
 cpukit/score/cpu/or1k/cpu.c             | 18 +++++--------
 cpukit/score/cpu/or1k/rtems/score/cpu.h | 47 ++++++++++++++++-----------------
 2 files changed, 29 insertions(+), 36 deletions(-)

diff --git a/cpukit/score/cpu/or1k/cpu.c b/cpukit/score/cpu/or1k/cpu.c
index 3cf6f6b..c52c48b 100644
--- a/cpukit/score/cpu/or1k/cpu.c
+++ b/cpukit/score/cpu/or1k/cpu.c
@@ -34,26 +34,20 @@ void _CPU_Initialize(void)
  * @brief Sets the hardware interrupt level by the level value.
  *
  * @param[in] level for or1k can only range over two values:
- * 0 (enable interrupts) and 1 (disable interrupts). In future
- * implementations if fast context switch is implemented, the level
- * can range from 0 to 15. @see OpenRISC architecture manual.
- *
+ * 0 (enable interrupts) and 1 (disable interrupts).
  */
 void _CPU_ISR_Set_level(uint32_t level)
 {
   uint32_t sr = 0;
-  level = (level > 0)? 1 : 0;
-
-  /* map level bit to or1k interrupt enable/disable bit in sr register */
-  level <<= CPU_OR1K_SPR_SR_SHAMT_IEE;
 
   sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
 
-  if (level == 0){ /* Enable all interrupts */
+  if (level > 0) {
+    /* Interrupts disable */
+    sr &= ~(CPU_OR1K_SPR_SR_IEE | CPU_OR1K_SPR_SR_TEE);
+  } else {
+    /* Interrupts enable */
     sr |= CPU_OR1K_SPR_SR_IEE | CPU_OR1K_SPR_SR_TEE;
-
-  } else{
-    sr &= ~CPU_OR1K_SPR_SR_IEE;
   }
 
   _OR1K_mtspr(CPU_OR1K_SPR_SR, sr);
diff --git a/cpukit/score/cpu/or1k/rtems/score/cpu.h b/cpukit/score/cpu/or1k/rtems/score/cpu.h
index 7364343..740bdda 100644
--- a/cpukit/score/cpu/or1k/rtems/score/cpu.h
+++ b/cpukit/score/cpu/or1k/rtems/score/cpu.h
@@ -6,6 +6,9 @@
  *  This include file contains macros pertaining to the Opencores
  *  or1k processor family.
  *
+ *  COPYRIGHT (c) 2016 ÅAC Microtec AB <www.aacmicrotec.com>
+ *                     Jakob Viketoft <jakob.viketoft at aacmicrotec.com>
+ *                     David Hennerström <david.hennerstrom at aacmicrotec.com>
  *  COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmatary at gmail.com>
  *  COPYRIGHT (c) 1989-1999.
  *  On-Line Applications Research Corporation (OAR).
@@ -505,25 +508,14 @@ static inline uint32_t or1k_interrupt_disable( void )
   uint32_t sr;
   sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
 
-  _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_IEE));
-
-  return sr;
-}
-
-static inline void or1k_interrupt_enable(uint32_t level)
-{
-  uint32_t sr;
-
-  /* Enable interrupts and restore rs */
-  sr = level | CPU_OR1K_SPR_SR_IEE | CPU_OR1K_SPR_SR_TEE;
-  _OR1K_mtspr(CPU_OR1K_SPR_SR, sr);
+  _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~(CPU_OR1K_SPR_SR_TEE | CPU_OR1K_SPR_SR_IEE)));
 
+  return (sr & CPU_OR1K_SPR_SR_IEE)? 0 : 1;
 }
 
 #define _CPU_ISR_Disable( _level ) \
     _level = or1k_interrupt_disable()
 
-
 /*
  *  Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
  *  This indicates the end of an RTEMS critical section.  The parameter
@@ -531,6 +523,20 @@ static inline void or1k_interrupt_enable(uint32_t level)
  *
  */
 
+static inline void or1k_interrupt_enable(uint32_t level)
+{
+  uint32_t sr;
+  sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
+
+  if (level > 0) {
+    /* Effectively disable interrupts */
+    _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~(CPU_OR1K_SPR_SR_TEE | CPU_OR1K_SPR_SR_IEE)));
+    return;
+  }
+
+  _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr | (CPU_OR1K_SPR_SR_TEE | CPU_OR1K_SPR_SR_IEE)));
+}
+
 #define _CPU_ISR_Enable( _level )  \
   or1k_interrupt_enable( _level )
 
@@ -545,7 +551,7 @@ static inline void or1k_interrupt_enable(uint32_t level)
 #define _CPU_ISR_Flash( _level ) \
   do{ \
       _CPU_ISR_Enable( _level ); \
-      _OR1K_mtspr(CPU_OR1K_SPR_SR, (_level & ~CPU_OR1K_SPR_SR_IEE)); \
+      or1k_interrupt_disable(); \
     } while(0)
 
 /*
@@ -795,16 +801,9 @@ typedef uint16_t Priority_bit_map_Word;
 typedef struct {
   uint32_t r[32];
 
-  /* The following registers must be saved if we have
-  fast context switch disabled and nested interrupt
-  levels are enabled.
-  */
-#if !OR1K_FAST_CONTEXT_SWITCH_ENABLED
-  uint32_t epcr; /* exception PC register */
-  uint32_t eear; /* exception effective address register */
-  uint32_t esr; /* exception supervision register */
-#endif
-
+  uint32_t epcr; /* Exception PC register */
+  uint32_t eear; /* Exception effective address register */
+  uint32_t esr;  /* Exception supervision register */
 } CPU_Exception_frame;
 
 /**
-- 
2.1.4



More information about the devel mailing list