VirtualBox

Changeset 54844 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 19, 2015 12:48:29 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99048
Message:

CPUID: Dump XSAVE details.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r54822 r54844  
    43634363
    43644364
     4365/** CPUID(1).EDX field descriptions. */
     4366static DBGFREGSUBFIELD const g_aLeaf1EdxSubFields[] =
     4367{
     4368    DBGFREGSUBFIELD_RO("FPU\0"         "x87 FPU on Chip",                            0, 1, 0),
     4369    DBGFREGSUBFIELD_RO("VME\0"         "Virtual 8086 Mode Enhancements",             1, 1, 0),
     4370    DBGFREGSUBFIELD_RO("DE\0"          "Debugging extensions",                       2, 1, 0),
     4371    DBGFREGSUBFIELD_RO("PSE\0"         "Page Size Extension",                        3, 1, 0),
     4372    DBGFREGSUBFIELD_RO("TSC\0"         "Time Stamp Counter",                         4, 1, 0),
     4373    DBGFREGSUBFIELD_RO("MSR\0"         "Model Specific Registers",                   5, 1, 0),
     4374    DBGFREGSUBFIELD_RO("PAE\0"         "Physical Address Extension",                 6, 1, 0),
     4375    DBGFREGSUBFIELD_RO("MCE\0"         "Machine Check Exception",                    7, 1, 0),
     4376    DBGFREGSUBFIELD_RO("CX8\0"         "CMPXCHG8B instruction",                      8, 1, 0),
     4377    DBGFREGSUBFIELD_RO("APIC\0"        "APIC On-Chip",                               9, 1, 0),
     4378    DBGFREGSUBFIELD_RO("SEP\0"         "SYSENTER and SYSEXIT Present",              11, 1, 0),
     4379    DBGFREGSUBFIELD_RO("MTRR\0"        "Memory Type Range Registers",               12, 1, 0),
     4380    DBGFREGSUBFIELD_RO("PGE\0"         "PTE Global Bit",                            13, 1, 0),
     4381    DBGFREGSUBFIELD_RO("MCA\0"         "Machine Check Architecture",                14, 1, 0),
     4382    DBGFREGSUBFIELD_RO("CMOV\0"        "Conditional Move Instructions",             15, 1, 0),
     4383    DBGFREGSUBFIELD_RO("PAT\0"         "Page Attribute Table",                      16, 1, 0),
     4384    DBGFREGSUBFIELD_RO("PSE-36\0"      "36-bit Page Size Extension",                17, 1, 0),
     4385    DBGFREGSUBFIELD_RO("PSN\0"         "Processor Serial Number",                   18, 1, 0),
     4386    DBGFREGSUBFIELD_RO("CLFSH\0"       "CLFLUSH Instruction",                       19, 1, 0),
     4387    DBGFREGSUBFIELD_RO("DS\0"          "Debug Store",                               21, 1, 0),
     4388    DBGFREGSUBFIELD_RO("ACPI\0"        "Thermal Mon. & Soft. Clock Ctrl.",          22, 1, 0),
     4389    DBGFREGSUBFIELD_RO("MMX\0"         "Intel MMX Technology",                      23, 1, 0),
     4390    DBGFREGSUBFIELD_RO("FXSR\0"        "FXSAVE and FXRSTOR Instructions",           24, 1, 0),
     4391    DBGFREGSUBFIELD_RO("SSE\0"         "SSE Support",                               25, 1, 0),
     4392    DBGFREGSUBFIELD_RO("SSE2\0"        "SSE2 Support",                              26, 1, 0),
     4393    DBGFREGSUBFIELD_RO("SS\0"          "Self Snoop",                                27, 1, 0),
     4394    DBGFREGSUBFIELD_RO("HTT\0"         "Hyper-Threading Technology",                28, 1, 0),
     4395    DBGFREGSUBFIELD_RO("TM\0"          "Therm. Monitor",                            29, 1, 0),
     4396    DBGFREGSUBFIELD_RO("PBE\0"         "Pending Break Enabled",                     31, 1, 0),
     4397    DBGFREGSUBFIELD_TERMINATOR()
     4398};
     4399
     4400/** CPUID(1).ECX field descriptions. */
     4401static DBGFREGSUBFIELD const g_aLeaf1EcxSubFields[] =
     4402{
     4403    DBGFREGSUBFIELD_RO("SSE3\0"       "Supports SSE3 or not",                        0, 1, 0),
     4404    DBGFREGSUBFIELD_RO("PCLMUL\0"     "PCLMULQDQ support (for AES-GCM)",             1, 1, 0),
     4405    DBGFREGSUBFIELD_RO("DTES64\0"     "DS Area 64-bit Layout",                       2, 1, 0),
     4406    DBGFREGSUBFIELD_RO("MONITOR\0"    "Supports MONITOR/MWAIT",                      3, 1, 0),
     4407    DBGFREGSUBFIELD_RO("CPL-DS\0"     "CPL Qualified Debug Store",                   4, 1, 0),
     4408    DBGFREGSUBFIELD_RO("VMX\0"        "Virtual Machine Technology",                  5, 1, 0),
     4409    DBGFREGSUBFIELD_RO("SMX\0"        "Safer Mode Extensions",                       6, 1, 0),
     4410    DBGFREGSUBFIELD_RO("EST\0"        "Enh. SpeedStep Tech",                         7, 1, 0),
     4411    DBGFREGSUBFIELD_RO("TM2\0"        "Terminal Monitor 2",                          8, 1, 0),
     4412    DBGFREGSUBFIELD_RO("SSSE3\0"      "Supplemental Streaming SIMD Extensions 3",    9, 1, 0),
     4413    DBGFREGSUBFIELD_RO("CNTX-ID\0"    "L1 Context ID",                              10, 1, 0),
     4414    DBGFREGSUBFIELD_RO("FMA\0"        "FMA Support",                                12, 1, 0),
     4415    DBGFREGSUBFIELD_RO("CX16\0"       "CMPXCHG16B",                                 13, 1, 0),
     4416    DBGFREGSUBFIELD_RO("TPRUPDATE\0"  "xTPR Update Control",                        14, 1, 0),
     4417    DBGFREGSUBFIELD_RO("PDCM\0"       "Perf/Debug Capability MSR",                  15, 1, 0),
     4418    DBGFREGSUBFIELD_RO("PCID\0"       "Process-context identifiers",                17, 1, 0),
     4419    DBGFREGSUBFIELD_RO("DCA\0"        "Direct Cache Access",                        18, 1, 0),
     4420    DBGFREGSUBFIELD_RO("SSE4_1\0"     "Supports SSE4_1 or not",                     19, 1, 0),
     4421    DBGFREGSUBFIELD_RO("SSE4_2\0"     "Supports SSE4_2 or not",                     20, 1, 0),
     4422    DBGFREGSUBFIELD_RO("X2APIC\0"     "x2APIC support",                             21, 1, 0),
     4423    DBGFREGSUBFIELD_RO("MOVBE\0"      "MOVBE instruction",                          22, 1, 0),
     4424    DBGFREGSUBFIELD_RO("POPCNT\0"     "POPCNT instruction",                         23, 1, 0),
     4425    DBGFREGSUBFIELD_RO("TSCDEADL\0"   "TSC-Deadline",                               24, 1, 0),
     4426    DBGFREGSUBFIELD_RO("AES\0"        "AES instructions",                           25, 1, 0),
     4427    DBGFREGSUBFIELD_RO("XSAVE\0"      "XSAVE instruction",                          26, 1, 0),
     4428    DBGFREGSUBFIELD_RO("OSXSAVE\0"    "OSXSAVE instruction",                        27, 1, 0),
     4429    DBGFREGSUBFIELD_RO("AVX\0"        "AVX",                                        28, 1, 0),
     4430    DBGFREGSUBFIELD_RO("F16C\0"       "16-bit floating point conversion instr",     29, 1, 0),
     4431    DBGFREGSUBFIELD_RO("RDRAND\0"     "RDRAND instruction",                         30, 1, 0),
     4432    DBGFREGSUBFIELD_RO("HVP\0"        "Hypervisor Present (we're a guest)",         31, 1, 0),
     4433    DBGFREGSUBFIELD_TERMINATOR()
     4434};
     4435
     4436/** CPUID(7,0).EBX field descriptions. */
     4437static DBGFREGSUBFIELD const g_aLeaf7Sub0EbxSubFields[] =
     4438{
     4439    DBGFREGSUBFIELD_RO("FSGSBASE\0"  "Supports RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE",      0, 1, 0),
     4440    DBGFREGSUBFIELD_RO("TSCADJUST\0" "Supports MSR_IA32_TSC_ADJUST",                      1, 1, 0),
     4441    DBGFREGSUBFIELD_RO("BMI1\0"      "Advanced Bit Manipulation extension 1",             3, 1, 0),
     4442    DBGFREGSUBFIELD_RO("HLE\0"       "Hardware Lock Elision",                             4, 1, 0),
     4443    DBGFREGSUBFIELD_RO("AVX2\0"      "Advanced Vector Extensions 2",                      5, 1, 0),
     4444    DBGFREGSUBFIELD_RO("SMEP\0"      "Supervisor Mode Execution Prevention",              7, 1, 0),
     4445    DBGFREGSUBFIELD_RO("BMI2\0"      "Advanced Bit Manipulation extension 2",             8, 1, 0),
     4446    DBGFREGSUBFIELD_RO("ERMS\0"      "Supports Enhanced REP MOVSB/STOSB",                 9, 1, 0),
     4447    DBGFREGSUBFIELD_RO("INVPCID\0"   "Supports INVPCID",                                 10, 1, 0),
     4448    DBGFREGSUBFIELD_RO("RTM\0"       "Supports Restricted Transactional Memory",         11, 1, 0),
     4449    DBGFREGSUBFIELD_RO("PQM\0"       "Supports Platform Quality of Service Monitoring",  12, 1, 0),
     4450    DBGFREGSUBFIELD_RO("DEPFPU_CS_DS\0" "Deprecates FPU CS, FPU DS values if set",       13, 1, 0),
     4451    DBGFREGSUBFIELD_RO("MPE\0"       "Supports Intel Memory Protection Extensions",      14, 1, 0),
     4452    DBGFREGSUBFIELD_RO("PQE\0"       "Supports Platform Quality of Service Enforcement", 15, 1, 0),
     4453    DBGFREGSUBFIELD_RO("AVX512F\0"   "Supports AVX512F",                                 16, 1, 0),
     4454    DBGFREGSUBFIELD_RO("RDSEED\0"    "Supports RDSEED",                                  18, 1, 0),
     4455    DBGFREGSUBFIELD_RO("ADX\0"       "Supports ADCX/ADOX",                               19, 1, 0),
     4456    DBGFREGSUBFIELD_RO("SMAP\0"      "Supports Supervisor Mode Access Prevention",       20, 1, 0),
     4457    DBGFREGSUBFIELD_RO("CLFLUSHOPT\0" "Supports CLFLUSHOPT (Cache Line Flush)",          23, 1, 0),
     4458    DBGFREGSUBFIELD_RO("INTEL_PT\0"  "Supports Intel Processor Trace",                   25, 1, 0),
     4459    DBGFREGSUBFIELD_RO("AVX512PF\0"  "Supports AVX512PF",                                26, 1, 0),
     4460    DBGFREGSUBFIELD_RO("AVX512ER\0"  "Supports AVX512ER",                                27, 1, 0),
     4461    DBGFREGSUBFIELD_RO("AVX512CD\0"  "Supports AVX512CD",                                28, 1, 0),
     4462    DBGFREGSUBFIELD_RO("SHA\0"       "Supports Secure Hash Algorithm extensions",        29, 1, 0),
     4463    DBGFREGSUBFIELD_TERMINATOR()
     4464};
     4465
     4466/** CPUID(7,0).ECX field descriptions.   */
     4467static DBGFREGSUBFIELD const g_aLeaf7Sub0EcxSubFields[] =
     4468{
     4469    DBGFREGSUBFIELD_RO("PREFETCHWT1\0" "Supports the PREFETCHWT1 instruction",            0, 1, 0),
     4470    DBGFREGSUBFIELD_TERMINATOR()
     4471};
     4472
     4473
     4474/** CPUID(13,0).EAX+EDX, XCR0, ++ bit descriptions. */
     4475static DBGFREGSUBFIELD const g_aXSaveStateBits[] =
     4476{
     4477    DBGFREGSUBFIELD_RO("x87\0"       "Legacy FPU state",                                 0, 1, 0),
     4478    DBGFREGSUBFIELD_RO("SSE\0"       "128-bit SSE state",                                1, 1, 0),
     4479    DBGFREGSUBFIELD_RO("YMM_Hi128\0" "Upper 128 bits of YMM0-15 (AVX)",                  2, 1, 0),
     4480    DBGFREGSUBFIELD_RO("AVX\0"       "256-bit AVX state",                                3, 1, 0),
     4481    DBGFREGSUBFIELD_RO("BNDREGS\0"   "MPX bound register state",                         4, 1, 0),
     4482    DBGFREGSUBFIELD_RO("BNDCSR\0"    "MPX bound config and status state",                5, 1, 0),
     4483    DBGFREGSUBFIELD_RO("Opmask\0"    "opmask state",                                     6, 1, 0),
     4484    DBGFREGSUBFIELD_RO("ZMM_Hi256\0" "Upper 256 bits of ZMM0-15 (AVX-512)",              7, 1, 0),
     4485    DBGFREGSUBFIELD_RO("Hi16_ZMM\0"  "512-bits ZMM16-31 state (AVX-512)",                8, 1, 0),
     4486    DBGFREGSUBFIELD_TERMINATOR()
     4487};
     4488
     4489/** CPUID(13,1).EAX field descriptions.   */
     4490static DBGFREGSUBFIELD const g_aLeaf13Sub1EaxSubFields[] =
     4491{
     4492    DBGFREGSUBFIELD_RO("XSAVEOPT\0"     "XSAVEOPT is available",                        0, 1, 0),
     4493    DBGFREGSUBFIELD_RO("XSAVEC\0"       "XSAVEC and compacted XRSTOR supported",        1, 1, 0),
     4494    DBGFREGSUBFIELD_RO("XGETBC1\0"      "XGETBV with ECX=1 supported",                  2, 1, 0),
     4495    DBGFREGSUBFIELD_RO("XSAVES\0"       "XSAVES/XRSTORS and IA32_XSS supported",        3, 1, 0),
     4496    DBGFREGSUBFIELD_TERMINATOR()
     4497};
     4498
     4499
     4500/** CPUID(0x80000001,0).EDX field descriptions.   */
     4501static DBGFREGSUBFIELD const g_aExtLeaf1EdxSubFields[] =
     4502{
     4503    DBGFREGSUBFIELD_RO("FPU\0"          "x87 FPU on Chip",                               0, 1, 0),
     4504    DBGFREGSUBFIELD_RO("VME\0"          "Virtual 8086 Mode Enhancements",                1, 1, 0),
     4505    DBGFREGSUBFIELD_RO("DE\0"           "Debugging extensions",                          2, 1, 0),
     4506    DBGFREGSUBFIELD_RO("PSE\0"          "Page Size Extension",                           3, 1, 0),
     4507    DBGFREGSUBFIELD_RO("TSC\0"          "Time Stamp Counter",                            4, 1, 0),
     4508    DBGFREGSUBFIELD_RO("MSR\0"          "K86 Model Specific Registers",                  5, 1, 0),
     4509    DBGFREGSUBFIELD_RO("PAE\0"          "Physical Address Extension",                    6, 1, 0),
     4510    DBGFREGSUBFIELD_RO("MCE\0"          "Machine Check Exception",                       7, 1, 0),
     4511    DBGFREGSUBFIELD_RO("CX8\0"          "CMPXCHG8B instruction",                         8, 1, 0),
     4512    DBGFREGSUBFIELD_RO("APIC\0"         "APIC On-Chip",                                  9, 1, 0),
     4513    DBGFREGSUBFIELD_RO("SEP\0"          "SYSCALL/SYSRET",                               11, 1, 0),
     4514    DBGFREGSUBFIELD_RO("MTRR\0"         "Memory Type Range Registers",                  12, 1, 0),
     4515    DBGFREGSUBFIELD_RO("PGE\0"          "PTE Global Bit",                               13, 1, 0),
     4516    DBGFREGSUBFIELD_RO("MCA\0"          "Machine Check Architecture",                   14, 1, 0),
     4517    DBGFREGSUBFIELD_RO("CMOV\0"         "Conditional Move Instructions",                15, 1, 0),
     4518    DBGFREGSUBFIELD_RO("PAT\0"          "Page Attribute Table",                         16, 1, 0),
     4519    DBGFREGSUBFIELD_RO("PSE-36\0"       "36-bit Page Size Extension",                   17, 1, 0),
     4520    DBGFREGSUBFIELD_RO("NX\0"           "No-Execute/Execute-Disable",                   20, 1, 0),
     4521    DBGFREGSUBFIELD_RO("AXMMX\0"        "AMD Extensions to MMX Instructions",           22, 1, 0),
     4522    DBGFREGSUBFIELD_RO("MMX\0"          "Intel MMX Technology",                         23, 1, 0),
     4523    DBGFREGSUBFIELD_RO("FXSR\0"         "FXSAVE and FXRSTOR Instructions",              24, 1, 0),
     4524    DBGFREGSUBFIELD_RO("FFXSR\0"        "AMD fast FXSAVE and FXRSTOR Instr.",           25, 1, 0),
     4525    DBGFREGSUBFIELD_RO("Page1GB\0"      "1 GB large page",                              26, 1, 0),
     4526    DBGFREGSUBFIELD_RO("RDTSCP\0"       "RDTSCP instruction",                           27, 1, 0),
     4527    DBGFREGSUBFIELD_RO("LM\0"           "AMD64 Long Mode",                              29, 1, 0),
     4528    DBGFREGSUBFIELD_RO("3DNOWEXT\0"     "AMD Extensions to 3DNow",                      30, 1, 0),
     4529    DBGFREGSUBFIELD_RO("3DNOW\0"        "AMD 3DNow",                                    31, 1, 0),
     4530    DBGFREGSUBFIELD_TERMINATOR()
     4531};
     4532
     4533/** CPUID(0x80000001,0).ECX field descriptions.   */
     4534static DBGFREGSUBFIELD const g_aExtLeaf1EcxSubFields[] =
     4535{
     4536    DBGFREGSUBFIELD_RO("LahfSahf\0"     "LAHF/SAHF support in 64-bit mode",              0, 1, 0),
     4537    DBGFREGSUBFIELD_RO("CmpLegacy\0"    "Core multi-processing legacy mode",             1, 1, 0),
     4538    DBGFREGSUBFIELD_RO("SVM\0"          "AMD VM extensions",                             2, 1, 0),
     4539    DBGFREGSUBFIELD_RO("EXTAPIC\0"      "AMD extended APIC registers",                   3, 1, 0),
     4540    DBGFREGSUBFIELD_RO("CR8L\0"         "AMD LOCK MOV CR0 means MOV CR8",                4, 1, 0),
     4541    DBGFREGSUBFIELD_RO("ABM\0"          "AMD Advanced bit manipulation",                 5, 1, 0),
     4542    DBGFREGSUBFIELD_RO("SSE4A\0"        "SSE4A instruction support",                     6, 1, 0),
     4543    DBGFREGSUBFIELD_RO("MISALIGNSSE\0"  "AMD Misaligned SSE mode",                       7, 1, 0),
     4544    DBGFREGSUBFIELD_RO("3DNOWPRF\0"     "AMD PREFETCH and PREFETCHW instr.",             8, 1, 0),
     4545    DBGFREGSUBFIELD_RO("OSVW\0"         "AMD OS visible workaround",                     9, 1, 0),
     4546    DBGFREGSUBFIELD_RO("IBS\0"          "Instruct based sampling",                      10, 1, 0),
     4547    DBGFREGSUBFIELD_RO("SSE5\0"         "SSE5 instruction support",                     11, 1, 0),
     4548    DBGFREGSUBFIELD_RO("SKINIT\0"       "SKINIT, STGI, and DEV support",                12, 1, 0),
     4549    DBGFREGSUBFIELD_RO("WDT\0"          "AMD Watchdog timer support",                   13, 1, 0),
     4550    DBGFREGSUBFIELD_RO("LWP\0"          "Lightweight profiling support",                15, 1, 0),
     4551    DBGFREGSUBFIELD_RO("FMA4\0"         "Four operand FMA instruction support",         16, 1, 0),
     4552    DBGFREGSUBFIELD_RO("NodeId\0"       "NodeId in MSR C001_100C",                      19, 1, 0),
     4553    DBGFREGSUBFIELD_RO("TBM\0"          "Trailing bit manipulation instr.",             21, 1, 0),
     4554    DBGFREGSUBFIELD_RO("TOPOEXT\0"      "Topology Extensions",                          22, 1, 0),
     4555    DBGFREGSUBFIELD_TERMINATOR()
     4556};
     4557
     4558
     4559static void cpumR3CpuIdInfoMnemonicListU32(PCDBGFINFOHLP pHlp, uint32_t uVal, PCDBGFREGSUBFIELD pDesc,
     4560                                           const char *pszLeadIn, uint32_t cchWidth)
     4561{
     4562    if (pszLeadIn)
     4563        pHlp->pfnPrintf(pHlp, "%*s", cchWidth, pszLeadIn);
     4564
     4565    for (uint32_t iBit = 0; iBit < 32; iBit++)
     4566        if (RT_BIT_32(iBit) & uVal)
     4567        {
     4568            while (   pDesc->pszName != NULL
     4569                   && iBit >= (uint32_t)pDesc->iFirstBit + pDesc->cBits)
     4570                pDesc++;
     4571            if (   pDesc->pszName != NULL
     4572                && iBit - (uint32_t)pDesc->iFirstBit < (uint32_t)pDesc->cBits)
     4573            {
     4574                if (pDesc->cBits == 1)
     4575                    pHlp->pfnPrintf(pHlp, " %s", pDesc->pszName);
     4576                else
     4577                {
     4578                    uint32_t uFieldValue = uVal >> pDesc->iFirstBit;
     4579                    if (pDesc->cBits < 32)
     4580                        uFieldValue &= RT_BIT_32(pDesc->cBits) - UINT32_C(1);
     4581                    pHlp->pfnPrintf(pHlp, pDesc->cBits < 4 ? " %s=%u" : " %s=%#x", pDesc->pszName, uFieldValue);
     4582                    iBit = pDesc->iFirstBit + pDesc->cBits - 1;
     4583                }
     4584            }
     4585            else
     4586                pHlp->pfnPrintf(pHlp, " %u", iBit);
     4587        }
     4588    if (pszLeadIn)
     4589        pHlp->pfnPrintf(pHlp, "\n");
     4590}
     4591
     4592
     4593static void cpumR3CpuIdInfoMnemonicListU64(PCDBGFINFOHLP pHlp, uint64_t uVal, PCDBGFREGSUBFIELD pDesc,
     4594                                           const char *pszLeadIn, uint32_t cchWidth)
     4595{
     4596    if (pszLeadIn)
     4597        pHlp->pfnPrintf(pHlp, "%*s", cchWidth, pszLeadIn);
     4598
     4599    for (uint32_t iBit = 0; iBit < 64; iBit++)
     4600        if (RT_BIT_64(iBit) & uVal)
     4601        {
     4602            while (   pDesc->pszName != NULL
     4603                   && iBit >= (uint32_t)pDesc->iFirstBit + pDesc->cBits)
     4604                pDesc++;
     4605            if (   pDesc->pszName != NULL
     4606                && iBit - (uint32_t)pDesc->iFirstBit < (uint32_t)pDesc->cBits)
     4607            {
     4608                if (pDesc->cBits == 1)
     4609                    pHlp->pfnPrintf(pHlp, " %s", pDesc->pszName);
     4610                else
     4611                {
     4612                    uint64_t uFieldValue = uVal >> pDesc->iFirstBit;
     4613                    if (pDesc->cBits < 64)
     4614                        uFieldValue &= RT_BIT_64(pDesc->cBits) - UINT64_C(1);
     4615                    pHlp->pfnPrintf(pHlp, pDesc->cBits < 4 ? " %s=%llu" : " %s=%#llx", pDesc->pszName, uFieldValue);
     4616                    iBit = pDesc->iFirstBit + pDesc->cBits - 1;
     4617                }
     4618            }
     4619            else
     4620                pHlp->pfnPrintf(pHlp, " %u", iBit);
     4621        }
     4622    if (pszLeadIn)
     4623        pHlp->pfnPrintf(pHlp, "\n");
     4624}
     4625
     4626
     4627static void cpumR3CpuIdInfoValueWithMnemonicListU64(PCDBGFINFOHLP pHlp, uint64_t uVal, PCDBGFREGSUBFIELD pDesc,
     4628                                                    const char *pszLeadIn, uint32_t cchWidth)
     4629{
     4630    if (!uVal)
     4631        pHlp->pfnPrintf(pHlp, "%*s %#010x`%08x\n", cchWidth, pszLeadIn, RT_HI_U32(uVal), RT_LO_U32(uVal));
     4632    else
     4633    {
     4634        pHlp->pfnPrintf(pHlp, "%*s %#010x`%08x (", cchWidth, pszLeadIn, RT_HI_U32(uVal), RT_LO_U32(uVal));
     4635        cpumR3CpuIdInfoMnemonicListU64(pHlp, uVal, pDesc, NULL, 0);
     4636        pHlp->pfnPrintf(pHlp, " )\n");
     4637    }
     4638}
     4639
     4640
     4641static void cpumR3CpuIdInfoVerboseCompareListU32(PCDBGFINFOHLP pHlp, uint32_t uVal1, uint32_t uVal2, PCDBGFREGSUBFIELD pDesc,
     4642                                                 uint32_t cchWidth)
     4643{
     4644    uint32_t uCombined = uVal1 | uVal2;
     4645    for (uint32_t iBit = 0; iBit < 32; iBit++)
     4646        if (   (RT_BIT_32(iBit) & uCombined)
     4647            || (iBit == pDesc->iFirstBit && pDesc->pszName) )
     4648        {
     4649            while (   pDesc->pszName != NULL
     4650                   && iBit >= (uint32_t)pDesc->iFirstBit + pDesc->cBits)
     4651                pDesc++;
     4652
     4653            if (   pDesc->pszName != NULL
     4654                && iBit - (uint32_t)pDesc->iFirstBit < (uint32_t)pDesc->cBits)
     4655            {
     4656                size_t      cchMnemonic  = strlen(pDesc->pszName);
     4657                const char *pszDesc      = pDesc->pszName + cchMnemonic + 1;
     4658                size_t      cchDesc      = strlen(pszDesc);
     4659                uint32_t    uFieldValue1 = uVal1 >> pDesc->iFirstBit;
     4660                uint32_t    uFieldValue2 = uVal2 >> pDesc->iFirstBit;
     4661                if (pDesc->cBits < 32)
     4662                {
     4663                    uFieldValue1 &= RT_BIT_32(pDesc->cBits) - UINT32_C(1);
     4664                    uFieldValue2 &= RT_BIT_32(pDesc->cBits) - UINT32_C(1);
     4665                }
     4666
     4667                pHlp->pfnPrintf(pHlp,  pDesc->cBits < 4 ? "  %s - %s%*s= %u (%u)\n" : "  %s - %s%*s= %#x (%#x)\n",
     4668                                pDesc->pszName, pszDesc,
     4669                                cchMnemonic + 3 + cchDesc < cchWidth ? cchWidth - (cchMnemonic + 3 + cchDesc) : 1, "",
     4670                                uFieldValue1, uFieldValue2);
     4671
     4672                iBit = pDesc->iFirstBit + pDesc->cBits - 1U;
     4673                pDesc++;
     4674            }
     4675            else
     4676                pHlp->pfnPrintf(pHlp, "  %2u - Reserved%*s= %u (%u)\n", iBit, 13 < cchWidth ? cchWidth - 13 : 1, "",
     4677                                RT_BOOL(uVal1 & RT_BIT_32(iBit)), RT_BOOL(uVal2 & RT_BIT_32(iBit)));
     4678        }
     4679}
     4680
     4681
     4682/**
     4683 * Produces a detailed summary of standard leaf 0x00000001.
     4684 *
     4685 * @param   pHlp        The info helper functions.
     4686 * @param   paLeaves    The CPUID leaves array.
     4687 * @param   cLeaves     The number of leaves in the array.
     4688 * @param   pCurLeaf    The 0x00000001 leaf.
     4689 * @param   fVerbose    Whether to be very verbose or not.
     4690 * @param   fIntel      Set if intel CPU.
     4691 */
     4692static void cpumR3CpuIdInfoStdLeaf1Details(PCDBGFINFOHLP pHlp, PCCPUMCPUIDLEAF paLeaves, uint32_t cLeaves,
     4693                                           PCCPUMCPUIDLEAF pCurLeaf, bool fVerbose, bool fIntel)
     4694{
     4695    Assert(pCurLeaf); Assert(pCurLeaf->uLeaf == 1);
     4696    static const char * const s_apszTypes[4] = { "primary", "overdrive", "MP", "reserved" };
     4697    uint32_t uEAX = pCurLeaf->uEax;
     4698    uint32_t uEBX = pCurLeaf->uEbx;
     4699
     4700    pHlp->pfnPrintf(pHlp,
     4701                    "%36s %2d \tExtended: %d \tEffective: %d\n"
     4702                    "%36s %2d \tExtended: %d \tEffective: %d\n"
     4703                    "%36s %d\n"
     4704                    "%36s %d (%s)\n"
     4705                    "%36s %#04x\n"
     4706                    "%36s %d\n"
     4707                    "%36s %d\n"
     4708                    "%36s %#04x\n"
     4709                    ,
     4710                    "Family:",      (uEAX >> 8) & 0xf, (uEAX >> 20) & 0x7f, ASMGetCpuFamily(uEAX),
     4711                    "Model:",       (uEAX >> 4) & 0xf, (uEAX >> 16) & 0x0f, ASMGetCpuModel(uEAX, fIntel),
     4712                    "Stepping:",    ASMGetCpuStepping(uEAX),
     4713                    "Type:",        (uEAX >> 12) & 3, s_apszTypes[(uEAX >> 12) & 3],
     4714                    "APIC ID:",     (uEBX >> 24) & 0xff,
     4715                    "Logical CPUs:",(uEBX >> 16) & 0xff,
     4716                    "CLFLUSH Size:",(uEBX >>  8) & 0xff,
     4717                    "Brand ID:",    (uEBX >>  0) & 0xff);
     4718    if (fVerbose)
     4719    {
     4720        CPUMCPUID Host;
     4721        ASMCpuIdExSlow(1, 0, 0, 0, &Host.uEax, &Host.uEbx, &Host.uEcx, &Host.uEdx);
     4722        pHlp->pfnPrintf(pHlp, "Features\n");
     4723        pHlp->pfnPrintf(pHlp, "  Mnemonic - Description                                  = guest (host)\n");
     4724        cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEdx, Host.uEdx, g_aLeaf1EdxSubFields, 56);
     4725        cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEcx, Host.uEcx, g_aLeaf1EcxSubFields, 56);
     4726    }
     4727    else
     4728    {
     4729        cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEdx, g_aLeaf1EdxSubFields, "Features EDX:", 36);
     4730        cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEcx, g_aLeaf1EcxSubFields, "Features ECX:", 36);
     4731    }
     4732}
     4733
     4734
     4735/**
     4736 * Produces a detailed summary of standard leaf 0x00000007.
     4737 *
     4738 * @param   pHlp        The info helper functions.
     4739 * @param   paLeaves    The CPUID leaves array.
     4740 * @param   cLeaves     The number of leaves in the array.
     4741 * @param   pCurLeaf    The first 0x00000007 leaf.
     4742 * @param   fVerbose    Whether to be very verbose or not.
     4743 */
     4744static void cpumR3CpuIdInfoStdLeaf7Details(PCDBGFINFOHLP pHlp, PCCPUMCPUIDLEAF paLeaves, uint32_t cLeaves,
     4745                                           PCCPUMCPUIDLEAF pCurLeaf, bool fVerbose)
     4746{
     4747    Assert(pCurLeaf); Assert(pCurLeaf->uLeaf == 7);
     4748    pHlp->pfnPrintf(pHlp, "Structured Extended Feature Flags Enumeration (leaf 7):\n");
     4749    for (;;)
     4750    {
     4751        CPUMCPUID Host;
     4752        ASMCpuIdExSlow(pCurLeaf->uLeaf, 0, pCurLeaf->uSubLeaf, 0, &Host.uEax, &Host.uEbx, &Host.uEcx, &Host.uEdx);
     4753
     4754        switch (pCurLeaf->uSubLeaf)
     4755        {
     4756            case 0:
     4757                if (fVerbose)
     4758                {
     4759                    pHlp->pfnPrintf(pHlp, "  Mnemonic - Description                                  = guest (host)\n");
     4760                    cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEbx, Host.uEbx, g_aLeaf7Sub0EbxSubFields, 56);
     4761                    cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEbx, Host.uEcx, g_aLeaf7Sub0EcxSubFields, 56);
     4762                    if (pCurLeaf->uEdx || Host.uEdx)
     4763                        pHlp->pfnPrintf(pHlp, "%36 %#x (%#x)\n", "Ext Features EDX:", pCurLeaf->uEdx, Host.uEdx);
     4764                }
     4765                else
     4766                {
     4767                    cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEbx, g_aLeaf7Sub0EbxSubFields, "Ext Features EBX:", 36);
     4768                    cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEbx, g_aLeaf7Sub0EcxSubFields, "Ext Features ECX:", 36);
     4769                    if (pCurLeaf->uEdx)
     4770                        pHlp->pfnPrintf(pHlp, "%36 %#x\n", "Ext Features EDX:", pCurLeaf->uEdx);
     4771                }
     4772                break;
     4773
     4774            default:
     4775                if (pCurLeaf->uEdx || pCurLeaf->uEcx || pCurLeaf->uEbx)
     4776                    pHlp->pfnPrintf(pHlp, "Unknown extended feature sub-leaf #%u: EAX=%#x EBX=%#x ECX=%#x EDX=%#x\n",
     4777                                    pCurLeaf->uSubLeaf, pCurLeaf->uEax, pCurLeaf->uEbx, pCurLeaf->uEcx, pCurLeaf->uEdx);
     4778                break;
     4779
     4780        }
     4781
     4782        /* advance. */
     4783        pCurLeaf++;
     4784        if (   (uintptr_t)(pCurLeaf - paLeaves) >= cLeaves
     4785            || pCurLeaf->uLeaf != 0x7)
     4786            break;
     4787    }
     4788}
     4789
     4790
     4791/**
     4792 * Produces a detailed summary of standard leaf 0x0000000d.
     4793 *
     4794 * @param   pHlp        The info helper functions.
     4795 * @param   paLeaves    The CPUID leaves array.
     4796 * @param   cLeaves     The number of leaves in the array.
     4797 * @param   pCurLeaf    The first 0x00000007 leaf.
     4798 * @param   fVerbose    Whether to be very verbose or not.
     4799 */
     4800static void cpumR3CpuIdInfoStdLeaf13Details(PCDBGFINFOHLP pHlp, PCCPUMCPUIDLEAF paLeaves, uint32_t cLeaves,
     4801                                            PCCPUMCPUIDLEAF pCurLeaf, bool fVerbose)
     4802{
     4803    Assert(pCurLeaf); Assert(pCurLeaf->uLeaf == 13);
     4804    pHlp->pfnPrintf(pHlp, "Processor Extended State Enumeration (leaf 0xd):\n");
     4805    for (uint32_t uSubLeaf = 0; uSubLeaf < 64; uSubLeaf++)
     4806    {
     4807        CPUMCPUID Host;
     4808        ASMCpuIdExSlow(UINT32_C(0x0000000d), 0, uSubLeaf, 0, &Host.uEax, &Host.uEbx, &Host.uEcx, &Host.uEdx);
     4809
     4810        switch (uSubLeaf)
     4811        {
     4812            case 0:
     4813                if (pCurLeaf && pCurLeaf->uSubLeaf == uSubLeaf)
     4814                    pHlp->pfnPrintf(pHlp, "%42s %#x/%#x\n", "XSAVE area cur/max size by XCR0, guest:",
     4815                                    pCurLeaf->uEbx, pCurLeaf->uEcx);
     4816                pHlp->pfnPrintf(pHlp, "%42s %#x/%#x\n", "XSAVE area cur/max size by XCR0, host:",  Host.uEbx, Host.uEcx);
     4817
     4818                if (pCurLeaf && pCurLeaf->uSubLeaf == uSubLeaf)
     4819                    cpumR3CpuIdInfoValueWithMnemonicListU64(pHlp, RT_MAKE_U64(pCurLeaf->uEax, pCurLeaf->uEdx), g_aXSaveStateBits,
     4820                                                            "Valid XCR0 bits, guest:", 42);
     4821                cpumR3CpuIdInfoValueWithMnemonicListU64(pHlp, RT_MAKE_U64(Host.uEax, Host.uEdx), g_aXSaveStateBits,
     4822                                                        "Valid XCR0 bits, host:", 42);
     4823                break;
     4824
     4825            case 1:
     4826                if (pCurLeaf && pCurLeaf->uSubLeaf == uSubLeaf)
     4827                    cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEax, g_aLeaf13Sub1EaxSubFields, "XSAVE features, guest:", 42);
     4828                cpumR3CpuIdInfoMnemonicListU32(pHlp, Host.uEax, g_aLeaf13Sub1EaxSubFields, "XSAVE features, host:", 42);
     4829
     4830                if (pCurLeaf && pCurLeaf->uSubLeaf == uSubLeaf)
     4831                    pHlp->pfnPrintf(pHlp, "%42s %#x\n", "XSAVE area cur size XCR0|XSS, guest:", pCurLeaf->uEbx);
     4832                pHlp->pfnPrintf(pHlp, "%42s %#x\n", "XSAVE area cur size XCR0|XSS, host:", Host.uEbx);
     4833
     4834                if (pCurLeaf && pCurLeaf->uSubLeaf == uSubLeaf)
     4835                    cpumR3CpuIdInfoValueWithMnemonicListU64(pHlp, RT_MAKE_U64(pCurLeaf->uEcx, pCurLeaf->uEdx), g_aXSaveStateBits,
     4836                                                            "  Valid IA32_XSS bits, guest:", 42);
     4837                cpumR3CpuIdInfoValueWithMnemonicListU64(pHlp, RT_MAKE_U64(Host.uEdx, Host.uEcx), g_aXSaveStateBits,
     4838                                                        "  Valid IA32_XSS bits, host:", 42);
     4839                break;
     4840
     4841            default:
     4842                if (   pCurLeaf
     4843                    && pCurLeaf->uSubLeaf == uSubLeaf
     4844                    && (pCurLeaf->uEax || pCurLeaf->uEbx || pCurLeaf->uEcx || pCurLeaf->uEdx) )
     4845                {
     4846                    pHlp->pfnPrintf(pHlp, "  State #%u, guest: off=%#06x, cb=%#06x %s", uSubLeaf, pCurLeaf->uEbx,
     4847                                    pCurLeaf->uEax, pCurLeaf->uEcx & RT_BIT_32(0) ? "XCR0-bit" : "IA32_XSS-bit");
     4848                    if (pCurLeaf->uEcx & ~RT_BIT_32(0))
     4849                        pHlp->pfnPrintf(pHlp, " ECX[reserved]=%#x\n", pCurLeaf->uEcx & ~RT_BIT_32(0));
     4850                    if (pCurLeaf->uEdx)
     4851                        pHlp->pfnPrintf(pHlp, " EDX[reserved]=%#x\n", pCurLeaf->uEdx);
     4852                    pHlp->pfnPrintf(pHlp, " --");
     4853                    cpumR3CpuIdInfoMnemonicListU64(pHlp, RT_BIT_64(uSubLeaf), g_aXSaveStateBits, NULL, 0);
     4854                    pHlp->pfnPrintf(pHlp, "\n");
     4855                }
     4856                if (Host.uEax || Host.uEbx || Host.uEcx || Host.uEdx)
     4857                {
     4858                    pHlp->pfnPrintf(pHlp, "  State #%u, host:  off=%#06x, cb=%#06x %s", uSubLeaf, Host.uEbx,
     4859                                    Host.uEax, Host.uEcx & RT_BIT_32(0) ? "XCR0-bit" : "IA32_XSS-bit");
     4860                    if (Host.uEcx & ~RT_BIT_32(0))
     4861                        pHlp->pfnPrintf(pHlp, " ECX[reserved]=%#x\n", Host.uEcx & ~RT_BIT_32(0));
     4862                    if (Host.uEdx)
     4863                        pHlp->pfnPrintf(pHlp, " EDX[reserved]=%#x\n", Host.uEdx);
     4864                    pHlp->pfnPrintf(pHlp, " --");
     4865                    cpumR3CpuIdInfoMnemonicListU64(pHlp, RT_BIT_64(uSubLeaf), g_aXSaveStateBits, NULL, 0);
     4866                    pHlp->pfnPrintf(pHlp, "\n");
     4867                }
     4868                break;
     4869
     4870        }
     4871
     4872        /* advance. */
     4873        if (pCurLeaf)
     4874        {
     4875            while (   (uintptr_t)(pCurLeaf - paLeaves) < cLeaves
     4876                   && pCurLeaf->uSubLeaf <= uSubLeaf
     4877                   && pCurLeaf->uLeaf == UINT32_C(0x0000000d))
     4878                pCurLeaf++;
     4879            if (   (uintptr_t)(pCurLeaf - paLeaves) >= cLeaves
     4880                || pCurLeaf->uLeaf != UINT32_C(0x0000000d))
     4881                pCurLeaf = NULL;
     4882        }
     4883    }
     4884}
     4885
     4886
    43654887static PCCPUMCPUIDLEAF cpumR3CpuIdInfoRawRange(PCDBGFINFOHLP pHlp, PCCPUMCPUIDLEAF paLeaves, uint32_t cLeaves,
    43664888                                               PCCPUMCPUIDLEAF pCurLeaf, uint32_t uUpToLeaf, const char *pszTitle)
     
    44184940    PCCPUMCPUIDLEAF pCurLeaf;
    44194941    PCCPUMCPUIDLEAF pNextLeaf;
     4942    bool const      fIntel = ASMIsIntelCpuEx(pVM->cpum.s.aGuestCpuIdPatmStd[0].uEbx,
     4943                                             pVM->cpum.s.aGuestCpuIdPatmStd[0].uEcx,
     4944                                             pVM->cpum.s.aGuestCpuIdPatmStd[0].uEdx);
    44204945
    44214946    /*
     
    44704995        }
    44714996    }
     4997    pNextLeaf = pCurLeaf;
    44724998
    44734999    /*
     
    44765002    if (iVerbosity && paLeaves[0].uLeaf == 0)
    44775003        pHlp->pfnPrintf(pHlp,
    4478                         "Name:                            %.04s%.04s%.04s\n"
    4479                         "Supports:                        0-%x\n",
    4480                         &paLeaves[0].uEbx, &paLeaves[0].uEdx, &paLeaves[0].uEcx, paLeaves[0].uEax);
    4481 
    4482     /*
    4483      * Get Features.
    4484      */
    4485     bool const fIntel = ASMIsIntelCpuEx(pVM->cpum.s.aGuestCpuIdPatmStd[0].uEbx,
    4486                                         pVM->cpum.s.aGuestCpuIdPatmStd[0].uEcx,
    4487                                         pVM->cpum.s.aGuestCpuIdPatmStd[0].uEdx);
    4488     if (cGstMax >= 1 && iVerbosity)
    4489     {
    4490         static const char * const s_apszTypes[4] = { "primary", "overdrive", "MP", "reserved" };
    4491 
    4492         PCPUMCPUIDLEAF pFeatures = cpumR3CpuIdGetLeaf(paLeaves, cLeaves, 1, 0);
    4493         uint32_t uEAX = pFeatures ? pFeatures->uEax : 0;
    4494         uint32_t uEBX = pFeatures ? pFeatures->uEbx : 0;
    4495 
    4496         pHlp->pfnPrintf(pHlp,
    4497                         "Family:                          %d  \tExtended: %d \tEffective: %d\n"
    4498                         "Model:                           %d  \tExtended: %d \tEffective: %d\n"
    4499                         "Stepping:                        %d\n"
    4500                         "Type:                            %d (%s)\n"
    4501                         "APIC ID:                         %#04x\n"
    4502                         "Logical CPUs:                    %d\n"
    4503                         "CLFLUSH Size:                    %d\n"
    4504                         "Brand ID:                        %#04x\n",
    4505                         (uEAX >> 8) & 0xf, (uEAX >> 20) & 0x7f, ASMGetCpuFamily(uEAX),
    4506                         (uEAX >> 4) & 0xf, (uEAX >> 16) & 0x0f, ASMGetCpuModel(uEAX, fIntel),
    4507                         ASMGetCpuStepping(uEAX),
    4508                         (uEAX >> 12) & 3, s_apszTypes[(uEAX >> 12) & 3],
    4509                         (uEBX >> 24) & 0xff,
    4510                         (uEBX >> 16) & 0xff,
    4511                         (uEBX >>  8) & 0xff,
    4512                         (uEBX >>  0) & 0xff);
    4513         if (iVerbosity == 1)
    4514         {
    4515             uint32_t uEDX = pFeatures ? pFeatures->uEdx : 0;
    4516             pHlp->pfnPrintf(pHlp, "Features EDX:                   ");
    4517             if (uEDX & RT_BIT(0))   pHlp->pfnPrintf(pHlp, " FPU");
    4518             if (uEDX & RT_BIT(1))   pHlp->pfnPrintf(pHlp, " VME");
    4519             if (uEDX & RT_BIT(2))   pHlp->pfnPrintf(pHlp, " DE");
    4520             if (uEDX & RT_BIT(3))   pHlp->pfnPrintf(pHlp, " PSE");
    4521             if (uEDX & RT_BIT(4))   pHlp->pfnPrintf(pHlp, " TSC");
    4522             if (uEDX & RT_BIT(5))   pHlp->pfnPrintf(pHlp, " MSR");
    4523             if (uEDX & RT_BIT(6))   pHlp->pfnPrintf(pHlp, " PAE");
    4524             if (uEDX & RT_BIT(7))   pHlp->pfnPrintf(pHlp, " MCE");
    4525             if (uEDX & RT_BIT(8))   pHlp->pfnPrintf(pHlp, " CX8");
    4526             if (uEDX & RT_BIT(9))   pHlp->pfnPrintf(pHlp, " APIC");
    4527             if (uEDX & RT_BIT(10))  pHlp->pfnPrintf(pHlp, " 10");
    4528             if (uEDX & RT_BIT(11))  pHlp->pfnPrintf(pHlp, " SEP");
    4529             if (uEDX & RT_BIT(12))  pHlp->pfnPrintf(pHlp, " MTRR");
    4530             if (uEDX & RT_BIT(13))  pHlp->pfnPrintf(pHlp, " PGE");
    4531             if (uEDX & RT_BIT(14))  pHlp->pfnPrintf(pHlp, " MCA");
    4532             if (uEDX & RT_BIT(15))  pHlp->pfnPrintf(pHlp, " CMOV");
    4533             if (uEDX & RT_BIT(16))  pHlp->pfnPrintf(pHlp, " PAT");
    4534             if (uEDX & RT_BIT(17))  pHlp->pfnPrintf(pHlp, " PSE36");
    4535             if (uEDX & RT_BIT(18))  pHlp->pfnPrintf(pHlp, " PSN");
    4536             if (uEDX & RT_BIT(19))  pHlp->pfnPrintf(pHlp, " CLFSH");
    4537             if (uEDX & RT_BIT(20))  pHlp->pfnPrintf(pHlp, " 20");
    4538             if (uEDX & RT_BIT(21))  pHlp->pfnPrintf(pHlp, " DS");
    4539             if (uEDX & RT_BIT(22))  pHlp->pfnPrintf(pHlp, " ACPI");
    4540             if (uEDX & RT_BIT(23))  pHlp->pfnPrintf(pHlp, " MMX");
    4541             if (uEDX & RT_BIT(24))  pHlp->pfnPrintf(pHlp, " FXSR");
    4542             if (uEDX & RT_BIT(25))  pHlp->pfnPrintf(pHlp, " SSE");
    4543             if (uEDX & RT_BIT(26))  pHlp->pfnPrintf(pHlp, " SSE2");
    4544             if (uEDX & RT_BIT(27))  pHlp->pfnPrintf(pHlp, " SS");
    4545             if (uEDX & RT_BIT(28))  pHlp->pfnPrintf(pHlp, " HTT");
    4546             if (uEDX & RT_BIT(29))  pHlp->pfnPrintf(pHlp, " TM");
    4547             if (uEDX & RT_BIT(30))  pHlp->pfnPrintf(pHlp, " 30");
    4548             if (uEDX & RT_BIT(31))  pHlp->pfnPrintf(pHlp, " PBE");
    4549             pHlp->pfnPrintf(pHlp, "\n");
    4550 
    4551             uint32_t uECX = pFeatures ? pFeatures->uEcx : 0;
    4552             pHlp->pfnPrintf(pHlp, "Features ECX:                   ");
    4553             if (uECX & RT_BIT(0))   pHlp->pfnPrintf(pHlp, " SSE3");
    4554             if (uECX & RT_BIT(1))   pHlp->pfnPrintf(pHlp, " PCLMUL");
    4555             if (uECX & RT_BIT(2))   pHlp->pfnPrintf(pHlp, " DTES64");
    4556             if (uECX & RT_BIT(3))   pHlp->pfnPrintf(pHlp, " MONITOR");
    4557             if (uECX & RT_BIT(4))   pHlp->pfnPrintf(pHlp, " DS-CPL");
    4558             if (uECX & RT_BIT(5))   pHlp->pfnPrintf(pHlp, " VMX");
    4559             if (uECX & RT_BIT(6))   pHlp->pfnPrintf(pHlp, " SMX");
    4560             if (uECX & RT_BIT(7))   pHlp->pfnPrintf(pHlp, " EST");
    4561             if (uECX & RT_BIT(8))   pHlp->pfnPrintf(pHlp, " TM2");
    4562             if (uECX & RT_BIT(9))   pHlp->pfnPrintf(pHlp, " SSSE3");
    4563             if (uECX & RT_BIT(10))  pHlp->pfnPrintf(pHlp, " CNXT-ID");
    4564             if (uECX & RT_BIT(11))  pHlp->pfnPrintf(pHlp, " 11");
    4565             if (uECX & RT_BIT(12))  pHlp->pfnPrintf(pHlp, " FMA");
    4566             if (uECX & RT_BIT(13))  pHlp->pfnPrintf(pHlp, " CX16");
    4567             if (uECX & RT_BIT(14))  pHlp->pfnPrintf(pHlp, " TPRUPDATE");
    4568             if (uECX & RT_BIT(15))  pHlp->pfnPrintf(pHlp, " PDCM");
    4569             if (uECX & RT_BIT(16))  pHlp->pfnPrintf(pHlp, " 16");
    4570             if (uECX & RT_BIT(17))  pHlp->pfnPrintf(pHlp, " PCID");
    4571             if (uECX & RT_BIT(18))  pHlp->pfnPrintf(pHlp, " DCA");
    4572             if (uECX & RT_BIT(19))  pHlp->pfnPrintf(pHlp, " SSE4.1");
    4573             if (uECX & RT_BIT(20))  pHlp->pfnPrintf(pHlp, " SSE4.2");
    4574             if (uECX & RT_BIT(21))  pHlp->pfnPrintf(pHlp, " X2APIC");
    4575             if (uECX & RT_BIT(22))  pHlp->pfnPrintf(pHlp, " MOVBE");
    4576             if (uECX & RT_BIT(23))  pHlp->pfnPrintf(pHlp, " POPCNT");
    4577             if (uECX & RT_BIT(24))  pHlp->pfnPrintf(pHlp, " TSCDEADL");
    4578             if (uECX & RT_BIT(25))  pHlp->pfnPrintf(pHlp, " AES");
    4579             if (uECX & RT_BIT(26))  pHlp->pfnPrintf(pHlp, " XSAVE");
    4580             if (uECX & RT_BIT(27))  pHlp->pfnPrintf(pHlp, " OSXSAVE");
    4581             if (uECX & RT_BIT(28))  pHlp->pfnPrintf(pHlp, " AVX");
    4582             if (uECX & RT_BIT(29))  pHlp->pfnPrintf(pHlp, " F16C");
    4583             if (uECX & RT_BIT(30))  pHlp->pfnPrintf(pHlp, " RDRAND");
    4584             if (uECX & RT_BIT(31))  pHlp->pfnPrintf(pHlp, " HVP");
    4585             pHlp->pfnPrintf(pHlp, "\n");
    4586         }
    4587         else
    4588         {
    4589             ASMCpuIdExSlow(1, 0, 0, 0, &Host.uEax, &Host.uEbx, &Host.uEcx, &Host.uEdx);
    4590 
    4591             X86CPUIDFEATEDX EdxHost  = *(PX86CPUIDFEATEDX)&Host.uEdx;
    4592             X86CPUIDFEATECX EcxHost  = *(PX86CPUIDFEATECX)&Host.uEcx;
    4593             X86CPUIDFEATEDX EdxGuest;
    4594             X86CPUIDFEATECX EcxGuest;
    4595             if (pFeatures)
    4596             {
    4597                 EdxGuest = *(PX86CPUIDFEATEDX)&pFeatures->uEdx;
    4598                 EcxGuest = *(PX86CPUIDFEATECX)&pFeatures->uEcx;
    4599             }
    4600             else
    4601             {
    4602                 RT_ZERO(EdxGuest);
    4603                 RT_ZERO(EcxGuest);
    4604             }
    4605 
    4606             pHlp->pfnPrintf(pHlp, "Mnemonic - Description                 = guest (host)\n");
    4607             pHlp->pfnPrintf(pHlp, "FPU - x87 FPU on Chip                  = %d (%d)\n",  EdxGuest.u1FPU,        EdxHost.u1FPU);
    4608             pHlp->pfnPrintf(pHlp, "VME - Virtual 8086 Mode Enhancements   = %d (%d)\n",  EdxGuest.u1VME,        EdxHost.u1VME);
    4609             pHlp->pfnPrintf(pHlp, "DE - Debugging extensions              = %d (%d)\n",  EdxGuest.u1DE,         EdxHost.u1DE);
    4610             pHlp->pfnPrintf(pHlp, "PSE - Page Size Extension              = %d (%d)\n",  EdxGuest.u1PSE,        EdxHost.u1PSE);
    4611             pHlp->pfnPrintf(pHlp, "TSC - Time Stamp Counter               = %d (%d)\n",  EdxGuest.u1TSC,        EdxHost.u1TSC);
    4612             pHlp->pfnPrintf(pHlp, "MSR - Model Specific Registers         = %d (%d)\n",  EdxGuest.u1MSR,        EdxHost.u1MSR);
    4613             pHlp->pfnPrintf(pHlp, "PAE - Physical Address Extension       = %d (%d)\n",  EdxGuest.u1PAE,        EdxHost.u1PAE);
    4614             pHlp->pfnPrintf(pHlp, "MCE - Machine Check Exception          = %d (%d)\n",  EdxGuest.u1MCE,        EdxHost.u1MCE);
    4615             pHlp->pfnPrintf(pHlp, "CX8 - CMPXCHG8B instruction            = %d (%d)\n",  EdxGuest.u1CX8,        EdxHost.u1CX8);
    4616             pHlp->pfnPrintf(pHlp, "APIC - APIC On-Chip                    = %d (%d)\n",  EdxGuest.u1APIC,       EdxHost.u1APIC);
    4617             pHlp->pfnPrintf(pHlp, "10 - Reserved                          = %d (%d)\n",  EdxGuest.u1Reserved1,  EdxHost.u1Reserved1);
    4618             pHlp->pfnPrintf(pHlp, "SEP - SYSENTER and SYSEXIT             = %d (%d)\n",  EdxGuest.u1SEP,        EdxHost.u1SEP);
    4619             pHlp->pfnPrintf(pHlp, "MTRR - Memory Type Range Registers     = %d (%d)\n",  EdxGuest.u1MTRR,       EdxHost.u1MTRR);
    4620             pHlp->pfnPrintf(pHlp, "PGE - PTE Global Bit                   = %d (%d)\n",  EdxGuest.u1PGE,        EdxHost.u1PGE);
    4621             pHlp->pfnPrintf(pHlp, "MCA - Machine Check Architecture       = %d (%d)\n",  EdxGuest.u1MCA,        EdxHost.u1MCA);
    4622             pHlp->pfnPrintf(pHlp, "CMOV - Conditional Move Instructions   = %d (%d)\n",  EdxGuest.u1CMOV,       EdxHost.u1CMOV);
    4623             pHlp->pfnPrintf(pHlp, "PAT - Page Attribute Table             = %d (%d)\n",  EdxGuest.u1PAT,        EdxHost.u1PAT);
    4624             pHlp->pfnPrintf(pHlp, "PSE-36 - 36-bit Page Size Extention    = %d (%d)\n",  EdxGuest.u1PSE36,      EdxHost.u1PSE36);
    4625             pHlp->pfnPrintf(pHlp, "PSN - Processor Serial Number          = %d (%d)\n",  EdxGuest.u1PSN,        EdxHost.u1PSN);
    4626             pHlp->pfnPrintf(pHlp, "CLFSH - CLFLUSH Instruction.           = %d (%d)\n",  EdxGuest.u1CLFSH,      EdxHost.u1CLFSH);
    4627             pHlp->pfnPrintf(pHlp, "20 - Reserved                          = %d (%d)\n",  EdxGuest.u1Reserved2,  EdxHost.u1Reserved2);
    4628             pHlp->pfnPrintf(pHlp, "DS - Debug Store                       = %d (%d)\n",  EdxGuest.u1DS,         EdxHost.u1DS);
    4629             pHlp->pfnPrintf(pHlp, "ACPI - Thermal Mon. & Soft. Clock Ctrl.= %d (%d)\n",  EdxGuest.u1ACPI,       EdxHost.u1ACPI);
    4630             pHlp->pfnPrintf(pHlp, "MMX - Intel MMX Technology             = %d (%d)\n",  EdxGuest.u1MMX,        EdxHost.u1MMX);
    4631             pHlp->pfnPrintf(pHlp, "FXSR - FXSAVE and FXRSTOR Instructions = %d (%d)\n",  EdxGuest.u1FXSR,       EdxHost.u1FXSR);
    4632             pHlp->pfnPrintf(pHlp, "SSE - SSE Support                      = %d (%d)\n",  EdxGuest.u1SSE,        EdxHost.u1SSE);
    4633             pHlp->pfnPrintf(pHlp, "SSE2 - SSE2 Support                    = %d (%d)\n",  EdxGuest.u1SSE2,       EdxHost.u1SSE2);
    4634             pHlp->pfnPrintf(pHlp, "SS - Self Snoop                        = %d (%d)\n",  EdxGuest.u1SS,         EdxHost.u1SS);
    4635             pHlp->pfnPrintf(pHlp, "HTT - Hyper-Threading Technology       = %d (%d)\n",  EdxGuest.u1HTT,        EdxHost.u1HTT);
    4636             pHlp->pfnPrintf(pHlp, "TM - Thermal Monitor                   = %d (%d)\n",  EdxGuest.u1TM,         EdxHost.u1TM);
    4637             pHlp->pfnPrintf(pHlp, "30 - Reserved                          = %d (%d)\n",  EdxGuest.u1Reserved3,  EdxHost.u1Reserved3);
    4638             pHlp->pfnPrintf(pHlp, "PBE - Pending Break Enable             = %d (%d)\n",  EdxGuest.u1PBE,        EdxHost.u1PBE);
    4639 
    4640             pHlp->pfnPrintf(pHlp, "Supports SSE3                          = %d (%d)\n",  EcxGuest.u1SSE3,       EcxHost.u1SSE3);
    4641             pHlp->pfnPrintf(pHlp, "PCLMULQDQ                              = %d (%d)\n",  EcxGuest.u1PCLMULQDQ,  EcxHost.u1PCLMULQDQ);
    4642             pHlp->pfnPrintf(pHlp, "DS Area 64-bit layout                  = %d (%d)\n",  EcxGuest.u1DTE64,      EcxHost.u1DTE64);
    4643             pHlp->pfnPrintf(pHlp, "Supports MONITOR/MWAIT                 = %d (%d)\n",  EcxGuest.u1Monitor,    EcxHost.u1Monitor);
    4644             pHlp->pfnPrintf(pHlp, "CPL-DS - CPL Qualified Debug Store     = %d (%d)\n",  EcxGuest.u1CPLDS,      EcxHost.u1CPLDS);
    4645             pHlp->pfnPrintf(pHlp, "VMX - Virtual Machine Technology       = %d (%d)\n",  EcxGuest.u1VMX,        EcxHost.u1VMX);
    4646             pHlp->pfnPrintf(pHlp, "SMX - Safer Mode Extensions            = %d (%d)\n",  EcxGuest.u1SMX,        EcxHost.u1SMX);
    4647             pHlp->pfnPrintf(pHlp, "Enhanced SpeedStep Technology          = %d (%d)\n",  EcxGuest.u1EST,        EcxHost.u1EST);
    4648             pHlp->pfnPrintf(pHlp, "Terminal Monitor 2                     = %d (%d)\n",  EcxGuest.u1TM2,        EcxHost.u1TM2);
    4649             pHlp->pfnPrintf(pHlp, "Supplemental SSE3 instructions         = %d (%d)\n",  EcxGuest.u1SSSE3,      EcxHost.u1SSSE3);
    4650             pHlp->pfnPrintf(pHlp, "L1 Context ID                          = %d (%d)\n",  EcxGuest.u1CNTXID,     EcxHost.u1CNTXID);
    4651             pHlp->pfnPrintf(pHlp, "11 - Reserved                          = %d (%d)\n",  EcxGuest.u1Reserved1,  EcxHost.u1Reserved1);
    4652             pHlp->pfnPrintf(pHlp, "FMA extensions using YMM state         = %d (%d)\n",  EcxGuest.u1FMA,        EcxHost.u1FMA);
    4653             pHlp->pfnPrintf(pHlp, "CMPXCHG16B instruction                 = %d (%d)\n",  EcxGuest.u1CX16,       EcxHost.u1CX16);
    4654             pHlp->pfnPrintf(pHlp, "xTPR Update Control                    = %d (%d)\n",  EcxGuest.u1TPRUpdate,  EcxHost.u1TPRUpdate);
    4655             pHlp->pfnPrintf(pHlp, "Perf/Debug Capability MSR              = %d (%d)\n",  EcxGuest.u1PDCM,       EcxHost.u1PDCM);
    4656             pHlp->pfnPrintf(pHlp, "16 - Reserved                          = %d (%d)\n",  EcxGuest.u1Reserved2,  EcxHost.u1Reserved2);
    4657             pHlp->pfnPrintf(pHlp, "PCID - Process-context identifiers     = %d (%d)\n",  EcxGuest.u1PCID,       EcxHost.u1PCID);
    4658             pHlp->pfnPrintf(pHlp, "DCA - Direct Cache Access              = %d (%d)\n",  EcxGuest.u1DCA,        EcxHost.u1DCA);
    4659             pHlp->pfnPrintf(pHlp, "SSE4.1 instruction extensions          = %d (%d)\n",  EcxGuest.u1SSE4_1,     EcxHost.u1SSE4_1);
    4660             pHlp->pfnPrintf(pHlp, "SSE4.2 instruction extensions          = %d (%d)\n",  EcxGuest.u1SSE4_2,     EcxHost.u1SSE4_2);
    4661             pHlp->pfnPrintf(pHlp, "Supports the x2APIC extensions         = %d (%d)\n",  EcxGuest.u1x2APIC,     EcxHost.u1x2APIC);
    4662             pHlp->pfnPrintf(pHlp, "MOVBE instruction                      = %d (%d)\n",  EcxGuest.u1MOVBE,      EcxHost.u1MOVBE);
    4663             pHlp->pfnPrintf(pHlp, "POPCNT instruction                     = %d (%d)\n",  EcxGuest.u1POPCNT,     EcxHost.u1POPCNT);
    4664             pHlp->pfnPrintf(pHlp, "TSC-Deadline LAPIC timer mode          = %d (%d)\n",  EcxGuest.u1TSCDEADLINE,EcxHost.u1TSCDEADLINE);
    4665             pHlp->pfnPrintf(pHlp, "AESNI instruction extensions           = %d (%d)\n",  EcxGuest.u1AES,        EcxHost.u1AES);
    4666             pHlp->pfnPrintf(pHlp, "XSAVE/XRSTOR extended state feature    = %d (%d)\n",  EcxGuest.u1XSAVE,      EcxHost.u1XSAVE);
    4667             pHlp->pfnPrintf(pHlp, "Supports OSXSAVE                       = %d (%d)\n",  EcxGuest.u1OSXSAVE,    EcxHost.u1OSXSAVE);
    4668             pHlp->pfnPrintf(pHlp, "AVX instruction extensions             = %d (%d)\n",  EcxGuest.u1AVX,        EcxHost.u1AVX);
    4669             pHlp->pfnPrintf(pHlp, "16-bit floating point conversion instr = %d (%d)\n",  EcxGuest.u1F16C,       EcxHost.u1F16C);
    4670             pHlp->pfnPrintf(pHlp, "RDRAND instruction                     = %d (%d)\n",  EcxGuest.u1RDRAND,     EcxHost.u1RDRAND);
    4671             pHlp->pfnPrintf(pHlp, "Hypervisor Present (we're a guest)     = %d (%d)\n",  EcxGuest.u1HVP,        EcxHost.u1HVP);
    4672         }
    4673     }
    4674     if (cGstMax >= 2 && iVerbosity)
    4675     {
    4676         /** @todo */
    4677     }
     5004                        "%36s %.04s%.04s%.04s\n"
     5005                        "%36s 0x00000000-%#010x\n"
     5006                        ,
     5007                        "Name:", &paLeaves[0].uEbx, &paLeaves[0].uEdx, &paLeaves[0].uEcx,
     5008                        "Supports:", paLeaves[0].uEax);
     5009
     5010    if (iVerbosity && (pCurLeaf = cpumR3CpuIdGetLeaf(paLeaves, cLeaves, UINT32_C(0x00000001), 0)) != NULL)
     5011        cpumR3CpuIdInfoStdLeaf1Details(pHlp, paLeaves, cLeaves, pCurLeaf, iVerbosity > 1, fIntel);
     5012
     5013    if (iVerbosity && (pCurLeaf = cpumR3CpuIdGetLeaf(paLeaves, cLeaves, UINT32_C(0x00000007), 0)) != NULL)
     5014        cpumR3CpuIdInfoStdLeaf7Details(pHlp, paLeaves, cLeaves, pCurLeaf, iVerbosity > 1);
     5015
     5016    if (iVerbosity && (pCurLeaf = cpumR3CpuIdGetLeaf(paLeaves, cLeaves, UINT32_C(0x0000000d), 0)) != NULL)
     5017        cpumR3CpuIdInfoStdLeaf13Details(pHlp, paLeaves, cLeaves, pCurLeaf, iVerbosity > 1);
     5018
     5019    pCurLeaf = pNextLeaf;
    46785020
    46795021    /*
     
    47795121            if (iVerbosity == 1)
    47805122            {
    4781                 uint32_t uEDX = pCurLeaf->uEdx;
    4782                 pHlp->pfnPrintf(pHlp, "Features EDX:                   ");
    4783                 if (uEDX & RT_BIT(0))   pHlp->pfnPrintf(pHlp, " FPU");
    4784                 if (uEDX & RT_BIT(1))   pHlp->pfnPrintf(pHlp, " VME");
    4785                 if (uEDX & RT_BIT(2))   pHlp->pfnPrintf(pHlp, " DE");
    4786                 if (uEDX & RT_BIT(3))   pHlp->pfnPrintf(pHlp, " PSE");
    4787                 if (uEDX & RT_BIT(4))   pHlp->pfnPrintf(pHlp, " TSC");
    4788                 if (uEDX & RT_BIT(5))   pHlp->pfnPrintf(pHlp, " MSR");
    4789                 if (uEDX & RT_BIT(6))   pHlp->pfnPrintf(pHlp, " PAE");
    4790                 if (uEDX & RT_BIT(7))   pHlp->pfnPrintf(pHlp, " MCE");
    4791                 if (uEDX & RT_BIT(8))   pHlp->pfnPrintf(pHlp, " CX8");
    4792                 if (uEDX & RT_BIT(9))   pHlp->pfnPrintf(pHlp, " APIC");
    4793                 if (uEDX & RT_BIT(10))  pHlp->pfnPrintf(pHlp, " 10");
    4794                 if (uEDX & RT_BIT(11))  pHlp->pfnPrintf(pHlp, " SCR");
    4795                 if (uEDX & RT_BIT(12))  pHlp->pfnPrintf(pHlp, " MTRR");
    4796                 if (uEDX & RT_BIT(13))  pHlp->pfnPrintf(pHlp, " PGE");
    4797                 if (uEDX & RT_BIT(14))  pHlp->pfnPrintf(pHlp, " MCA");
    4798                 if (uEDX & RT_BIT(15))  pHlp->pfnPrintf(pHlp, " CMOV");
    4799                 if (uEDX & RT_BIT(16))  pHlp->pfnPrintf(pHlp, " PAT");
    4800                 if (uEDX & RT_BIT(17))  pHlp->pfnPrintf(pHlp, " PSE36");
    4801                 if (uEDX & RT_BIT(18))  pHlp->pfnPrintf(pHlp, " 18");
    4802                 if (uEDX & RT_BIT(19))  pHlp->pfnPrintf(pHlp, " 19");
    4803                 if (uEDX & RT_BIT(20))  pHlp->pfnPrintf(pHlp, " NX");
    4804                 if (uEDX & RT_BIT(21))  pHlp->pfnPrintf(pHlp, " 21");
    4805                 if (uEDX & RT_BIT(22))  pHlp->pfnPrintf(pHlp, " ExtMMX");
    4806                 if (uEDX & RT_BIT(23))  pHlp->pfnPrintf(pHlp, " MMX");
    4807                 if (uEDX & RT_BIT(24))  pHlp->pfnPrintf(pHlp, " FXSR");
    4808                 if (uEDX & RT_BIT(25))  pHlp->pfnPrintf(pHlp, " FastFXSR");
    4809                 if (uEDX & RT_BIT(26))  pHlp->pfnPrintf(pHlp, " Page1GB");
    4810                 if (uEDX & RT_BIT(27))  pHlp->pfnPrintf(pHlp, " RDTSCP");
    4811                 if (uEDX & RT_BIT(28))  pHlp->pfnPrintf(pHlp, " 28");
    4812                 if (uEDX & RT_BIT(29))  pHlp->pfnPrintf(pHlp, " LongMode");
    4813                 if (uEDX & RT_BIT(30))  pHlp->pfnPrintf(pHlp, " Ext3DNow");
    4814                 if (uEDX & RT_BIT(31))  pHlp->pfnPrintf(pHlp, " 3DNow");
    4815                 pHlp->pfnPrintf(pHlp, "\n");
    4816 
    4817                 uint32_t uECX = pCurLeaf->uEcx;
    4818                 pHlp->pfnPrintf(pHlp, "Features ECX:                   ");
    4819                 if (uECX & RT_BIT(0))   pHlp->pfnPrintf(pHlp, " LAHF/SAHF");
    4820                 if (uECX & RT_BIT(1))   pHlp->pfnPrintf(pHlp, " CMPL");
    4821                 if (uECX & RT_BIT(2))   pHlp->pfnPrintf(pHlp, " SVM");
    4822                 if (uECX & RT_BIT(3))   pHlp->pfnPrintf(pHlp, " ExtAPIC");
    4823                 if (uECX & RT_BIT(4))   pHlp->pfnPrintf(pHlp, " CR8L");
    4824                 if (uECX & RT_BIT(5))   pHlp->pfnPrintf(pHlp, " ABM");
    4825                 if (uECX & RT_BIT(6))   pHlp->pfnPrintf(pHlp, " SSE4A");
    4826                 if (uECX & RT_BIT(7))   pHlp->pfnPrintf(pHlp, " MISALNSSE");
    4827                 if (uECX & RT_BIT(8))   pHlp->pfnPrintf(pHlp, " 3DNOWPRF");
    4828                 if (uECX & RT_BIT(9))   pHlp->pfnPrintf(pHlp, " OSVW");
    4829                 if (uECX & RT_BIT(10))  pHlp->pfnPrintf(pHlp, " IBS");
    4830                 if (uECX & RT_BIT(11))  pHlp->pfnPrintf(pHlp, " SSE5");
    4831                 if (uECX & RT_BIT(12))  pHlp->pfnPrintf(pHlp, " SKINIT");
    4832                 if (uECX & RT_BIT(13))  pHlp->pfnPrintf(pHlp, " WDT");
    4833                 for (unsigned iBit = 5; iBit < 32; iBit++)
    4834                     if (uECX & RT_BIT(iBit))
    4835                         pHlp->pfnPrintf(pHlp, " %d", iBit);
    4836                 pHlp->pfnPrintf(pHlp, "\n");
     5123                cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEdx, g_aExtLeaf1EdxSubFields, "Ext Features EDX:", 34);
     5124                cpumR3CpuIdInfoMnemonicListU32(pHlp, pCurLeaf->uEcx, g_aExtLeaf1EdxSubFields, "Ext Features ECX:", 34);
    48375125            }
    48385126            else
    48395127            {
    48405128                ASMCpuIdExSlow(0x80000001, 0, 0, 0, &Host.uEax, &Host.uEbx, &Host.uEcx, &Host.uEdx);
    4841 
    4842                 uint32_t uEdxGst = pCurLeaf->uEdx;
    4843                 uint32_t uEdxHst = Host.uEdx;
    4844                 pHlp->pfnPrintf(pHlp, "Mnemonic - Description                 = guest (host)\n");
    4845                 pHlp->pfnPrintf(pHlp, "FPU - x87 FPU on Chip                  = %d (%d)\n",  !!(uEdxGst & RT_BIT( 0)),  !!(uEdxHst & RT_BIT( 0)));
    4846                 pHlp->pfnPrintf(pHlp, "VME - Virtual 8086 Mode Enhancements   = %d (%d)\n",  !!(uEdxGst & RT_BIT( 1)),  !!(uEdxHst & RT_BIT( 1)));
    4847                 pHlp->pfnPrintf(pHlp, "DE - Debugging extensions              = %d (%d)\n",  !!(uEdxGst & RT_BIT( 2)),  !!(uEdxHst & RT_BIT( 2)));
    4848                 pHlp->pfnPrintf(pHlp, "PSE - Page Size Extension              = %d (%d)\n",  !!(uEdxGst & RT_BIT( 3)),  !!(uEdxHst & RT_BIT( 3)));
    4849                 pHlp->pfnPrintf(pHlp, "TSC - Time Stamp Counter               = %d (%d)\n",  !!(uEdxGst & RT_BIT( 4)),  !!(uEdxHst & RT_BIT( 4)));
    4850                 pHlp->pfnPrintf(pHlp, "MSR - K86 Model Specific Registers     = %d (%d)\n",  !!(uEdxGst & RT_BIT( 5)),  !!(uEdxHst & RT_BIT( 5)));
    4851                 pHlp->pfnPrintf(pHlp, "PAE - Physical Address Extension       = %d (%d)\n",  !!(uEdxGst & RT_BIT( 6)),  !!(uEdxHst & RT_BIT( 6)));
    4852                 pHlp->pfnPrintf(pHlp, "MCE - Machine Check Exception          = %d (%d)\n",  !!(uEdxGst & RT_BIT( 7)),  !!(uEdxHst & RT_BIT( 7)));
    4853                 pHlp->pfnPrintf(pHlp, "CX8 - CMPXCHG8B instruction            = %d (%d)\n",  !!(uEdxGst & RT_BIT( 8)),  !!(uEdxHst & RT_BIT( 8)));
    4854                 pHlp->pfnPrintf(pHlp, "APIC - APIC On-Chip                    = %d (%d)\n",  !!(uEdxGst & RT_BIT( 9)),  !!(uEdxHst & RT_BIT( 9)));
    4855                 pHlp->pfnPrintf(pHlp, "10 - Reserved                          = %d (%d)\n",  !!(uEdxGst & RT_BIT(10)),  !!(uEdxHst & RT_BIT(10)));
    4856                 pHlp->pfnPrintf(pHlp, "SEP - SYSCALL and SYSRET               = %d (%d)\n",  !!(uEdxGst & RT_BIT(11)),  !!(uEdxHst & RT_BIT(11)));
    4857                 pHlp->pfnPrintf(pHlp, "MTRR - Memory Type Range Registers     = %d (%d)\n",  !!(uEdxGst & RT_BIT(12)),  !!(uEdxHst & RT_BIT(12)));
    4858                 pHlp->pfnPrintf(pHlp, "PGE - PTE Global Bit                   = %d (%d)\n",  !!(uEdxGst & RT_BIT(13)),  !!(uEdxHst & RT_BIT(13)));
    4859                 pHlp->pfnPrintf(pHlp, "MCA - Machine Check Architecture       = %d (%d)\n",  !!(uEdxGst & RT_BIT(14)),  !!(uEdxHst & RT_BIT(14)));
    4860                 pHlp->pfnPrintf(pHlp, "CMOV - Conditional Move Instructions   = %d (%d)\n",  !!(uEdxGst & RT_BIT(15)),  !!(uEdxHst & RT_BIT(15)));
    4861                 pHlp->pfnPrintf(pHlp, "PAT - Page Attribute Table             = %d (%d)\n",  !!(uEdxGst & RT_BIT(16)),  !!(uEdxHst & RT_BIT(16)));
    4862                 pHlp->pfnPrintf(pHlp, "PSE-36 - 36-bit Page Size Extention    = %d (%d)\n",  !!(uEdxGst & RT_BIT(17)),  !!(uEdxHst & RT_BIT(17)));
    4863                 pHlp->pfnPrintf(pHlp, "18 - Reserved                          = %d (%d)\n",  !!(uEdxGst & RT_BIT(18)),  !!(uEdxHst & RT_BIT(18)));
    4864                 pHlp->pfnPrintf(pHlp, "19 - Reserved                          = %d (%d)\n",  !!(uEdxGst & RT_BIT(19)),  !!(uEdxHst & RT_BIT(19)));
    4865                 pHlp->pfnPrintf(pHlp, "NX - No-Execute Page Protection        = %d (%d)\n",  !!(uEdxGst & RT_BIT(20)),  !!(uEdxHst & RT_BIT(20)));
    4866                 pHlp->pfnPrintf(pHlp, "DS - Debug Store                       = %d (%d)\n",  !!(uEdxGst & RT_BIT(21)),  !!(uEdxHst & RT_BIT(21)));
    4867                 pHlp->pfnPrintf(pHlp, "AXMMX - AMD Extensions to MMX Instr.   = %d (%d)\n",  !!(uEdxGst & RT_BIT(22)),  !!(uEdxHst & RT_BIT(22)));
    4868                 pHlp->pfnPrintf(pHlp, "MMX - Intel MMX Technology             = %d (%d)\n",  !!(uEdxGst & RT_BIT(23)),  !!(uEdxHst & RT_BIT(23)));
    4869                 pHlp->pfnPrintf(pHlp, "FXSR - FXSAVE and FXRSTOR Instructions = %d (%d)\n",  !!(uEdxGst & RT_BIT(24)),  !!(uEdxHst & RT_BIT(24)));
    4870                 pHlp->pfnPrintf(pHlp, "25 - AMD fast FXSAVE and FXRSTOR Instr.= %d (%d)\n",  !!(uEdxGst & RT_BIT(25)),  !!(uEdxHst & RT_BIT(25)));
    4871                 pHlp->pfnPrintf(pHlp, "26 - 1 GB large page support           = %d (%d)\n",  !!(uEdxGst & RT_BIT(26)),  !!(uEdxHst & RT_BIT(26)));
    4872                 pHlp->pfnPrintf(pHlp, "27 - RDTSCP instruction                = %d (%d)\n",  !!(uEdxGst & RT_BIT(27)),  !!(uEdxHst & RT_BIT(27)));
    4873                 pHlp->pfnPrintf(pHlp, "28 - Reserved                          = %d (%d)\n",  !!(uEdxGst & RT_BIT(28)),  !!(uEdxHst & RT_BIT(28)));
    4874                 pHlp->pfnPrintf(pHlp, "29 - AMD Long Mode                     = %d (%d)\n",  !!(uEdxGst & RT_BIT(29)),  !!(uEdxHst & RT_BIT(29)));
    4875                 pHlp->pfnPrintf(pHlp, "30 - AMD Extensions to 3DNow!          = %d (%d)\n",  !!(uEdxGst & RT_BIT(30)),  !!(uEdxHst & RT_BIT(30)));
    4876                 pHlp->pfnPrintf(pHlp, "31 - AMD 3DNow!                        = %d (%d)\n",  !!(uEdxGst & RT_BIT(31)),  !!(uEdxHst & RT_BIT(31)));
    4877 
    4878                 uint32_t uEcxGst = pCurLeaf->uEcx;
    4879                 uint32_t uEcxHst = Host.uEcx;
    4880                 pHlp->pfnPrintf(pHlp, "LahfSahf - LAHF/SAHF in 64-bit mode    = %d (%d)\n",  !!(uEcxGst & RT_BIT( 0)),  !!(uEcxHst & RT_BIT( 0)));
    4881                 pHlp->pfnPrintf(pHlp, "CmpLegacy - Core MP legacy mode (depr) = %d (%d)\n",  !!(uEcxGst & RT_BIT( 1)),  !!(uEcxHst & RT_BIT( 1)));
    4882                 pHlp->pfnPrintf(pHlp, "SVM - AMD VM Extensions                = %d (%d)\n",  !!(uEcxGst & RT_BIT( 2)),  !!(uEcxHst & RT_BIT( 2)));
    4883                 pHlp->pfnPrintf(pHlp, "APIC registers starting at 0x400       = %d (%d)\n",  !!(uEcxGst & RT_BIT( 3)),  !!(uEcxHst & RT_BIT( 3)));
    4884                 pHlp->pfnPrintf(pHlp, "AltMovCR8 - LOCK MOV CR0 means MOV CR8 = %d (%d)\n",  !!(uEcxGst & RT_BIT( 4)),  !!(uEcxHst & RT_BIT( 4)));
    4885                 pHlp->pfnPrintf(pHlp, "5  - Advanced bit manipulation         = %d (%d)\n",  !!(uEcxGst & RT_BIT( 5)),  !!(uEcxHst & RT_BIT( 5)));
    4886                 pHlp->pfnPrintf(pHlp, "6  - SSE4A instruction support         = %d (%d)\n",  !!(uEcxGst & RT_BIT( 6)),  !!(uEcxHst & RT_BIT( 6)));
    4887                 pHlp->pfnPrintf(pHlp, "7  - Misaligned SSE mode               = %d (%d)\n",  !!(uEcxGst & RT_BIT( 7)),  !!(uEcxHst & RT_BIT( 7)));
    4888                 pHlp->pfnPrintf(pHlp, "8  - PREFETCH and PREFETCHW instruction= %d (%d)\n",  !!(uEcxGst & RT_BIT( 8)),  !!(uEcxHst & RT_BIT( 8)));
    4889                 pHlp->pfnPrintf(pHlp, "9  - OS visible workaround             = %d (%d)\n",  !!(uEcxGst & RT_BIT( 9)),  !!(uEcxHst & RT_BIT( 9)));
    4890                 pHlp->pfnPrintf(pHlp, "10 - Instruction based sampling        = %d (%d)\n",  !!(uEcxGst & RT_BIT(10)),  !!(uEcxHst & RT_BIT(10)));
    4891                 pHlp->pfnPrintf(pHlp, "11 - SSE5 support                      = %d (%d)\n",  !!(uEcxGst & RT_BIT(11)),  !!(uEcxHst & RT_BIT(11)));
    4892                 pHlp->pfnPrintf(pHlp, "12 - SKINIT, STGI, and DEV support     = %d (%d)\n",  !!(uEcxGst & RT_BIT(12)),  !!(uEcxHst & RT_BIT(12)));
    4893                 pHlp->pfnPrintf(pHlp, "13 - Watchdog timer support.           = %d (%d)\n",  !!(uEcxGst & RT_BIT(13)),  !!(uEcxHst & RT_BIT(13)));
    4894                 pHlp->pfnPrintf(pHlp, "31:14 - Reserved                       = %#x (%#x)\n",   uEcxGst >> 14,          uEcxHst >> 14);
     5129                pHlp->pfnPrintf(pHlp, "Ext Features\n");
     5130                pHlp->pfnPrintf(pHlp, "  Mnemonic - Description                                  = guest (host)\n");
     5131                cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEdx, Host.uEdx, g_aExtLeaf1EdxSubFields, 56);
     5132                cpumR3CpuIdInfoVerboseCompareListU32(pHlp, pCurLeaf->uEcx, Host.uEcx, g_aExtLeaf1EcxSubFields, 56);
    48955133            }
    48965134        }
     
    49205158                *pu32++ = pCurLeaf->uEdx;
    49215159            }
    4922             pHlp->pfnPrintf(pHlp, "Full Name:                       %s\n", szString);
     5160            pHlp->pfnPrintf(pHlp, "Full Name:                       \"%s\"\n", szString);
    49235161        }
    49245162
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette