Print this page
OS-4391 Want Broadwell Instruction support
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5192 need faster clock_gettime
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Ryan Zezeski <ryan@zinascii.com>
OS-4368 lxbrand glibc abhors CPUID limits

@@ -30,11 +30,11 @@
  */
 /*
  * Portions Copyright 2009 Advanced Micro Devices, Inc.
  */
 /*
- * Copyright (c) 2015, Joyent, Inc. All rights reserved.
+ * Copyright 2016 Joyent, Inc.
  */
 /*
  * Various routines to handle identification
  * and classification of x86 processors.
  */

@@ -55,10 +55,12 @@
 #include <sys/controlregs.h>
 #include <sys/bitmap.h>
 #include <sys/auxv_386.h>
 #include <sys/memnode.h>
 #include <sys/pci_cfgspace.h>
+#include <sys/comm_page.h>
+#include <sys/tsc.h>
 
 #ifdef __xpv
 #include <sys/hypervisor.h>
 #else
 #include <sys/ontrap.h>

@@ -2824,10 +2826,17 @@
                 if (*ebx & CPUID_INTC_EBX_7_0_RDSEED)
                         hwcap_flags_2 |= AV_386_2_RDSEED;
 
         }
 
+        /* Detect systems with a potential CPUID limit  */
+        if (cpi->cpi_vendor == X86_VENDOR_Intel && cpi->cpi_maxeax < 4) {
+                cmn_err(CE_NOTE, "CPUID limit detected, "
+                    "see the CPUID(7D) man page for details\n");
+        }
+
+
         if (cpi->cpi_xmaxeax < 0x80000001)
                 goto pass4_done;
 
         switch (cpi->cpi_vendor) {
                 struct cpuid_regs cp;

@@ -4605,31 +4614,34 @@
 patch_tsc_read(int flag)
 {
         size_t cnt;
 
         switch (flag) {
-        case X86_NO_TSC:
+        case TSC_NONE:
                 cnt = &_no_rdtsc_end - &_no_rdtsc_start;
                 (void) memcpy((void *)tsc_read, (void *)&_no_rdtsc_start, cnt);
                 break;
-        case X86_HAVE_TSCP:
-                cnt = &_tscp_end - &_tscp_start;
-                (void) memcpy((void *)tsc_read, (void *)&_tscp_start, cnt);
-                break;
-        case X86_TSC_MFENCE:
+        case TSC_RDTSC_MFENCE:
                 cnt = &_tsc_mfence_end - &_tsc_mfence_start;
                 (void) memcpy((void *)tsc_read,
                     (void *)&_tsc_mfence_start, cnt);
                 break;
-        case X86_TSC_LFENCE:
+        case TSC_RDTSC_LFENCE:
                 cnt = &_tsc_lfence_end - &_tsc_lfence_start;
                 (void) memcpy((void *)tsc_read,
                     (void *)&_tsc_lfence_start, cnt);
                 break;
+        case TSC_TSCP:
+                cnt = &_tscp_end - &_tscp_start;
+                (void) memcpy((void *)tsc_read, (void *)&_tscp_start, cnt);
+                break;
         default:
+                /* Bail for unexpected TSC types. (TSC_NONE covers 0) */
+                cmn_err(CE_PANIC, "Unrecogized TSC type: %d", flag);
                 break;
         }
+        tsc_type = flag;
 }
 
 int
 cpuid_deep_cstates_supported(void)
 {