Ticket #5331: arm_spinlock_fix.2.patch

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

[Fixed] 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__(
    47             "swp %0, %1, [%2]\n\t"
    48                         BOOST_SP_ARM_BARRIER :
     59            "ldrex %0, [%2]; \n"
     60            "cmp %0, %1; \n"
     61            "strexne %0, %1, [%2]; \n"
     62            BOOST_SP_ARM_BARRIER :
    4963            "=&r"( r ): // outputs
    5064            "r"( 1 ), "r"( &v_ ): // inputs
    5165            "memory", "cc" );
    5266
     67#else
     68
     69        __asm__ __volatile__(
     70            "swp %0, %1, [%2];\n"
     71            BOOST_SP_ARM_BARRIER :
     72            "=&r"( r ): // outputs
     73            "r"( 1 ), "r"( &v_ ): // inputs
     74            "memory", "cc" );
     75
     76#endif
     77
    5378        return r == 0;
    5479    }
    5580