diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2013-02-20 06:48:06 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-02-20 08:45:07 -0500 |
commit | c81611c4e96f595a80d8be9367c385d2c116428b (patch) | |
tree | 94c1b31034506d8b73b6d9b2c2e0e2331d0fd450 /arch | |
parent | 76eaca031f0af2bb303e405986f637811956a422 (diff) |
xen: event channel arrays are xen_ulong_t and not unsigned long
On ARM we want these to be the same size on 32- and 64-bit.
This is an ABI change on ARM. X86 does not change.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Keir (Xen.org) <keir@xen.org>
Cc: Tim Deegan <tim@xen.org>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: xen-devel@lists.xen.org
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/include/asm/xen/events.h | 22 | ||||
-rw-r--r-- | arch/x86/include/asm/xen/events.h | 3 |
2 files changed, 25 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 */ |
diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h index cc146d51449e..ca842f2769ef 100644 --- a/arch/x86/include/asm/xen/events.h +++ b/arch/x86/include/asm/xen/events.h | |||
@@ -16,4 +16,7 @@ static inline int xen_irqs_disabled(struct pt_regs *regs) | |||
16 | return raw_irqs_disabled_flags(regs->flags); | 16 | return raw_irqs_disabled_flags(regs->flags); |
17 | } | 17 | } |
18 | 18 | ||
19 | /* No need for a barrier -- XCHG is a barrier on x86. */ | ||
20 | #define xchg_xen_ulong(ptr, val) xchg((ptr), (val)) | ||
21 | |||
19 | #endif /* _ASM_X86_XEN_EVENTS_H */ | 22 | #endif /* _ASM_X86_XEN_EVENTS_H */ |