[dpdk-dev] RTM instruction compile failure for XABORT when AVX is active

Thomas Monjalon thomas.monjalon at 6wind.com
Mon Jun 29 12:19:20 CEST 2015


2015-06-29 12:11, Roman Dementiev:
> >> On Jun 28, 2015, at 10:16 AM, Matthew Hall <mhall at mhcomputing.net> wrote:
> >> > I am getting a strange error compiling some RTM instructions when
> >> > I upgraded my VM environment from VirtualBox 4 to VirtualBox 5 and
> >> > AVX instructions from the host CPU became available. However when
> >> > I am reading the opcode description for XABORT it supposedly allows
> >> > an immediate operand for the argument so I can't understand why this
> >> > code would not compile. Any advice?
> >> > 
> >> >  CC test_hash_scaling.o
> >> > In file included from /vagrant/external/dpdk/app/test/test_hash_scaling.c:37:
> >> > In file included from /vagrant/external/dpdk/build/include/rte_spinlock.h:42:
> >> > /vagrant/external/dpdk/build/include/rte_rtm.h:56:15: error: invalid operand for inline asm constraint 'i'
> >> >        asm volatile(".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory");

There is no such bug with my compiler:
	clang version 3.6.1 (tags/RELEASE_361/final)
	Target: x86_64-unknown-linux-gnu

Matthew, which version are you using?

> It  looks  like  a  compiler  bug for me. In the meantime Clang should
> have native TSX intrinsics (but    most   compilers   fail   to   implement
> them correctly  on  a first attempt allowing instruction reordering). Could
> you try this workaround:
> 
> diff --git a/lib/librte_eal/common/include/arch/x86/rte_rtm.h b/lib/librte_eal/common/include/arch/x86/rte_rtm.h
> index d935641..ee73dd4 100644
> --- a/lib/librte_eal/common/include/arch/x86/rte_rtm.h
> +++ b/lib/librte_eal/common/include/arch/x86/rte_rtm.h
> @@ -50,10 +50,14 @@ void rte_xend(void)
>          asm volatile(".byte 0x0f,0x01,0xd5" ::: "memory");
>  }
> 
> +#include <immintrin.h>
> +
>  static __attribute__((__always_inline__)) inline
>  void rte_xabort(const unsigned int status)
>  {
> -       asm volatile(".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory");
> +       asm volatile(::: "memory");
> +       _xabort(status);
> +       asm volatile(::: "memory");
>  }
> 
>  static __attribute__((__always_inline__)) inline



More information about the dev mailing list