From 3104e2690b183ef5948f77893efb9ddc3f9edce2 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Mon, 3 Dec 2007 08:26:34 +0000 Subject: [PATCH] Update this file so that BIND on ARM can actually work. I quote: The problem was, isc_atomic_cmpxchg() is almost like our atomic_cmpset_32(), except it expects the old value to be returned, whereas our atomic_cmpset_32 returns 1 on success, or 0 on failure. So I re-implemented something suitable. Submitted by: cognet Reviewed by: bsdimp --- .../bind9/lib/isc/arm/include/isc/atomic.h | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/contrib/bind9/lib/isc/arm/include/isc/atomic.h b/contrib/bind9/lib/isc/arm/include/isc/atomic.h index 272edd88c27..4c519ee815c 100644 --- a/contrib/bind9/lib/isc/arm/include/isc/atomic.h +++ b/contrib/bind9/lib/isc/arm/include/isc/atomic.h @@ -49,7 +49,29 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) static inline isc_int32_t isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) { - return atomic_cmpset_int(p, cmpval, val); + register int done, ras_start; + + __asm __volatile("1:\n" + "adr %1, 1b\n" + "mov %0, #0xe0000004\n" + "str %1, [%0]\n" + "mov %0, #0xe0000008\n" + "adr %1, 2f\n" + "str %1, [%0]\n" + "ldr %1, [%2]\n" + "cmp %1, %3\n" + "streq %4, [%2]\n" + "2:\n" + "mov %3, #0\n" + "mov %0, #0xe0000004\n" + "str %3, [%0]\n" + "mov %3, #0xffffffff\n" + "mov %0, #0xe0000008\n" + "str %3, [%0]\n" + : "=r" (ras_start), "=r" (done) + ,"+r" (p), "+r" (cmpval), "+r" (val) : : "memory"); + return (done); + } #else /* !FreeBSD */