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,40 ****
   */
  /*
   * Portions Copyright 2009 Advanced Micro Devices, Inc.
   */
  /*
!  * Copyright (c) 2015, Joyent, Inc. All rights reserved.
   */
  /*
   * Various routines to handle identification
   * and classification of x86 processors.
   */
--- 30,40 ----
   */
  /*
   * Portions Copyright 2009 Advanced Micro Devices, Inc.
   */
  /*
!  * Copyright 2016 Joyent, Inc.
   */
  /*
   * Various routines to handle identification
   * and classification of x86 processors.
   */
*** 55,64 ****
--- 55,66 ----
  #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,2833 ****
--- 2826,2842 ----
                  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,4635 ****
  patch_tsc_read(int flag)
  {
          size_t cnt;
  
          switch (flag) {
!         case X86_NO_TSC:
                  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:
                  cnt = &_tsc_mfence_end - &_tsc_mfence_start;
                  (void) memcpy((void *)tsc_read,
                      (void *)&_tsc_mfence_start, cnt);
                  break;
!         case X86_TSC_LFENCE:
                  cnt = &_tsc_lfence_end - &_tsc_lfence_start;
                  (void) memcpy((void *)tsc_read,
                      (void *)&_tsc_lfence_start, cnt);
                  break;
          default:
                  break;
          }
  }
  
  int
  cpuid_deep_cstates_supported(void)
  {
--- 4614,4647 ----
  patch_tsc_read(int flag)
  {
          size_t cnt;
  
          switch (flag) {
!         case TSC_NONE:
                  cnt = &_no_rdtsc_end - &_no_rdtsc_start;
                  (void) memcpy((void *)tsc_read, (void *)&_no_rdtsc_start, cnt);
                  break;
!         case TSC_RDTSC_MFENCE:
                  cnt = &_tsc_mfence_end - &_tsc_mfence_start;
                  (void) memcpy((void *)tsc_read,
                      (void *)&_tsc_mfence_start, cnt);
                  break;
!         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)
  {