[PATCH 2/2] score/sparc: Flush all cores icache after trap table update

Joel Sherrill joel.sherrill at oarcorp.com
Thu Jul 3 15:57:08 UTC 2014


Seems reasonable. My only concern is creeping sysstate.h
into cpu.c but I think that's OK.

--joel
On 7/3/2014 4:39 AM, Daniel Cederman wrote:
> Changes to the trap table might be missed by other cores.
> If the system state is up, the other cores can be notified
> using SMP messages that they need to flush their icache.
> If the up state has not been reached there is no need to
> notify other cores. They will do an automatic flush of the
> icache just after entering the up state, but before enabling
> interrupts.
> ---
>  cpukit/score/cpu/sparc/cpu.c |   23 +++++++++++++++++++++--
>  1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/cpukit/score/cpu/sparc/cpu.c b/cpukit/score/cpu/sparc/cpu.c
> index c616de4..69e50f2 100644
> --- a/cpukit/score/cpu/sparc/cpu.c
> +++ b/cpukit/score/cpu/sparc/cpu.c
> @@ -22,6 +22,7 @@
>  #include <rtems/score/percpu.h>
>  #include <rtems/score/tls.h>
>  #include <rtems/rtems/cache.h>
> +#include <rtems/score/sysstate.h>
>  
>  RTEMS_STATIC_ASSERT(
>    offsetof( Per_CPU_Control, cpu_per_cpu.isr_dispatch_disable)
> @@ -157,6 +158,9 @@ void _CPU_ISR_install_raw_handler(
>    CPU_Trap_table_entry  *slot;
>    uint32_t               u32_tbr;
>    uint32_t               u32_handler;
> +#ifdef RTEMS_SMP
> +  cpu_set_t              all_cpus;
> +#endif
>  
>    /*
>     *  Get the "real" trap number for this vector ignoring the synchronous
> @@ -210,9 +214,24 @@ void _CPU_ISR_install_raw_handler(
>      (u32_handler & HIGH_BITS_MASK) >> HIGH_BITS_SHIFT;
>    slot->jmp_to_low_of_handler_plus_l4 |= (u32_handler & LOW_BITS_MASK);
>  
> -  /* need to flush icache after this !!! */
> -
> +  /* 
> +   * Changes to the trap table might be missed by other cores.
> +   * If the system state is up, the other cores can be notified
> +   * using SMP messages that they need to flush their icache.
> +   * If the up state has not been reached there is no need to
> +   * notify other cores. They will do an automatic flush of the
> +   * icache just after entering the up state, but before enabling
> +   * interrupts.
> +   */
> +#ifdef RTEMS_SMP
> +  if( _System_state_Is_up( _System_state_Get() ) ) {
> +    CPU_FILL( &all_cpus );
> +    rtems_cache_invalidate_entire_instruction_cpu_set( &all_cpus );
> +  } else
> +    rtems_cache_invalidate_entire_instruction();
> +#else
>    rtems_cache_invalidate_entire_instruction();
> +#endif
>  
>  }
>  

-- 
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