For BSPs that support SMP, the sys_arch_protect and sys_arch_unprotect calls must use a global mutex instead of a local CPU interrupt disable to protect critical sections. --- uLan/ports/os/rtems/arch/sys_arch.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/uLan/ports/os/rtems/arch/sys_arch.c b/uLan/ports/os/rtems/arch/sys_arch.c index fa344a1..d51810b 100644 --- a/uLan/ports/os/rtems/arch/sys_arch.c +++ b/uLan/ports/os/rtems/arch/sys_arch.c @@ -57,10 +57,22 @@ sys_now() return temp; } +#ifdef __rtems__ +#if RTEMS_SMP +sys_mutex_t sys_arch_mutex; +#endif +#endif + void sys_init(void) { // Is called to initialize the sys_arch layer. +#ifdef __rtems__ +#if RTEMS_SMP + // initialize global sys arch protect mutex + sys_mutex_new(&sys_arch_mutex); +#endif +#endif return; } @@ -364,16 +376,25 @@ sys_request_irq(unsigned int irqnum, sys_irq_handler_t handler, sys_prot_t sys_arch_protect() { +#if RTEMS_SMP + sys_mutex_lock(&sys_arch_mutex); + return 0; +#else sys_prot_t pval; rtems_interrupt_disable(pval); return pval; +#endif } void sys_arch_unprotect(sys_prot_t pval) { +#if RTEMS_SMP + sys_mutex_unlock(&sys_arch_mutex); +#else rtems_interrupt_enable(pval); +#endif } err_t sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg) -- 2.30.2 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel