New hardware feature flag HWF_INTEL_RDTSC.
authorWerner Koch <wk@gnupg.org>
Wed, 14 Jun 2017 11:57:45 +0000 (13:57 +0200)
committerWerner Koch <wk@gnupg.org>
Wed, 14 Jun 2017 11:57:45 +0000 (13:57 +0200)
* src/g10lib.h (HWF_INTEL_RDTSC): New.
* src/hwfeatures.c (hwflist): Add "intel-rdtsc".
* src/hwf-x86.c (detect_x86_gnuc): Get EDX features and test for TSC.

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/gcrypt.texi
src/g10lib.h
src/hwf-x86.c
src/hwfeatures.c

index 464c673..ae66dfc 100644 (file)
@@ -570,6 +570,7 @@ are
 @item intel-rdrand
 @item intel-avx
 @item intel-avx2
 @item intel-rdrand
 @item intel-avx
 @item intel-avx2
+@item intel-rdtsc
 @item arm-neon
 @end table
 
 @item arm-neon
 @end table
 
index 0309a83..82562c7 100644 (file)
@@ -227,6 +227,9 @@ char **_gcry_strtokenize (const char *string, const char *delim);
 #define HWF_ARM_SHA2            (1 << 18)
 #define HWF_ARM_PMULL           (1 << 19)
 
 #define HWF_ARM_SHA2            (1 << 18)
 #define HWF_ARM_PMULL           (1 << 19)
 
+#define HWF_INTEL_RDTSC         (1 << 20)
+
+
 
 gpg_err_code_t _gcry_disable_hw_feature (const char *name);
 void _gcry_detect_hw_features (void);
 
 gpg_err_code_t _gcry_disable_hw_feature (const char *name);
 void _gcry_detect_hw_features (void);
index 53e00d9..0d3a1f4 100644 (file)
@@ -175,7 +175,7 @@ detect_x86_gnuc (void)
     char c[12+1];
     unsigned int ui[3];
   } vendor_id;
     char c[12+1];
     unsigned int ui[3];
   } vendor_id;
-  unsigned int features;
+  unsigned int features, features2;
   unsigned int os_supports_avx_avx2_registers = 0;
   unsigned int max_cpuid_level;
   unsigned int fms, family, model;
   unsigned int os_supports_avx_avx2_registers = 0;
   unsigned int max_cpuid_level;
   unsigned int fms, family, model;
@@ -240,8 +240,8 @@ detect_x86_gnuc (void)
   /* Detect Intel features, that might also be supported by other
      vendors.  */
 
   /* Detect Intel features, that might also be supported by other
      vendors.  */
 
-  /* Get CPU family/model/stepping (EAX) and Intel feature flags (ECX).  */
-  get_cpuid(1, &fms, NULL, &features, NULL);
+  /* Get CPU family/model/stepping (EAX) and Intel feature flags (ECX, EDX).  */
+  get_cpuid(1, &fms, NULL, &features, &features2);
 
   family = ((fms & 0xf00) >> 8) + ((fms & 0xff00000) >> 20);
   model = ((fms & 0xf0) >> 4) + ((fms & 0xf0000) >> 12);
 
   family = ((fms & 0xf00) >> 8) + ((fms & 0xff00000) >> 20);
   model = ((fms & 0xf0) >> 4) + ((fms & 0xf0000) >> 12);
@@ -331,6 +331,10 @@ detect_x86_gnuc (void)
      result |= HWF_INTEL_RDRAND;
 #endif /*ENABLE_DRNG_SUPPORT*/
 
      result |= HWF_INTEL_RDRAND;
 #endif /*ENABLE_DRNG_SUPPORT*/
 
+  /* Test bit 4 of EDX for TSC.  */
+  if (features2 & 0x00000010)
+    result |= HWF_INTEL_RDTSC;
+
   /* Check additional Intel feature flags.  Early Intel P5 processors report
    * too high max_cpuid_level, so don't check level 7 if processor does not
    * support SSE3 (as cpuid:7 contains only features for newer processors).
   /* Check additional Intel feature flags.  Early Intel P5 processors report
    * too high max_cpuid_level, so don't check level 7 if processor does not
    * support SSE3 (as cpuid:7 contains only features for newer processors).
index b2ae7c3..45d7680 100644 (file)
@@ -57,6 +57,7 @@ static struct
     { HWF_INTEL_AVX,           "intel-avx" },
     { HWF_INTEL_AVX2,          "intel-avx2" },
     { HWF_INTEL_FAST_VPGATHER, "intel-fast-vpgather" },
     { HWF_INTEL_AVX,           "intel-avx" },
     { HWF_INTEL_AVX2,          "intel-avx2" },
     { HWF_INTEL_FAST_VPGATHER, "intel-fast-vpgather" },
+    { HWF_INTEL_RDTSC,         "intel-rdtsc" },
     { HWF_ARM_NEON,            "arm-neon" },
     { HWF_ARM_AES,             "arm-aes" },
     { HWF_ARM_SHA1,            "arm-sha1" },
     { HWF_ARM_NEON,            "arm-neon" },
     { HWF_ARM_AES,             "arm-aes" },
     { HWF_ARM_SHA1,            "arm-sha1" },