On 10/9/20 9:02 AM, Anatoly Burakov wrote:
Currently, it is not possible to check support for intrinsics that
are platform-specific, cannot be abstracted in a generic way, or do not
have support on all architectures. The CPUID flags can be used to some
extent, but they are only defined for their platform, while intrinsics
will be available to all code as they are in generic headers.

This patch introduces infrastructure to check support for certain
platform-specific intrinsics, and adds support for checking support for
IA power management-related intrinsics for UMWAIT/UMONITOR and TPAUSE.

Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---

... snip ...

diff --git a/lib/librte_eal/ppc/include/rte_power_intrinsics.h 
b/lib/librte_eal/ppc/include/rte_power_intrinsics.h
index 70fd7b094f..d63ad86849 100644
--- a/lib/librte_eal/ppc/include/rte_power_intrinsics.h
+++ b/lib/librte_eal/ppc/include/rte_power_intrinsics.h
@@ -17,6 +17,10 @@ extern "C" {
  /**
   * This function is not supported on PPC64.
   *
+ * @warning It is responsibility of the user to check if this function is
+ *   supported at runtime using `rte_cpu_get_features()` API call. Failing to 
do
+ *   so may result in an illegal CPU instruction error.
+ *
   * @param p
   *   Address to monitor for changes. Must be aligned on an 64-byte boundary.
   * @param expected_value
@@ -43,6 +47,10 @@ static inline void rte_power_monitor(const volatile void *p,
  /**
   * This function is not supported on PPC64.
   *
+ * @warning It is responsibility of the user to check if this function is
+ *   supported at runtime using `rte_cpu_get_features()` API call. Failing to 
do
+ *   so may result in an illegal CPU instruction error.
+ *
   * @param tsc_timestamp
   *   Maximum TSC timestamp to wait for.
   *
diff --git a/lib/librte_eal/ppc/rte_cpuflags.c 
b/lib/librte_eal/ppc/rte_cpuflags.c
index 3bb7563ce9..eee8234384 100644
--- a/lib/librte_eal/ppc/rte_cpuflags.c
+++ b/lib/librte_eal/ppc/rte_cpuflags.c
@@ -108,3 +108,9 @@ rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
                return NULL;
        return rte_cpu_feature_table[feature].name;
  }
+
+void
+rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics)
+{
+       memset(intrinsics, 0, sizeof(*intrinsics));
+}
diff --git a/lib/librte_eal/rte_eal_version.map 
b/lib/librte_eal/rte_eal_version.map
index a93dea9fe6..ed944f2bd4 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -400,6 +400,7 @@ EXPERIMENTAL {
        # added in 20.11
        __rte_eal_trace_generic_size_t;
        rte_service_lcore_may_be_active;
+       rte_cpu_get_intrinsics_support;
  };

  INTERNAL {

Acked-by: David Christensen <d...@linux.vnet.ibm.com>

Reply via email to