svn commit: r279483 - head/sys/cddl/dev/dtrace/arm
Andrew Turner
andrew at FreeBSD.org
Sun Mar 1 10:04:16 UTC 2015
Author: andrew
Date: Sun Mar 1 10:04:14 2015
New Revision: 279483
URL: https://svnweb.freebsd.org/changeset/base/279483
Log:
Fix the dtrace ARM atomic compare-and-set functions. These functions are
expected to return the data in the memory location pointed at by target
after the operation. The FreeBSD atomic functions previously used return
either 0 or 1 to indicate if the comparison succeeded or not respectively.
With this change these functions only support ARMv6 and later are supported
by these functions.
Sponsored by: ABT Systems Ltd
Modified:
head/sys/cddl/dev/dtrace/arm/dtrace_asm.S
head/sys/cddl/dev/dtrace/arm/dtrace_isa.c
Modified: head/sys/cddl/dev/dtrace/arm/dtrace_asm.S
==============================================================================
--- head/sys/cddl/dev/dtrace/arm/dtrace_asm.S Sun Mar 1 09:29:59 2015 (r279482)
+++ head/sys/cddl/dev/dtrace/arm/dtrace_asm.S Sun Mar 1 10:04:14 2015 (r279483)
@@ -195,3 +195,25 @@ ENTRY(dtrace_caller)
mov r0, #-1
RET
END(dtrace_caller)
+
+/*
+uint32_t
+dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
+
+void *
+dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
+*/
+ENTRY(dtrace_cas32)
+EENTRY(dtrace_casptr)
+1: ldrex r3, [r0] /* Load target */
+ cmp r3, r1 /* Check if *target == cmp */
+ bne 2f /* No, return */
+ strex r3, r2, [r0] /* Store new to target */
+ cmp r3, #0 /* Did the store succeed? */
+ bne 1b /* No, try again */
+ mov r0, r2 /* Return the new value of the store */
+2: movne r0, r3 /* The first compare failed, return */
+ /* the value loaded from memory */
+ RET
+EEND(dtrace_casptr)
+END(dtrace_cas32)
Modified: head/sys/cddl/dev/dtrace/arm/dtrace_isa.c
==============================================================================
--- head/sys/cddl/dev/dtrace/arm/dtrace_isa.c Sun Mar 1 09:29:59 2015 (r279482)
+++ head/sys/cddl/dev/dtrace/arm/dtrace_isa.c Sun Mar 1 10:04:14 2015 (r279483)
@@ -262,34 +262,3 @@ dtrace_fuword64(void *uaddr)
}
return (dtrace_fuword64_nocheck(uaddr));
}
-
-#define __with_interrupts_disabled(expr) \
- do { \
- u_int cpsr_save, tmp; \
- \
- __asm __volatile( \
- "mrs %0, cpsr;" \
- "orr %1, %0, %2;" \
- "msr cpsr_fsxc, %1;" \
- : "=r" (cpsr_save), "=r" (tmp) \
- : "I" (PSR_I | PSR_F) \
- : "cc" ); \
- (expr); \
- __asm __volatile( \
- "msr cpsr_fsxc, %0" \
- : /* no output */ \
- : "r" (cpsr_save) \
- : "cc" ); \
- } while(0)
-
-uint32_t dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
-{
- return atomic_cmpset_32((uint32_t*)target, (uint32_t)cmp, (uint32_t)new);
-
-}
-
-void * dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
-{
- return (void*)dtrace_cas32((uint32_t*)target, (uint32_t)cmp, (uint32_t)new);
-}
-
More information about the svn-src-head
mailing list