When doing a build for a system with WAITPKG support and a modern compiler, we get build errors for the "_umonitor" intrinsic, due to the casting away of the "volatile" on the parameter.
../lib/eal/x86/rte_power_intrinsics.c: In function 'rte_power_monitor': ../lib/eal/x86/rte_power_intrinsics.c:113:22: error: passing argument 1 of '_umonitor' discards 'volatile' qualifier from pointer target type [-Werror=discarded-qualifiers] 113 | _umonitor(pmc->addr); | ~~~^~~~~~ We can avoid this issue by using RTE_PTR_ADD(..., 0) to cast the pointer through "uintptr_t" and thereby remove the volatile without warning. We also ensure comments are correct for each leg of the ifdef..else..endif block. Fixes: 60943c04f3bc ("eal/x86: use intrinsics for power management") Cc: roret...@linux.microsoft.com Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> --- lib/eal/x86/rte_power_intrinsics.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/eal/x86/rte_power_intrinsics.c b/lib/eal/x86/rte_power_intrinsics.c index 4066d1392e..4f0404bfb8 100644 --- a/lib/eal/x86/rte_power_intrinsics.c +++ b/lib/eal/x86/rte_power_intrinsics.c @@ -103,15 +103,15 @@ rte_power_monitor(const struct rte_power_monitor_cond *pmc, rte_spinlock_lock(&s->lock); s->monitor_addr = pmc->addr; - /* - * we're using raw byte codes for now as only the newest compiler - * versions support this instruction natively. - */ - /* set address for UMONITOR */ #if defined(RTE_TOOLCHAIN_MSVC) || defined(__WAITPKG__) - _umonitor(pmc->addr); + /* use RTE_PTR_ADD to cast away "volatile" when using the intrinsic */ + _umonitor(RTE_PTR_ADD(pmc->addr, 0)); #else + /* + * we're using raw byte codes for compiler versions which + * don't support this instruction natively. + */ asm volatile(".byte 0xf3, 0x0f, 0xae, 0xf7;" : : "D"(pmc->addr)); -- 2.39.2