diff options
Diffstat (limited to 'arch/arm/include/asm/xen/events.h')
| -rw-r--r-- | arch/arm/include/asm/xen/events.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/arm/include/asm/xen/events.h b/arch/arm/include/asm/xen/events.h index 94b4e9020b02..5c27696de14f 100644 --- a/arch/arm/include/asm/xen/events.h +++ b/arch/arm/include/asm/xen/events.h | |||
| @@ -15,4 +15,26 @@ static inline int xen_irqs_disabled(struct pt_regs *regs) | |||
| 15 | return raw_irqs_disabled_flags(regs->ARM_cpsr); | 15 | return raw_irqs_disabled_flags(regs->ARM_cpsr); |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | /* | ||
| 19 | * We cannot use xchg because it does not support 8-byte | ||
| 20 | * values. However it is safe to use {ldr,dtd}exd directly because all | ||
| 21 | * platforms which Xen can run on support those instructions. | ||
| 22 | */ | ||
| 23 | static inline xen_ulong_t xchg_xen_ulong(xen_ulong_t *ptr, xen_ulong_t val) | ||
| 24 | { | ||
| 25 | xen_ulong_t oldval; | ||
| 26 | unsigned int tmp; | ||
| 27 | |||
| 28 | wmb(); | ||
| 29 | asm volatile("@ xchg_xen_ulong\n" | ||
| 30 | "1: ldrexd %0, %H0, [%3]\n" | ||
| 31 | " strexd %1, %2, %H2, [%3]\n" | ||
| 32 | " teq %1, #0\n" | ||
| 33 | " bne 1b" | ||
| 34 | : "=&r" (oldval), "=&r" (tmp) | ||
| 35 | : "r" (val), "r" (ptr) | ||
| 36 | : "memory", "cc"); | ||
| 37 | return oldval; | ||
| 38 | } | ||
| 39 | |||
| 18 | #endif /* _ASM_ARM_XEN_EVENTS_H */ | 40 | #endif /* _ASM_ARM_XEN_EVENTS_H */ |
