[PATCH v10 05/13] eal: use umonitor umwait and tpause intrinsics
Tyler Retzlaff
roretzla at linux.microsoft.com
Wed Aug 2 23:35:14 CEST 2023
Inline assembly is not supported for MSVC x64 instead use _umonitor,
_umwait and _tpause intrinsics.
Signed-off-by: Tyler Retzlaff <roretzla at linux.microsoft.com>
Acked-by: Morten Brørup <mb at smartsharesystems.com>
Acked-by: Konstantin Ananyev <konstantin.v.ananyev at yandex.ru>
---
lib/eal/x86/rte_power_intrinsics.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/lib/eal/x86/rte_power_intrinsics.c b/lib/eal/x86/rte_power_intrinsics.c
index f749da9..4066d13 100644
--- a/lib/eal/x86/rte_power_intrinsics.c
+++ b/lib/eal/x86/rte_power_intrinsics.c
@@ -109,9 +109,13 @@
*/
/* set address for UMONITOR */
+#if defined(RTE_TOOLCHAIN_MSVC) || defined(__WAITPKG__)
+ _umonitor(pmc->addr);
+#else
asm volatile(".byte 0xf3, 0x0f, 0xae, 0xf7;"
:
: "D"(pmc->addr));
+#endif
/* now that we've put this address into monitor, we can unlock */
rte_spinlock_unlock(&s->lock);
@@ -123,10 +127,14 @@
goto end;
/* execute UMWAIT */
+#if defined(RTE_TOOLCHAIN_MSVC) || defined(__WAITPKG__)
+ _umwait(tsc_l, tsc_h);
+#else
asm volatile(".byte 0xf2, 0x0f, 0xae, 0xf7;"
: /* ignore rflags */
: "D"(0), /* enter C0.2 */
"a"(tsc_l), "d"(tsc_h));
+#endif
end:
/* erase sleep address */
@@ -153,10 +161,14 @@
return -ENOTSUP;
/* execute TPAUSE */
+#if defined(RTE_TOOLCHAIN_MSVC) || defined(__WAITPKG__)
+ _tpause(tsc_l, tsc_h);
+#else
asm volatile(".byte 0x66, 0x0f, 0xae, 0xf7;"
: /* ignore rflags */
: "D"(0), /* enter C0.2 */
"a"(tsc_l), "d"(tsc_h));
+#endif
return 0;
}
--
1.8.3.1
More information about the dev
mailing list