Merge remote-tracking branch 'afaerber/qom-cpu' into staging
* afaerber/qom-cpu: target-alpha: Initialize env->cpu_model_str target-i386: Drop unused setscalar() macro target-i386: Kill cpudef config section support target-i386: x86_cpudef_setup() coding style change Eliminate cpus-x86_64.conf file target-i386: Move CPU models from cpus-x86_64.conf to C target-i386: Add missing CPUID_* constants Drop cpu_list_id macro target-i386: Fold -cpu ?cpuid, ?model output into -cpu help, drop ?dump MAINTAINERS: Add entry for QOM CPU
This commit is contained in:
commit
97fe81d3e8
@ -531,6 +531,12 @@ M: Anthony Liguori <aliguori@us.ibm.com>
|
||||
S: Maintained
|
||||
F: qemu-char.c
|
||||
|
||||
CPU
|
||||
M: Andreas Färber <afaerber@suse.de>
|
||||
S: Supported
|
||||
F: qom/cpu.c
|
||||
F: include/qemu/cpu.h
|
||||
|
||||
Device Tree
|
||||
M: Peter Crosthwaite <peter.crosthwaite@petalogix.com>
|
||||
M: Alexander Graf <agraf@suse.de>
|
||||
|
1
Makefile
1
Makefile
@ -298,7 +298,6 @@ install-confdir:
|
||||
|
||||
install-sysconfig: install-datadir install-confdir
|
||||
$(INSTALL_DATA) $(SRC_PATH)/sysconfigs/target/target-x86_64.conf "$(DESTDIR)$(qemu_confdir)"
|
||||
$(INSTALL_DATA) $(SRC_PATH)/sysconfigs/target/cpus-x86_64.conf "$(DESTDIR)$(qemu_datadir)"
|
||||
|
||||
install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig install-datadir
|
||||
$(INSTALL_DIR) "$(DESTDIR)$(bindir)"
|
||||
|
@ -136,7 +136,6 @@ static struct defconfig_file {
|
||||
/* Indicates it is an user config file (disabled by -no-user-config) */
|
||||
bool userconfig;
|
||||
} default_config_files[] = {
|
||||
{ CONFIG_QEMU_DATADIR "/cpus-" TARGET_ARCH ".conf", false },
|
||||
{ CONFIG_QEMU_CONFDIR "/qemu.conf", true },
|
||||
{ CONFIG_QEMU_CONFDIR "/target-" TARGET_ARCH ".conf", true },
|
||||
{ NULL }, /* end of list */
|
||||
|
6
cpus.c
6
cpus.c
@ -1192,10 +1192,8 @@ void set_cpu_log_filename(const char *optarg)
|
||||
void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
|
||||
{
|
||||
/* XXX: implement xxx_cpu_list for targets that still miss it */
|
||||
#if defined(cpu_list_id)
|
||||
cpu_list_id(f, cpu_fprintf, optarg);
|
||||
#elif defined(cpu_list)
|
||||
cpu_list(f, cpu_fprintf); /* deprecated */
|
||||
#if defined(cpu_list)
|
||||
cpu_list(f, cpu_fprintf);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -3130,10 +3130,8 @@ static void handle_arg_cpu(const char *arg)
|
||||
cpu_model = strdup(arg);
|
||||
if (cpu_model == NULL || is_help_option(cpu_model)) {
|
||||
/* XXX: implement xxx_cpu_list for targets that still miss it */
|
||||
#if defined(cpu_list_id)
|
||||
cpu_list_id(stdout, &fprintf, "");
|
||||
#elif defined(cpu_list)
|
||||
cpu_list(stdout, &fprintf); /* deprecated */
|
||||
#if defined(cpu_list)
|
||||
cpu_list(stdout, &fprintf);
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
|
@ -1,128 +0,0 @@
|
||||
# x86 CPU MODELS
|
||||
|
||||
[cpudef]
|
||||
name = "Conroe"
|
||||
level = "2"
|
||||
vendor = "GenuineIntel"
|
||||
family = "6"
|
||||
model = "2"
|
||||
stepping = "3"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "ssse3 sse3"
|
||||
extfeature_edx = "i64 xd syscall"
|
||||
extfeature_ecx = "lahf_lm"
|
||||
xlevel = "0x8000000A"
|
||||
model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)"
|
||||
|
||||
[cpudef]
|
||||
name = "Penryn"
|
||||
level = "2"
|
||||
vendor = "GenuineIntel"
|
||||
family = "6"
|
||||
model = "2"
|
||||
stepping = "3"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "sse4.1 cx16 ssse3 sse3"
|
||||
extfeature_edx = "i64 xd syscall"
|
||||
extfeature_ecx = "lahf_lm"
|
||||
xlevel = "0x8000000A"
|
||||
model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)"
|
||||
|
||||
[cpudef]
|
||||
name = "Nehalem"
|
||||
level = "2"
|
||||
vendor = "GenuineIntel"
|
||||
family = "6"
|
||||
model = "2"
|
||||
stepping = "3"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "popcnt sse4.2 sse4.1 cx16 ssse3 sse3"
|
||||
extfeature_edx = "i64 syscall xd"
|
||||
extfeature_ecx = "lahf_lm"
|
||||
xlevel = "0x8000000A"
|
||||
model_id = "Intel Core i7 9xx (Nehalem Class Core i7)"
|
||||
|
||||
[cpudef]
|
||||
name = "Westmere"
|
||||
level = "11"
|
||||
vendor = "GenuineIntel"
|
||||
family = "6"
|
||||
model = "44"
|
||||
stepping = "1"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "aes popcnt sse4.2 sse4.1 cx16 ssse3 sse3"
|
||||
extfeature_edx = "i64 syscall xd"
|
||||
extfeature_ecx = "lahf_lm"
|
||||
xlevel = "0x8000000A"
|
||||
model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)"
|
||||
|
||||
[cpudef]
|
||||
name = "SandyBridge"
|
||||
level = "0xd"
|
||||
vendor = "GenuineIntel"
|
||||
family = "6"
|
||||
model = "42"
|
||||
stepping = "1"
|
||||
feature_edx = " sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "avx xsave aes tsc-deadline popcnt x2apic sse4.2 sse4.1 cx16 ssse3 pclmulqdq sse3"
|
||||
extfeature_edx = "i64 rdtscp nx syscall "
|
||||
extfeature_ecx = "lahf_lm"
|
||||
xlevel = "0x8000000A"
|
||||
model_id = "Intel Xeon E312xx (Sandy Bridge)"
|
||||
|
||||
[cpudef]
|
||||
name = "Opteron_G1"
|
||||
level = "5"
|
||||
vendor = "AuthenticAMD"
|
||||
family = "15"
|
||||
model = "6"
|
||||
stepping = "1"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "sse3"
|
||||
extfeature_edx = "lm fxsr mmx nx pse36 pat cmov mca pge mtrr syscall apic cx8 mce pae msr tsc pse de fpu"
|
||||
extfeature_ecx = " "
|
||||
xlevel = "0x80000008"
|
||||
model_id = "AMD Opteron 240 (Gen 1 Class Opteron)"
|
||||
|
||||
[cpudef]
|
||||
name = "Opteron_G2"
|
||||
level = "5"
|
||||
vendor = "AuthenticAMD"
|
||||
family = "15"
|
||||
model = "6"
|
||||
stepping = "1"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "cx16 sse3"
|
||||
extfeature_edx = "lm rdtscp fxsr mmx nx pse36 pat cmov mca pge mtrr syscall apic cx8 mce pae msr tsc pse de fpu"
|
||||
extfeature_ecx = "svm lahf_lm"
|
||||
xlevel = "0x80000008"
|
||||
model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)"
|
||||
|
||||
[cpudef]
|
||||
name = "Opteron_G3"
|
||||
level = "5"
|
||||
vendor = "AuthenticAMD"
|
||||
family = "15"
|
||||
model = "6"
|
||||
stepping = "1"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "popcnt cx16 monitor sse3"
|
||||
extfeature_edx = "lm rdtscp fxsr mmx nx pse36 pat cmov mca pge mtrr syscall apic cx8 mce pae msr tsc pse de fpu"
|
||||
extfeature_ecx = "misalignsse sse4a abm svm lahf_lm"
|
||||
xlevel = "0x80000008"
|
||||
model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)"
|
||||
|
||||
[cpudef]
|
||||
name = "Opteron_G4"
|
||||
level = "0xd"
|
||||
vendor = "AuthenticAMD"
|
||||
family = "21"
|
||||
model = "1"
|
||||
stepping = "2"
|
||||
feature_edx = "sse2 sse fxsr mmx clflush pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de fpu"
|
||||
feature_ecx = "avx xsave aes popcnt sse4.2 sse4.1 cx16 ssse3 pclmulqdq sse3"
|
||||
extfeature_edx = "lm rdtscp pdpe1gb fxsr mmx nx pse36 pat cmov mca pge mtrr syscall apic cx8 mce pae msr tsc pse de fpu"
|
||||
extfeature_ecx = " fma4 xop 3dnowprefetch misalignsse sse4a abm svm lahf_lm"
|
||||
xlevel = "0x8000001A"
|
||||
model_id = "AMD Opteron 62xx class CPU"
|
||||
|
@ -3543,6 +3543,7 @@ CPUAlphaState * cpu_alpha_init (const char *cpu_model)
|
||||
}
|
||||
env->implver = implver;
|
||||
env->amask = amask;
|
||||
env->cpu_model_str = cpu_model;
|
||||
|
||||
qemu_init_vcpu(env);
|
||||
return env;
|
||||
|
@ -240,7 +240,6 @@ typedef struct x86_def_t {
|
||||
uint32_t xlevel;
|
||||
char model_id[48];
|
||||
int vendor_override;
|
||||
uint32_t flags;
|
||||
/* Store the results of Centaur's CPUID instructions */
|
||||
uint32_t ext4_features;
|
||||
uint32_t xlevel2;
|
||||
@ -490,6 +489,225 @@ static x86_def_t builtin_x86_defs[] = {
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
|
||||
},
|
||||
{
|
||||
.name = "Conroe",
|
||||
.level = 2,
|
||||
.vendor1 = CPUID_VENDOR_INTEL_1,
|
||||
.vendor2 = CPUID_VENDOR_INTEL_2,
|
||||
.vendor3 = CPUID_VENDOR_INTEL_3,
|
||||
.family = 6,
|
||||
.model = 2,
|
||||
.stepping = 3,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
.ext3_features = CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
|
||||
},
|
||||
{
|
||||
.name = "Penryn",
|
||||
.level = 2,
|
||||
.vendor1 = CPUID_VENDOR_INTEL_1,
|
||||
.vendor2 = CPUID_VENDOR_INTEL_2,
|
||||
.vendor3 = CPUID_VENDOR_INTEL_3,
|
||||
.family = 6,
|
||||
.model = 2,
|
||||
.stepping = 3,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
|
||||
CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
.ext3_features = CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
|
||||
},
|
||||
{
|
||||
.name = "Nehalem",
|
||||
.level = 2,
|
||||
.vendor1 = CPUID_VENDOR_INTEL_1,
|
||||
.vendor2 = CPUID_VENDOR_INTEL_2,
|
||||
.vendor3 = CPUID_VENDOR_INTEL_3,
|
||||
.family = 6,
|
||||
.model = 2,
|
||||
.stepping = 3,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
|
||||
CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
|
||||
.ext3_features = CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
|
||||
},
|
||||
{
|
||||
.name = "Westmere",
|
||||
.level = 11,
|
||||
.vendor1 = CPUID_VENDOR_INTEL_1,
|
||||
.vendor2 = CPUID_VENDOR_INTEL_2,
|
||||
.vendor3 = CPUID_VENDOR_INTEL_3,
|
||||
.family = 6,
|
||||
.model = 44,
|
||||
.stepping = 1,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
|
||||
CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
|
||||
CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
|
||||
.ext3_features = CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
|
||||
},
|
||||
{
|
||||
.name = "SandyBridge",
|
||||
.level = 0xd,
|
||||
.vendor1 = CPUID_VENDOR_INTEL_1,
|
||||
.vendor2 = CPUID_VENDOR_INTEL_2,
|
||||
.vendor3 = CPUID_VENDOR_INTEL_3,
|
||||
.family = 6,
|
||||
.model = 42,
|
||||
.stepping = 1,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
|
||||
CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
|
||||
CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
|
||||
CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
|
||||
CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
|
||||
CPUID_EXT2_SYSCALL,
|
||||
.ext3_features = CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000000A,
|
||||
.model_id = "Intel Xeon E312xx (Sandy Bridge)",
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G1",
|
||||
.level = 5,
|
||||
.vendor1 = CPUID_VENDOR_AMD_1,
|
||||
.vendor2 = CPUID_VENDOR_AMD_2,
|
||||
.vendor3 = CPUID_VENDOR_AMD_3,
|
||||
.family = 15,
|
||||
.model = 6,
|
||||
.stepping = 1,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
|
||||
CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
|
||||
CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE |
|
||||
CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC |
|
||||
CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR |
|
||||
CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU,
|
||||
.xlevel = 0x80000008,
|
||||
.model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G2",
|
||||
.level = 5,
|
||||
.vendor1 = CPUID_VENDOR_AMD_1,
|
||||
.vendor2 = CPUID_VENDOR_AMD_2,
|
||||
.vendor3 = CPUID_VENDOR_AMD_3,
|
||||
.family = 15,
|
||||
.model = 6,
|
||||
.stepping = 1,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_CX16 | CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR |
|
||||
CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
|
||||
CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA |
|
||||
CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL |
|
||||
CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE |
|
||||
CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE |
|
||||
CPUID_EXT2_DE | CPUID_EXT2_FPU,
|
||||
.ext3_features = CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x80000008,
|
||||
.model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G3",
|
||||
.level = 5,
|
||||
.vendor1 = CPUID_VENDOR_AMD_1,
|
||||
.vendor2 = CPUID_VENDOR_AMD_2,
|
||||
.vendor3 = CPUID_VENDOR_AMD_3,
|
||||
.family = 15,
|
||||
.model = 6,
|
||||
.stepping = 1,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
|
||||
CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR |
|
||||
CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
|
||||
CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA |
|
||||
CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL |
|
||||
CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE |
|
||||
CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE |
|
||||
CPUID_EXT2_DE | CPUID_EXT2_FPU,
|
||||
.ext3_features = CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
|
||||
CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x80000008,
|
||||
.model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
|
||||
},
|
||||
{
|
||||
.name = "Opteron_G4",
|
||||
.level = 0xd,
|
||||
.vendor1 = CPUID_VENDOR_AMD_1,
|
||||
.vendor2 = CPUID_VENDOR_AMD_2,
|
||||
.vendor3 = CPUID_VENDOR_AMD_3,
|
||||
.family = 21,
|
||||
.model = 1,
|
||||
.stepping = 2,
|
||||
.features = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
|
||||
CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
|
||||
CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
|
||||
CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
|
||||
CPUID_DE | CPUID_FP87,
|
||||
.ext_features = CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
|
||||
CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
|
||||
CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
|
||||
CPUID_EXT_SSE3,
|
||||
.ext2_features = CPUID_EXT2_LM | CPUID_EXT2_RDTSCP |
|
||||
CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
|
||||
CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
|
||||
CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE |
|
||||
CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC |
|
||||
CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR |
|
||||
CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU,
|
||||
.ext3_features = CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
|
||||
CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
|
||||
CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
|
||||
CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x8000001A,
|
||||
.model_id = "AMD Opteron 62xx class CPU",
|
||||
},
|
||||
};
|
||||
|
||||
static int cpu_x86_fill_model_id(char *str)
|
||||
@ -1073,70 +1291,28 @@ static void listflags(char *buf, int bufsize, uint32_t fbits,
|
||||
}
|
||||
}
|
||||
|
||||
/* generate CPU information:
|
||||
* -? list model names
|
||||
* -?model list model names/IDs
|
||||
* -?dump output all model (x86_def_t) data
|
||||
* -?cpuid list all recognized cpuid flag names
|
||||
*/
|
||||
void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
|
||||
/* generate CPU information. */
|
||||
void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf)
|
||||
{
|
||||
unsigned char model = !strcmp("?model", optarg);
|
||||
unsigned char dump = !strcmp("?dump", optarg);
|
||||
unsigned char cpuid = !strcmp("?cpuid", optarg);
|
||||
x86_def_t *def;
|
||||
char buf[256];
|
||||
|
||||
if (cpuid) {
|
||||
(*cpu_fprintf)(f, "Recognized CPUID flags:\n");
|
||||
listflags(buf, sizeof (buf), (uint32_t)~0, feature_name, 1);
|
||||
(*cpu_fprintf)(f, " f_edx: %s\n", buf);
|
||||
listflags(buf, sizeof (buf), (uint32_t)~0, ext_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " f_ecx: %s\n", buf);
|
||||
listflags(buf, sizeof (buf), (uint32_t)~0, ext2_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " extf_edx: %s\n", buf);
|
||||
listflags(buf, sizeof (buf), (uint32_t)~0, ext3_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " extf_ecx: %s\n", buf);
|
||||
return;
|
||||
}
|
||||
for (def = x86_defs; def; def = def->next) {
|
||||
snprintf(buf, sizeof (buf), def->flags ? "[%s]": "%s", def->name);
|
||||
if (model || dump) {
|
||||
(*cpu_fprintf)(f, "x86 %16s %-48s\n", buf, def->model_id);
|
||||
} else {
|
||||
(*cpu_fprintf)(f, "x86 %16s\n", buf);
|
||||
}
|
||||
if (dump) {
|
||||
memcpy(buf, &def->vendor1, sizeof (def->vendor1));
|
||||
memcpy(buf + 4, &def->vendor2, sizeof (def->vendor2));
|
||||
memcpy(buf + 8, &def->vendor3, sizeof (def->vendor3));
|
||||
buf[12] = '\0';
|
||||
(*cpu_fprintf)(f,
|
||||
" family %d model %d stepping %d level %d xlevel 0x%x"
|
||||
" vendor \"%s\"\n",
|
||||
def->family, def->model, def->stepping, def->level,
|
||||
def->xlevel, buf);
|
||||
listflags(buf, sizeof (buf), def->features, feature_name, 0);
|
||||
(*cpu_fprintf)(f, " feature_edx %08x (%s)\n", def->features,
|
||||
buf);
|
||||
listflags(buf, sizeof (buf), def->ext_features, ext_feature_name,
|
||||
0);
|
||||
(*cpu_fprintf)(f, " feature_ecx %08x (%s)\n", def->ext_features,
|
||||
buf);
|
||||
listflags(buf, sizeof (buf), def->ext2_features, ext2_feature_name,
|
||||
0);
|
||||
(*cpu_fprintf)(f, " extfeature_edx %08x (%s)\n",
|
||||
def->ext2_features, buf);
|
||||
listflags(buf, sizeof (buf), def->ext3_features, ext3_feature_name,
|
||||
0);
|
||||
(*cpu_fprintf)(f, " extfeature_ecx %08x (%s)\n",
|
||||
def->ext3_features, buf);
|
||||
(*cpu_fprintf)(f, "\n");
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "%s", def->name);
|
||||
(*cpu_fprintf)(f, "x86 %16s %-48s\n", buf, def->model_id);
|
||||
}
|
||||
if (kvm_enabled()) {
|
||||
(*cpu_fprintf)(f, "x86 %16s\n", "[host]");
|
||||
}
|
||||
(*cpu_fprintf)(f, "\nRecognized CPUID flags:\n");
|
||||
listflags(buf, sizeof(buf), (uint32_t)~0, feature_name, 1);
|
||||
(*cpu_fprintf)(f, " f_edx: %s\n", buf);
|
||||
listflags(buf, sizeof(buf), (uint32_t)~0, ext_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " f_ecx: %s\n", buf);
|
||||
listflags(buf, sizeof(buf), (uint32_t)~0, ext2_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " extf_edx: %s\n", buf);
|
||||
listflags(buf, sizeof(buf), (uint32_t)~0, ext3_feature_name, 1);
|
||||
(*cpu_fprintf)(f, " extf_ecx: %s\n", buf);
|
||||
}
|
||||
|
||||
CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
|
||||
@ -1216,109 +1392,6 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model)
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
/* copy vendor id string to 32 bit register, nul pad as needed
|
||||
*/
|
||||
static void cpyid(const char *s, uint32_t *id)
|
||||
{
|
||||
char *d = (char *)id;
|
||||
char i;
|
||||
|
||||
for (i = sizeof (*id); i--; )
|
||||
*d++ = *s ? *s++ : '\0';
|
||||
}
|
||||
|
||||
/* interpret radix and convert from string to arbitrary scalar,
|
||||
* otherwise flag failure
|
||||
*/
|
||||
#define setscalar(pval, str, perr) \
|
||||
{ \
|
||||
char *pend; \
|
||||
unsigned long ul; \
|
||||
\
|
||||
ul = strtoul(str, &pend, 0); \
|
||||
*str && !*pend ? (*pval = ul) : (*perr = 1); \
|
||||
}
|
||||
|
||||
/* map cpuid options to feature bits, otherwise return failure
|
||||
* (option tags in *str are delimited by whitespace)
|
||||
*/
|
||||
static void setfeatures(uint32_t *pval, const char *str,
|
||||
const char **featureset, int *perr)
|
||||
{
|
||||
const char *p, *q;
|
||||
|
||||
for (q = p = str; *p || *q; q = p) {
|
||||
while (iswhite(*p))
|
||||
q = ++p;
|
||||
while (*p && !iswhite(*p))
|
||||
++p;
|
||||
if (!*q && !*p)
|
||||
return;
|
||||
if (!lookup_feature(pval, q, p, featureset)) {
|
||||
fprintf(stderr, "error: feature \"%.*s\" not available in set\n",
|
||||
(int)(p - q), q);
|
||||
*perr = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* map config file options to x86_def_t form
|
||||
*/
|
||||
static int cpudef_setfield(const char *name, const char *str, void *opaque)
|
||||
{
|
||||
x86_def_t *def = opaque;
|
||||
int err = 0;
|
||||
|
||||
if (!strcmp(name, "name")) {
|
||||
g_free((void *)def->name);
|
||||
def->name = g_strdup(str);
|
||||
} else if (!strcmp(name, "model_id")) {
|
||||
strncpy(def->model_id, str, sizeof (def->model_id));
|
||||
} else if (!strcmp(name, "level")) {
|
||||
setscalar(&def->level, str, &err)
|
||||
} else if (!strcmp(name, "vendor")) {
|
||||
cpyid(&str[0], &def->vendor1);
|
||||
cpyid(&str[4], &def->vendor2);
|
||||
cpyid(&str[8], &def->vendor3);
|
||||
} else if (!strcmp(name, "family")) {
|
||||
setscalar(&def->family, str, &err)
|
||||
} else if (!strcmp(name, "model")) {
|
||||
setscalar(&def->model, str, &err)
|
||||
} else if (!strcmp(name, "stepping")) {
|
||||
setscalar(&def->stepping, str, &err)
|
||||
} else if (!strcmp(name, "feature_edx")) {
|
||||
setfeatures(&def->features, str, feature_name, &err);
|
||||
} else if (!strcmp(name, "feature_ecx")) {
|
||||
setfeatures(&def->ext_features, str, ext_feature_name, &err);
|
||||
} else if (!strcmp(name, "extfeature_edx")) {
|
||||
setfeatures(&def->ext2_features, str, ext2_feature_name, &err);
|
||||
} else if (!strcmp(name, "extfeature_ecx")) {
|
||||
setfeatures(&def->ext3_features, str, ext3_feature_name, &err);
|
||||
} else if (!strcmp(name, "xlevel")) {
|
||||
setscalar(&def->xlevel, str, &err)
|
||||
} else {
|
||||
fprintf(stderr, "error: unknown option [%s = %s]\n", name, str);
|
||||
return (1);
|
||||
}
|
||||
if (err) {
|
||||
fprintf(stderr, "error: bad option value [%s = %s]\n", name, str);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* register config file entry as x86_def_t
|
||||
*/
|
||||
static int cpudef_register(QemuOpts *opts, void *opaque)
|
||||
{
|
||||
x86_def_t *def = g_malloc0(sizeof (x86_def_t));
|
||||
|
||||
qemu_opt_foreach(opts, cpudef_setfield, def, 1);
|
||||
def->next = x86_defs;
|
||||
x86_defs = def;
|
||||
return (0);
|
||||
}
|
||||
|
||||
void cpu_clear_apic_feature(CPUX86State *env)
|
||||
{
|
||||
@ -1327,8 +1400,7 @@ void cpu_clear_apic_feature(CPUX86State *env)
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
/* register "cpudef" models defined in configuration file. Here we first
|
||||
* preload any built-in definitions
|
||||
/* Initialize list of CPU models, filling some non-static fields if necessary
|
||||
*/
|
||||
void x86_cpudef_setup(void)
|
||||
{
|
||||
@ -1336,24 +1408,23 @@ void x86_cpudef_setup(void)
|
||||
static const char *model_with_versions[] = { "qemu32", "qemu64", "athlon" };
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); ++i) {
|
||||
builtin_x86_defs[i].next = x86_defs;
|
||||
builtin_x86_defs[i].flags = 1;
|
||||
x86_def_t *def = &builtin_x86_defs[i];
|
||||
def->next = x86_defs;
|
||||
|
||||
/* Look for specific "cpudef" models that */
|
||||
/* have the QEMU version in .model_id */
|
||||
for (j = 0; j < ARRAY_SIZE(model_with_versions); j++) {
|
||||
if (strcmp(model_with_versions[j], builtin_x86_defs[i].name) == 0) {
|
||||
pstrcpy(builtin_x86_defs[i].model_id, sizeof(builtin_x86_defs[i].model_id), "QEMU Virtual CPU version ");
|
||||
pstrcat(builtin_x86_defs[i].model_id, sizeof(builtin_x86_defs[i].model_id), qemu_get_version());
|
||||
if (strcmp(model_with_versions[j], def->name) == 0) {
|
||||
pstrcpy(def->model_id, sizeof(def->model_id),
|
||||
"QEMU Virtual CPU version ");
|
||||
pstrcat(def->model_id, sizeof(def->model_id),
|
||||
qemu_get_version());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
x86_defs = &builtin_x86_defs[i];
|
||||
x86_defs = def;
|
||||
}
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
qemu_opts_foreach(qemu_find_opts("cpudef"), cpudef_register, NULL, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void get_cpuid_vendor(CPUX86State *env, uint32_t *ebx,
|
||||
|
@ -382,6 +382,7 @@
|
||||
#define CPUID_PBE (1 << 31)
|
||||
|
||||
#define CPUID_EXT_SSE3 (1 << 0)
|
||||
#define CPUID_EXT_PCLMULQDQ (1 << 1)
|
||||
#define CPUID_EXT_DTES64 (1 << 2)
|
||||
#define CPUID_EXT_MONITOR (1 << 3)
|
||||
#define CPUID_EXT_DSCPL (1 << 4)
|
||||
@ -401,14 +402,33 @@
|
||||
#define CPUID_EXT_MOVBE (1 << 22)
|
||||
#define CPUID_EXT_POPCNT (1 << 23)
|
||||
#define CPUID_EXT_TSC_DEADLINE_TIMER (1 << 24)
|
||||
#define CPUID_EXT_AES (1 << 25)
|
||||
#define CPUID_EXT_XSAVE (1 << 26)
|
||||
#define CPUID_EXT_OSXSAVE (1 << 27)
|
||||
#define CPUID_EXT_AVX (1 << 28)
|
||||
#define CPUID_EXT_HYPERVISOR (1 << 31)
|
||||
|
||||
#define CPUID_EXT2_FPU (1 << 0)
|
||||
#define CPUID_EXT2_DE (1 << 2)
|
||||
#define CPUID_EXT2_PSE (1 << 3)
|
||||
#define CPUID_EXT2_TSC (1 << 4)
|
||||
#define CPUID_EXT2_MSR (1 << 5)
|
||||
#define CPUID_EXT2_PAE (1 << 6)
|
||||
#define CPUID_EXT2_MCE (1 << 7)
|
||||
#define CPUID_EXT2_CX8 (1 << 8)
|
||||
#define CPUID_EXT2_APIC (1 << 9)
|
||||
#define CPUID_EXT2_SYSCALL (1 << 11)
|
||||
#define CPUID_EXT2_MTRR (1 << 12)
|
||||
#define CPUID_EXT2_PGE (1 << 13)
|
||||
#define CPUID_EXT2_MCA (1 << 14)
|
||||
#define CPUID_EXT2_CMOV (1 << 15)
|
||||
#define CPUID_EXT2_PAT (1 << 16)
|
||||
#define CPUID_EXT2_PSE36 (1 << 17)
|
||||
#define CPUID_EXT2_MP (1 << 19)
|
||||
#define CPUID_EXT2_NX (1 << 20)
|
||||
#define CPUID_EXT2_MMXEXT (1 << 22)
|
||||
#define CPUID_EXT2_MMX (1 << 23)
|
||||
#define CPUID_EXT2_FXSR (1 << 24)
|
||||
#define CPUID_EXT2_FFXSR (1 << 25)
|
||||
#define CPUID_EXT2_PDPE1GB (1 << 26)
|
||||
#define CPUID_EXT2_RDTSCP (1 << 27)
|
||||
@ -427,7 +447,9 @@
|
||||
#define CPUID_EXT3_3DNOWPREFETCH (1 << 8)
|
||||
#define CPUID_EXT3_OSVW (1 << 9)
|
||||
#define CPUID_EXT3_IBS (1 << 10)
|
||||
#define CPUID_EXT3_XOP (1 << 11)
|
||||
#define CPUID_EXT3_SKINIT (1 << 12)
|
||||
#define CPUID_EXT3_FMA4 (1 << 16)
|
||||
|
||||
#define CPUID_SVM_NPT (1 << 0)
|
||||
#define CPUID_SVM_LBRV (1 << 1)
|
||||
@ -792,7 +814,7 @@ typedef struct CPUX86State {
|
||||
|
||||
X86CPU *cpu_x86_init(const char *cpu_model);
|
||||
int cpu_x86_exec(CPUX86State *s);
|
||||
void x86_cpu_list (FILE *f, fprintf_function cpu_fprintf, const char *optarg);
|
||||
void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
||||
void x86_cpudef_setup(void);
|
||||
int cpu_x86_support_mca_broadcast(CPUX86State *env);
|
||||
|
||||
@ -976,7 +998,7 @@ static inline CPUX86State *cpu_init(const char *cpu_model)
|
||||
#define cpu_exec cpu_x86_exec
|
||||
#define cpu_gen_code cpu_x86_gen_code
|
||||
#define cpu_signal_handler cpu_x86_signal_handler
|
||||
#define cpu_list_id x86_cpu_list
|
||||
#define cpu_list x86_cpu_list
|
||||
#define cpudef_setup x86_cpudef_setup
|
||||
|
||||
#define CPU_SAVE_VERSION 12
|
||||
|
Loading…
Reference in New Issue
Block a user