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) {