|
@@ -2,6 +2,7 @@
|
|
|
#define _ASM_ARM_XEN_EVENTS_H
|
|
|
|
|
|
#include <asm/ptrace.h>
|
|
|
+#include <asm/atomic.h>
|
|
|
|
|
|
enum ipi_vector {
|
|
|
XEN_PLACEHOLDER_VECTOR,
|
|
@@ -15,26 +16,8 @@ static inline int xen_irqs_disabled(struct pt_regs *regs)
|
|
|
return raw_irqs_disabled_flags(regs->ARM_cpsr);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * We cannot use xchg because it does not support 8-byte
|
|
|
- * values. However it is safe to use {ldr,dtd}exd directly because all
|
|
|
- * platforms which Xen can run on support those instructions.
|
|
|
- */
|
|
|
-static inline xen_ulong_t xchg_xen_ulong(xen_ulong_t *ptr, xen_ulong_t val)
|
|
|
-{
|
|
|
- xen_ulong_t oldval;
|
|
|
- unsigned int tmp;
|
|
|
-
|
|
|
- wmb();
|
|
|
- asm volatile("@ xchg_xen_ulong\n"
|
|
|
- "1: ldrexd %0, %H0, [%3]\n"
|
|
|
- " strexd %1, %2, %H2, [%3]\n"
|
|
|
- " teq %1, #0\n"
|
|
|
- " bne 1b"
|
|
|
- : "=&r" (oldval), "=&r" (tmp)
|
|
|
- : "r" (val), "r" (ptr)
|
|
|
- : "memory", "cc");
|
|
|
- return oldval;
|
|
|
-}
|
|
|
+#define xchg_xen_ulong(ptr, val) atomic64_xchg(container_of((ptr), \
|
|
|
+ atomic64_t, \
|
|
|
+ counter), (val))
|
|
|
|
|
|
#endif /* _ASM_ARM_XEN_EVENTS_H */
|