diff --git a/configure.ac b/configure.ac index d476fe23e1c..67779f07a02 100644 --- a/configure.ac +++ b/configure.ac @@ -199,6 +199,17 @@ if test "x$enable_host_optimization" = "xno" ; then ARCH_ABI=default-linux fi +AC_ARG_ENABLE([wfxt-cpu-pause], + [AS_HELP_STRING([--enable-wfxt-cpu-pause], + [Enable WFXT support in cpu_pause code])], + [enable_wfxt_cpu_pause=$enableval], + [enable_wfxt_cpu_pause=no]) +AM_CONDITIONAL([ENABLE_WFXT_CPU_PAUSE], [test "x$enable_wfxt_cpu_pause" = "xyes"]) + +if test "x$enable_wfxt_cpu_pause" = "xyes"; then + AC_DEFINE([ENABLE_WFXT_CPU_PAUSE], [1], [Enable WFXT in cpu_pause]) +fi + ########################################################################## # Warn on the defaults if arch is undefined ########################################################################## diff --git a/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_inlines.h b/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_inlines.h index b882d4077b9..4236914aa6f 100644 --- a/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_inlines.h +++ b/platform/linux-generic/arch/aarch64/odp/api/abi/cpu_inlines.h @@ -7,6 +7,7 @@ #define ODP_ARCH_CPU_INLINES_H_ #include +#include #include @@ -28,12 +29,17 @@ extern _odp_cpu_cycles_global_t _odp_cpu_cycles_glob; static inline void _odp_cpu_pause(void) { +#if defined(ENABLE_WFXT_CPU_PAUSE) && defined(__ARM_FEATURE_WFXT) + __asm__ volatile("sevl" : : : "memory"); + __asm__ volatile("wfet %x0" : : "r"(100) : "memory"); +#else /* YIELD hints the CPU to switch to another thread if possible * and executes as a NOP otherwise. * ISB flushes the pipeline, then restarts. This is guaranteed to * stall the CPU a number of cycles. */ __asm volatile("isb" ::: "memory"); +#endif } static inline uint64_t _odp_cpu_cycles(void)