Ticket #5331: arm_spinlock_fix.patch

File arm_spinlock_fix.patch, 1.2 KB (added by abel@…, 11 years ago)

Proposed patch for strex and ldrex usage on AMR 6 and ARM7.

  • boost/smart_ptr/detail/spinlock_gcc_arm.hpp

     
    4343    {
    4444        int r;
    4545
     46#if defined(__ARM_ARCH_6__) \
     47    || defined(__ARM_ARCH_6J__) \
     48    || defined(__ARM_ARCH_6K__) \
     49    || defined(__ARM_ARCH_6Z__) \
     50    || defined(__ARM_ARCH_6ZK__) \
     51    || defined(__ARM_ARCH_6T2__) \
     52    || defined(__ARM_ARCH_7__) \
     53    || defined(__ARM_ARCH_7A__) \
     54    || defined(__ARM_ARCH_7R__) \
     55    || defined(__ARM_ARCH_7M__) \
     56    || defined(__ARM_ARCH_7EM__)
     57
    4658        __asm__ __volatile__(
     59            "ldrex %0, [%2]; \n"
     60            "cmp %0, %1; \n"
     61            "strexne %0, %1, [%2]"
     62            BOOST_SP_ARM_BARRIER :
     63            "=&r"( r ): // outputs
     64            "r"( 1 ), "r"( &v_ ): // inputs
     65            "memory", "cc" );
     66
     67#else
     68
     69        __asm__ __volatile__(
    4770            "swp %0, %1, [%2]\n\t"
    48                         BOOST_SP_ARM_BARRIER :
     71            BOOST_SP_ARM_BARRIER :
    4972            "=&r"( r ): // outputs
    5073            "r"( 1 ), "r"( &v_ ): // inputs
    5174            "memory", "cc" );
    5275
     76#endif
     77
    5378        return r == 0;
    5479    }
    5580