[PATCH 1/2] bsp/sparc: Flush icache before first time enabling interrupts
Daniel Cederman
cederman at gaisler.com
Fri Jul 4 09:54:58 UTC 2014
Thank you for your comments Joel!
> 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?
It is only the main cpu that calls bsp_postdriver_hook() and the cache
invalidation code needs to be run on the secondary cpus. I could rename
it to _SPARC_Start_multitasking and place it in score/cpu instead, as
was done for ARM7VM?
Daniel Cederman
Software Engineer
Aeroflex Gaisler AB
Aeroflex Microelectronic Solutions – HiRel
Kungsgatan 12
SE-411 19 Gothenburg, Sweden
Phone: +46 31 7758665
cederman at gaisler.com
www.Aeroflex.com/Gaisler
On 2014-07-03 17:55, Joel Sherrill wrote:
>
> 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" );
>
More information about the devel
mailing list