~ubuntu-branches/ubuntu/quantal/open-vm-tools/quantal-201210021442

« back to all changes in this revision

Viewing changes to lib/include/x86cpuid.h

  • Committer: Package Import Robot
  • Author(s): Nate Muench
  • Date: 2012-06-20 15:59:51 UTC
  • mfrom: (1.4.8)
  • Revision ID: package-import@ubuntu.com-20120620155951-6rupmpb0f70b52zr
Tags: 2012.05.21-724730-0ubuntu1
* Merging upstream version 2012.05.21-724730.
  - Fixes building against the current Quantal kernel. (LP: #1000344)
  - Fixes Quantal installation issues. (LP: #1019031)

* Sync with Debian
  - Updating to debhelper version 9.
  - Updating to standards version 3.9.3.
  - Updating copyright file machine-readable format version 1.0.
  - Building without multiarch paths for now

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*********************************************************
2
 
 * Copyright (C) 1998-2011 VMware, Inc. All rights reserved.
 
2
 * Copyright (C) 1998-2012 VMware, Inc. All rights reserved.
3
3
 *
4
4
 * This program is free software; you can redistribute it and/or modify it
5
5
 * under the terms of the GNU Lesser General Public License as published
119
119
   CPUIDLEVEL(FALSE, A,  0xA)                   \
120
120
   CPUIDLEVEL(TRUE,  D,  0xD)                   \
121
121
   CPUIDLEVEL(FALSE,400, 0x40000000)            \
 
122
   CPUIDLEVEL(FALSE,401, 0x40000001)            \
 
123
   CPUIDLEVEL(FALSE,402, 0x40000002)            \
 
124
   CPUIDLEVEL(FALSE,403, 0x40000003)            \
 
125
   CPUIDLEVEL(FALSE,404, 0x40000004)            \
122
126
   CPUIDLEVEL(FALSE,410, 0x40000010)            \
123
127
   CPUIDLEVEL(FALSE, 80, 0x80000000)            \
124
128
   CPUIDLEVEL(TRUE,  81, 0x80000001)            \
364
368
FIELD(  4,  0, EBX, INTEL,  22, 10, LEAF4_CACHE_WAYS,              NA,  FALSE) \
365
369
FIELD(  4,  0, ECX, INTEL,   0, 32, LEAF4_CACHE_SETS,              NA,  FALSE) \
366
370
FLAG(   4,  0, EDX, INTEL,   0,  1, LEAF4_CACHE_WBINVD_NOT_GUARANTEED, NA,  FALSE) \
367
 
FLAG(   4,  0, EDX, INTEL,   1,  1, LEAF4_CACHE_IS_INCLUSIVE,      NA,  FALSE)
 
371
FLAG(   4,  0, EDX, INTEL,   1,  1, LEAF4_CACHE_IS_INCLUSIVE,      NA,  FALSE) \
 
372
FLAG(   4,  0, EDX, INTEL,   2,  1, LEAF4_CACHE_COMPLEX_INDEXING,  NA,  FALSE)
368
373
 
369
374
/*     LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME,        MON SUPP, CPL3 */
370
375
#define CPUID_FIELD_DATA_LEVEL_5                                               \
390
395
/*    LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME,        MON SUPP, CPL3 */
391
396
#define CPUID_FIELD_DATA_LEVEL_7                                               \
392
397
FLAG(   7,  0, EBX, INTEL,   0,  1, FSGSBASE,                      YES, FALSE) \
393
 
FLAG(   7,  0, EBX, AMD,     3,  1, BMI1,                          YES, TRUE ) \
 
398
FLAG(   7,  0, EBX, COMMON,  3,  1, BMI1,                          YES, TRUE ) \
 
399
FLAG(   7,  0, EBX, INTEL,   4,  1, HLE,                           YES, TRUE)  \
 
400
FLAG(   7,  0, EBX, INTEL,   5,  1, AVX2,                          YES, TRUE)  \
394
401
FLAG(   7,  0, EBX, INTEL,   7,  1, SMEP,                          YES, FALSE) \
 
402
FLAG(   7,  0, EBX, INTEL,   8,  1, BMI2,                          YES, TRUE)  \
395
403
FLAG(   7,  0, EBX, INTEL,   9,  1, ENFSTRG,                       YES, FALSE) \
396
 
FLAG(   7,  0, EBX, INTEL,  10,  1, INVPCID,                       NO,  FALSE)
 
404
FLAG(   7,  0, EBX, INTEL,  10,  1, INVPCID,                       NO,  FALSE) \
 
405
FLAG(   7,  0, EBX, INTEL,  11,  1, RTM,                           NO,  TRUE)
397
406
 
398
407
/*    LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME,        MON SUPP, CPL3 */
399
408
#define CPUID_FIELD_DATA_LEVEL_A                                               \
480
489
FLAG(  81,  0, ECX, AMD,     2,  1, SVM,                           YES, FALSE) \
481
490
FLAG(  81,  0, ECX, AMD,     3,  1, EXTAPICSPC,                    YES, FALSE) \
482
491
FLAG(  81,  0, ECX, AMD,     4,  1, CR8AVAIL,                      YES, FALSE) \
483
 
FLAG(  81,  0, ECX, AMD,     5,  1, ABM,                           YES, TRUE)  \
 
492
FLAG(  81,  0, ECX, COMMON,  5,  1, ABM,                           YES, TRUE)  \
484
493
FLAG(  81,  0, ECX, AMD,     6,  1, SSE4A,                         YES, TRUE)  \
485
494
FLAG(  81,  0, ECX, AMD,     7,  1, MISALIGNED_SSE,                YES, TRUE)  \
486
495
FLAG(  81,  0, ECX, AMD,     8,  1, 3DNPREFETCH,                   YES, TRUE)  \
789
798
 * other compilers.
790
799
 */
791
800
 
792
 
#ifdef __GNUC__
 
801
#if defined(__GNUC__) && !defined(__clang__)
793
802
 
794
803
#define CPUID_MASK(eaxIn, reg, flag)                                    \
795
804
   ({                                                                   \
862
871
 
863
872
#define CPUID_SET(eaxIn, reg, flag, dataPtr)                            \
864
873
   do {                                                                 \
865
 
      ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
866
 
              CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag);  \
 
874
      ASSERT_ON_COMPILE(                                                \
 
875
         (uint32)eaxIn   == (uint32)CPUID_INTERNAL_EAXIN_##flag &&      \
 
876
         CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag);       \
867
877
      *(dataPtr) |= CPUID_INTERNAL_MASK_##flag;                         \
868
878
   } while (0)
869
879
 
870
880
#define CPUID_CLEAR(eaxIn, reg, flag, dataPtr)                          \
871
881
   do {                                                                 \
872
 
      ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
873
 
              CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag);  \
 
882
      ASSERT_ON_COMPILE(                                                \
 
883
         (uint32)eaxIn   == (uint32)CPUID_INTERNAL_EAXIN_##flag &&      \
 
884
         CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag);       \
874
885
      *(dataPtr) &= ~CPUID_INTERNAL_MASK_##flag;                        \
875
886
   } while (0)
876
887
 
878
889
   do {                                                                 \
879
890
      uint32 _v = val;                                                  \
880
891
      uint32 *_d = dataPtr;                                             \
881
 
      ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##field && \
882
 
              CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
 
892
      ASSERT_ON_COMPILE(                                                \
 
893
         (uint32)eaxIn   == (uint32)CPUID_INTERNAL_EAXIN_##field &&     \
 
894
         CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field);      \
883
895
      *_d = (*_d & ~CPUID_INTERNAL_MASK_##field) |                      \
884
896
         (_v << CPUID_INTERNAL_SHIFT_##field);                          \
885
897
      ASSERT(_v == (*_d & CPUID_INTERNAL_MASK_##field) >>               \
886
898
             CPUID_INTERNAL_SHIFT_##field);                             \
887
899
   } while (0)
888
900
 
 
901
#define CPUID_SETTO_SAFE(eaxIn, reg, field, dataPtr, val)               \
 
902
   do {                                                                 \
 
903
      uint32 _v = val &                                                 \
 
904
         (CPUID_INTERNAL_MASK_##field >> CPUID_INTERNAL_SHIFT_##field); \
 
905
      uint32 *_d = dataPtr;                                             \
 
906
      ASSERT_ON_COMPILE(                                                \
 
907
         (uint32)eaxIn   == (uint32)CPUID_INTERNAL_EAXIN_##field &&     \
 
908
         CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field);      \
 
909
      *_d = (*_d & ~CPUID_INTERNAL_MASK_##field) |                      \
 
910
         (_v << CPUID_INTERNAL_SHIFT_##field);                          \
 
911
   } while (0)
 
912
 
889
913
 
890
914
/*
891
915
 * Definitions of various fields' values and more complicated
936
960
#define CPUID_MODEL_NEHALEM_2C     0x2c  // Westmere-EP
937
961
#define CPUID_MODEL_NEHALEM_2E     0x2e  // Nehalem-EX
938
962
#define CPUID_MODEL_NEHALEM_2F     0x2f  // Westmere-EX
 
963
#define CPUID_MODEL_SANDYBRIDGE_3A 0x3a  // Ivy Bridge
939
964
 
940
965
#define CPUID_MODEL_PIII_07    7
941
966
#define CPUID_MODEL_PIII_08    8
1100
1125
 
1101
1126
   return CPUID_FAMILY_IS_P6(v) &&
1102
1127
          (effectiveModel == CPUID_MODEL_SANDYBRIDGE_2A ||
1103
 
           effectiveModel == CPUID_MODEL_SANDYBRIDGE_2D);
 
1128
           effectiveModel == CPUID_MODEL_SANDYBRIDGE_2D ||
 
1129
           effectiveModel == CPUID_MODEL_SANDYBRIDGE_3A);
1104
1130
}
1105
1131
 
1106
1132
 
 
1133
 
 
1134
 
1107
1135
static INLINE Bool
1108
1136
CPUID_UARCH_IS_ATOM(uint32 v) // IN: %eax from CPUID with %eax=1.
1109
1137
{
1140
1168
}
1141
1169
 
1142
1170
 
 
1171
static INLINE Bool
 
1172
CPUID_MODEL_IS_IVYBRIDGE(uint32 v) // IN: %eax from CPUID with %eax=1.
 
1173
{
 
1174
   /* Assumes the CPU manufacturer is Intel. */
 
1175
   uint32 effectiveModel = CPUID_EFFECTIVE_MODEL(v);
 
1176
 
 
1177
   return CPUID_FAMILY_IS_P6(v) && (
 
1178
       effectiveModel == CPUID_MODEL_SANDYBRIDGE_3A);
 
1179
}
 
1180
 
 
1181
 
1143
1182
 
1144
1183
 
1145
1184
static INLINE Bool
1269
1308
#define CPUID_LEAF4_CACHE_TYPE_DATA      1
1270
1309
#define CPUID_LEAF4_CACHE_TYPE_INST      2
1271
1310
#define CPUID_LEAF4_CACHE_TYPE_UNIF      3
 
1311
#define CPUID_LEAF4_CACHE_INDEXING_DIRECT  0
 
1312
#define CPUID_LEAF4_CACHE_INDEXING_COMPLEX 1
1272
1313
 
1273
1314
#define CPUID_INTEL_ID4EAX_LEAF4_CACHE_SELF_INIT      0x00000100
1274
1315
#define CPUID_INTEL_ID4EAX_LEAF4_CACHE_FULLY_ASSOC    0x00000200