dump all supported CPU fetures into Bochs log from CPUID object

This commit is contained in:
Stanislav Shwartsman 2019-01-05 20:17:39 +00:00
parent 264b797363
commit 9bc7faf493
4 changed files with 121 additions and 3 deletions

View File

@ -26,6 +26,110 @@
#include "param_names.h"
#include "cpuid.h"
static const char *cpu_feature_name[]
{
"386ni", // BX_ISA_386
"x87", // BX_ISA_X87
"486ni", // BX_ISA_486
"pentium_ni", // BX_ISA_PENTIUM
"p6ni", // BX_ISA_P6
"mmx", // BX_ISA_MMX
"3dnow!", // BX_ISA_3DNOW
"debugext", // BX_ISA_DEBUG_EXTENSIONS
"vme", // BX_ISA_VME
"pse", // BX_ISA_PSE
"pae", // BX_ISA_PAE
"pge", // BX_ISA_PGE
"pse36", // BX_ISA_PSE36
"mtrr", // BX_ISA_MTRR
"pat", // BX_ISA_PAT
"legacy_syscall_sysret", // BX_ISA_SYSCALL_SYSRET_LEGACY
"sysenter_sysexit", // BX_ISA_SYSENTER_SYSEXIT
"clflush", // BX_ISA_CLFLUSH
"clflushout", // BX_ISA_CLFLUSHOPT
"clwb", // BX_ISA_CLWB
"cldemote", // BX_ISA_CLDEMOTE
"sse", // BX_ISA_SSE
"sse2", // BX_ISA_SSE2
"sse3", // BX_ISA_SSE3
"ssse3", // BX_ISA_SSSE3
"sse4_1", // BX_ISA_SSE4_1
"sse4_2", // BX_ISA_SSE4_2
"popcnt", // BX_ISA_POPCNT
"mwait", // BX_ISA_MONITOR_MWAIT
"mwaitx", // BX_ISA_MONITORX_MWAITX
"waitpkg", // BX_ISA_WAITPKG
"vmx", // BX_ISA_VMX
"smx", // BX_ISA_SMX
"longmode", // BX_ISA_LONG_MODE
"lm_lahf_sahf", // BX_ISA_LM_LAHF_SAHF
"nx", // BX_ISA_NX
"1g_pages", // BX_ISA_1G_PAGES
"cmpxhg16b", // BX_ISA_CMPXCHG16B
"rdtscp", // BX_ISA_RDTSCP
"ffxsr", // BX_ISA_FFXSR
"xsave", // BX_ISA_XSAVE
"xsaveopt", // BX_ISA_XSAVEOPT
"xsavec", // BX_ISA_XSAVEC
"xsaves", // BX_ISA_XSAVES
"aes_pclmulqdq", // BX_ISA_AES_PCLMULQDQ
"vaes_vpclmulqdq", // BX_ISA_VAES_VPCLMULQDQ
"movbe", // BX_ISA_MOVBE
"fsgsbase", // BX_ISA_FSGSBASE
"invpcid", // BX_ISA_INVPCID
"avx", // BX_ISA_AVX
"avx2", // BX_ISA_AVX2
"avx_f16c", // BX_ISA_AVX_F16C
"avx_fma", // BX_ISA_AVX_FMA
"altmovcr8", // BX_ISA_ALT_MOV_CR8
"sse4a", // BX_ISA_SSE4A
"misaligned_sse", // BX_ISA_MISALIGNED_SSE
"lzcnt", // BX_ISA_LZCNT
"bmi1", // BX_ISA_BMI1
"bmi2", // BX_ISA_BMI2
"fma4", // BX_ISA_FMA4
"xop", // BX_ISA_XOP
"tbm", // BX_ISA_TBM
"svm", // BX_ISA_SVM
"rdrand", // BX_ISA_RDRAND
"adx", // BX_ISA_ADX
"smap", // BX_ISA_SMAP
"rdseed", // BX_ISA_RDSEED
"sha", // BX_ISA_SHA
"gfni", // BX_ISA_GFNI
"avx512", // BX_ISA_AVX512
"avx512cd", // BX_ISA_AVX512_CD
"avx512pf", // BX_ISA_AVX512_PF
"avx512er", // BX_ISA_AVX512_ER
"avx512dq", // BX_ISA_AVX512_DQ
"avx512bw", // BX_ISA_AVX512_BW
"avx512vl", // BX_ISA_AVX512_VL
"avx512vbmi", // BX_ISA_AVX512_VBMI
"avx512vbmi2", // BX_ISA_AVX512_VBMI2
"avx512ifma52", // BX_ISA_AVX512_IFMA52
"avx512ivpopcnt", // BX_ISA_AVX512_VPOPCNTDQ
"avx512ivnni", // BX_ISA_AVX512_VNNI
"avx512ibitalg", // BX_ISA_AVX512_BITALG
"xapic", // BX_ISA_XAPIC
"x2apic", // BX_ISA_X2APIC
"xapicext", // BX_ISA_XAPICEXT
"pcid", // BX_ISA_PCID
"smep", // BX_ISA_SMEP
"tsc_deadline", // BX_ISA_TSC_DEADLINE
"fopcode_deprecation", // BX_ISA_FOPCODE_DEPRECATION
"fcs_fds_deprecation", // BX_ISA_FCS_FDS_DEPRECATION
"fdp_deprecation", // BX_ISA_FDP_DEPRECATION
"pku", // BX_ISA_PKU
"umip", // BX_ISA_UMIP
"rdpid", // BX_ISA_RDPID
"tce", // BX_ISA_TCE
"clzero", // BX_ISA_CLZERO
"movdiri", // BX_ISA_MOVDIRI
"movdiri64", // BX_ISA_MOVDIRI64
};
const char *get_cpu_feature_name(unsigned feature) { return cpu_feature_name[feature]; }
#define LOG_THIS cpu->
bx_cpuid_t::bx_cpuid_t(BX_CPU_C *_cpu): cpu(_cpu)
{
@ -34,13 +138,13 @@ bx_cpuid_t::bx_cpuid_t(BX_CPU_C *_cpu): cpu(_cpu)
#if BX_SUPPORT_VMX
bx_cpuid_t::bx_cpuid_t(BX_CPU_C *_cpu, Bit32u vmcs_revision):
cpu(_cpu), vmcs_map(vmcs_revision)
cpu(_cpu), vmcs_map(vmcs_revision)
{
init();
}
bx_cpuid_t::bx_cpuid_t(BX_CPU_C *_cpu, Bit32u vmcs_revision, const char *filename):
cpu(_cpu), vmcs_map(vmcs_revision, filename)
cpu(_cpu), vmcs_map(vmcs_revision, filename)
{
init();
}
@ -434,3 +538,11 @@ void bx_cpuid_t::warning_messages(unsigned extension) const
break;
}
}
void bx_cpuid_t::dump_features() const
{
BX_INFO(("CPU Features supported:"));
for (unsigned i=1; i<BX_ISA_EXTENSION_LAST; i++)
if (is_cpu_extension_supported(i))
BX_INFO(("\t\t%s", cpu_feature_name[i]));
}

View File

@ -68,6 +68,8 @@ public:
virtual void dump_cpuid(void) const = 0;
void dump_features() const;
#if BX_CPU_LEVEL >= 5
virtual int rdmsr(Bit32u index, Bit64u *msr) { return -1; }
virtual int wrmsr(Bit32u index, Bit64u msr) { return -1; }
@ -137,6 +139,8 @@ protected:
#endif
};
extern const char *get_cpu_feature_name(unsigned feature);
typedef bx_cpuid_t* (*bx_create_cpuid_method)(BX_CPU_C *cpu);
// cpuid VMX features

View File

@ -23,7 +23,7 @@
#define BX_X86_DECODER_H
// x86 Arch features
enum {
enum x86_feature_name {
BX_ISA_386 = 0, /* 386 or earlier instruction */
BX_ISA_X87, /* FPU (X87) instruction */
BX_ISA_486, /* 486 new instruction */

View File

@ -1050,6 +1050,8 @@ void BX_CPU_C::reset(unsigned source)
BX_CPU_THIS_PTR cpuid->dump_cpuid();
#endif
BX_CPU_THIS_PTR cpuid->dump_features();
BX_INSTR_RESET(BX_CPU_ID, source);
}