diff options
Diffstat (limited to 'c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c')
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c index b90fb2f094..b924479f3d 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c +++ b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c @@ -15,6 +15,8 @@ #include <bsp.h> #include <bsp/bootcard.h> +#include <bsp/fatal.h> +#include <cache_.h> #include <leon.h> #include <rtems/bspIo.h> #include <rtems/score/smpimpl.h> @@ -38,7 +40,15 @@ void bsp_start_on_secondary_processor() { uint32_t cpu_index_self = _CPU_SMP_Get_current_processor(); - leon3_set_cache_control_register(0x80000F); + /* + * If data cache snooping is not enabled we terminate using + * BSP_fatal_exit instead of bsp_fatal. This is done since + * the latter function tries to acquire a ticket lock, an + * operation which requires data cache snooping to be enabled. + */ + if ( ! leon3_data_cache_snooping_enabled() ) + BSP_fatal_exit( LEON3_FATAL_INVALID_CACHE_CONFIG_SECONDARY_PROCESSOR ); + /* Unmask IPI interrupts at Interrupt controller for this CPU */ LEON3_IrqCtrl_Regs->mask[cpu_index_self] |= 1U << LEON3_MP_IRQ; @@ -47,7 +57,8 @@ void bsp_start_on_secondary_processor() uint32_t _CPU_SMP_Initialize( void ) { - leon3_set_cache_control_register(0x80000F); + if ( ! leon3_data_cache_snooping_enabled() ) + bsp_fatal( LEON3_FATAL_INVALID_CACHE_CONFIG_MAIN_PROCESSOR ); if ( rtems_configuration_get_maximum_processors() > 1 ) { LEON_Unmask_interrupt(LEON3_MP_IRQ); |