[rtems commit] bsp/sparc: Flush icache before first time enabling interrupts

Daniel Hellstrom danielh at rtems.org
Fri Aug 22 11:07:54 UTC 2014


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

Author:    Daniel Cederman <cederman at gaisler.com>
Date:      Thu Jul  3 11:18:55 2014 +0200

bsp/sparc: Flush icache before first time enabling interrupts

A secondary processor might miss changes done to the trap table
if the instruction cache is not flushed. Once interrupts are enabled
any other required cache flushes can be ordered via the cache
manager.

---

 c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c |    9 +++++++++
 cpukit/score/cpu/sparc/rtems/score/cpu.h      |    4 ++++
 2 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c
index 567eecc..9166ad5 100644
--- a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c
+++ b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c
@@ -15,6 +15,7 @@
 
 #include <bsp.h>
 #include <bsp/bootcard.h>
+#include <cache_.h>
 #include <leon.h>
 #include <rtems/bspIo.h>
 #include <rtems/score/smpimpl.h>
@@ -80,3 +81,11 @@ void _CPU_SMP_Send_interrupt(uint32_t target_processor_index)
   /* send interrupt to destination CPU */
   LEON3_IrqCtrl_Regs->force[target_processor_index] = 1 << LEON3_MP_IRQ;
 }
+
+void _BSP_Start_multitasking(
+  Context_Control *heir
+)
+{
+  _CPU_cache_invalidate_entire_instruction();
+  _CPU_Context_Restart_self( heir );
+}
diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h
index 39b7825..9c38b55 100644
--- a/cpukit/score/cpu/sparc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h
@@ -1203,6 +1203,10 @@ register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__( "g6" );
 
   void _CPU_SMP_Send_interrupt( uint32_t target_processor_index );
 
+  void _BSP_Start_multitasking( Context_Control *heir )
+    RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
+  #define _CPU_Start_multitasking _BSP_Start_multitasking
+
   static inline void _CPU_SMP_Processor_event_broadcast( void )
   {
     __asm__ volatile ( "" : : : "memory" );



More information about the vc mailing list