Inline assembly is not supported for MSVC x64 instead use _umonitor,
_umwait and _tpause intrinsics.

Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>
Acked-by: Morten Brørup <m...@smartsharesystems.com>
Acked-by: Konstantin Ananyev <konstantin.v.anan...@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

Reply via email to