From: Julian Seward Date: Fri, 24 Sep 2010 23:51:17 +0000 (+0000) Subject: Partially make this work on arm-linux (for 32-bit incs), so as to give X-Git-Tag: svn/VALGRIND_3_6_0~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=70a3472d6662e4690bddbd75b119d90602537947;p=thirdparty%2Fvalgrind.git Partially make this work on arm-linux (for 32-bit incs), so as to give a proper test for LDREX/STREX. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11378 --- diff --git a/memcheck/tests/atomic_incs.c b/memcheck/tests/atomic_incs.c index e8c1b4c35e..197902c9f4 100644 --- a/memcheck/tests/atomic_incs.c +++ b/memcheck/tests/atomic_incs.c @@ -200,7 +200,22 @@ __attribute__((noinline)) void atomic_add_32bit ( int* p, int n ) ); } while (success != 1); #elif defined(VGA_arm) - *p += n; + unsigned int block[3] + = { (unsigned int)p, (unsigned int)n, 0xFFFFFFFF }; + do { + __asm__ __volatile__( + "mov r5, %0" "\n\t" + "ldr r9, [r5, #0]" "\n\t" // p + "ldr r10, [r5, #4]" "\n\t" // n + "ldrex r8, [r9]" "\n\t" + "add r8, r8, r10" "\n\t" + "strex r11, r8, [r9]" "\n\t" + "str r11, [r5, #8]" "\n\t" + : /*out*/ + : /*in*/ "r"(&block[0]) + : /*trash*/ "memory", "cc", "r5", "r8", "r9", "r10" + ); + } while (block[2] != 0); #else # error "Unsupported arch" #endif