[PATCH] xen: arm: mandate EABI and use generic atomic operations.
Konrad Rzeszutek Wilk
konrad.wilk at oracle.com
Thu Mar 7 09:14:45 EST 2013
On Thu, Mar 07, 2013 at 07:17:25AM +0000, Ian Campbell wrote:
> Rob Herring has observed that c81611c4e96f "xen: event channel arrays are
> xen_ulong_t and not unsigned long" introduced a compile failure when building
> without CONFIG_AEABI:
>
> /tmp/ccJaIZOW.s: Assembler messages:
> /tmp/ccJaIZOW.s:831: Error: even register required -- `ldrexd r5,r6,[r4]'
>
> Will Deacon pointed out that this is because OABI does not require even base
> registers for 64-bit values. We can avoid this by simply using the existing
> atomic64_xchg operation and the same containerof trick as used by the cmpxchg
> macros. However since this code is used on memory which is shared with the
> hypervisor we require proper atomic instructions and cannot use the generic
> atomic64 callbacks (which are based on spinlocks), therefore add a dependency
> on !GENERIC_ATOMIC64. Since we already depend on !CPU_V6 there isn't much
> downside to this.
>
> While thinking about this we also observed that OABI has different struct
> alignment requirements to EABI, which is a problem for hypercall argument
> structs which are shared with the hypervisor and which must be in EABI layout.
> Since I don't expect people to want to run OABI kernels on Xen depend on
> CONFIG_AEABI explicitly too (although it also happens to be enforced by the
> !GENERIC_ATOMIC64 requirement too).
>
> Signed-off-by: Ian Campbell <ian.campbell at citrix.com>
> Cc: Will Deacon <will.deacon at arm.com>
> Cc: Rob Herring <robherring2 at gmail.com>
> Cc: Stefano Stabellini <Stefano.Stabellini at eu.citrix.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
Stefano, I need your Ack before I can put it in my tree for Linus.
> ---
> arch/arm/Kconfig | 3 ++-
> arch/arm/include/asm/xen/events.h | 25 ++++---------------------
> 2 files changed, 6 insertions(+), 22 deletions(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 5b71469..be632ba 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1887,8 +1887,9 @@ config XEN_DOM0
>
> config XEN
> bool "Xen guest support on ARM (EXPERIMENTAL)"
> - depends on ARM && OF
> + depends on ARM && AEABI && OF
> depends on CPU_V7 && !CPU_V6
> + depends on !GENERIC_ATOMIC64
> help
> Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.
>
> diff --git a/arch/arm/include/asm/xen/events.h b/arch/arm/include/asm/xen/events.h
> index 5c27696..8b1f37b 100644
> --- a/arch/arm/include/asm/xen/events.h
> +++ b/arch/arm/include/asm/xen/events.h
> @@ -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 */
> --
> 1.7.10.4
>
More information about the linux-arm-kernel
mailing list