Hello Sebastian, On Wednesday 07 of September 2016 07:33:36 Sebastian Huber wrote: > Hello Pavel, > > On 06/09/16 21:48, Pavel Pisa wrote: > > Hello Sebastian, > > > > On Tuesday 06 of September 2016 20:33:08 Sebastian Huber wrote: > >> The interrupt locks are simple interrupt disable/enable or spin locks. > >> So, they always work. > > > > Allmost, on UP they are simple local IRQ disable. > > But on SMP they are spinlock combined with IRQ disable. > > But spinlock requires that corresponding memory location is initialized. > > It is initialized to 0,0 as ticked lock or combination with some > > debug/non-zero information depending on RTEMS_DEBUG, RTEMS_PROFILING etc. > > The locks ends in BSS for zero case and I expect that it is source of > > my problems. > > if you want to use something before the BSS initialization, then you can > move it to the BSP_START_DATA_SECTION section or explicitly initialize > it, e.g. in your case via rtems_interrupt_lock_initialize().
I skip this patch. I have found one other corner case for it usefullens and it is changing value of output pins to safe state during BSP fatal handling. If other CPU hard-faults when holding spinlock then fatal handler can block. But again artificially constructed case. > The rest of the patch series looks good. Thanks > The smpfatal08 test is quite a hack since it re-defines some global SMP > support functions locally. In order to support this, the ARM BSPs must > place the _CPU_SMP_Start_processor() function as the only global > function into the bspsmp.c file. I expected that CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections in BSP and linker -Wl,--gc-section could/sould resolve that. So should I divide bspsmp.c into two files? For example, bspsmp-startcpu.c, bspsmp-init.c. What about uint32_t _CPU_SMP_Initialize(void) { uint32_t cpu_count = (uint32_t)bsp_processor_count; if ( cpu_count > 4 ) cpu_count = 4; return cpu_count; } void _CPU_SMP_Finalize_initialization( uint32_t cpu_count ) { /* Do nothing */ } void _CPU_SMP_Prepare_start_multitasking( void ) { /* Do nothing */ } void _CPU_SMP_Send_interrupt( uint32_t target_cpu_index ) { /* Generates IPI */ BCM2835_REG(BCM2836_MAILBOX_3_WRITE_SET_BASE + 0x10 * target_cpu_index) = 0x1; } should they go to the same compilation unit as _CPU_SMP_Start_processor or bspsmp-init.c separate one. Or I should not care about smpfatal08 or add required symbol to it. Best wishes, Pavel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel