MSVC does not support inline assembly, which is used by the implementation of rte_atomic128_cmp_exchange and is needed by lib/stack.
Error printed by MSVC: stack_rte_stack_lf.c.obj : error LNK2019: unresolved external symbol rte_atomic128_cmp_exchange referenced in function __rte_stack_lf_push_elems Fix is to provide an implementation for rte_atomic128_cmp_exchange which uses an intrinsic function, which is used when compiling with MSVC. For other compilers the existing implementation continues to be used. Signed-off-by: Andre Muezerie <andre...@linux.microsoft.com> --- lib/eal/x86/include/rte_atomic.h | 4 ++-- lib/eal/x86/include/rte_atomic_64.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/eal/x86/include/rte_atomic.h b/lib/eal/x86/include/rte_atomic.h index c72c47c83e..e8e0e4c33c 100644 --- a/lib/eal/x86/include/rte_atomic.h +++ b/lib/eal/x86/include/rte_atomic.h @@ -288,12 +288,12 @@ static inline int rte_atomic32_dec_and_test(rte_atomic32_t *v) #endif +#endif /* RTE_TOOLCHAIN_MSVC */ + #ifdef RTE_ARCH_I686 #include "rte_atomic_32.h" #else #include "rte_atomic_64.h" #endif -#endif - #endif /* _RTE_ATOMIC_X86_H_ */ diff --git a/lib/eal/x86/include/rte_atomic_64.h b/lib/eal/x86/include/rte_atomic_64.h index 0a7a2131e0..26c87a2da6 100644 --- a/lib/eal/x86/include/rte_atomic_64.h +++ b/lib/eal/x86/include/rte_atomic_64.h @@ -182,6 +182,23 @@ static inline void rte_atomic64_clear(rte_atomic64_t *v) /*------------------------ 128 bit atomic operations -------------------------*/ +#ifdef RTE_TOOLCHAIN_MSVC +static inline int +rte_atomic128_cmp_exchange(rte_int128_t *dst, + rte_int128_t *exp, + const rte_int128_t *src, + unsigned int weak, + int success, + int failure) +{ + return (int)_InterlockedCompareExchange128( + (int64_t volatile *) dst, + src->val[1], /* exchange high */ + src->val[0], /* exchange low */ + (int64_t *) exp /* comparand result */ + ); +} +#else static inline int rte_atomic128_cmp_exchange(rte_int128_t *dst, rte_int128_t *exp, @@ -212,5 +229,6 @@ rte_atomic128_cmp_exchange(rte_int128_t *dst, return res; } +#endif /* RTE_TOOLCHAIN_MSVC */ #endif /* _RTE_ATOMIC_X86_64_H_ */ -- 2.47.0.vfs.0.3