[PATCH 1/2] bsp/sparc: Flush icache before first time enabling interrupts

Joel Sherrill joel.sherrill at oarcorp.com
Thu Jul 3 15:55:34 UTC 2014


On 7/3/2014 4:39 AM, Daniel Cederman wrote:
> 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(+)
>
> 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 c010005..4a08441 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
> +
I really don't like adding calls to anything BSP_xxx in score/cpu.

Can this be done in bsp_postdriver_hook() for the LEON3?
>    static inline void _CPU_SMP_Processor_event_broadcast( void )
>    {
>      __asm__ volatile ( "" : : : "memory" );

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985




More information about the devel mailing list