x86, machine, numa queue (2017-01-23)
-----BEGIN PGP SIGNATURE----- iQIcBAABCAAGBQJYhpFDAAoJECgHk2+YTcWma8gP/3FI1oOSw4Z2emrrMJifi7i7 FfErjzKQX76wze8MbDIb0Biyij7/1qSz9Z4yD7+tURF49O6Qd4MpryFxgfuQx7Xo ahZhf+PedhBYt62RaIpFYER30mqg0JzbyLFEH/Vk8FVxOrhn2zB+MUGU6zU2Z+dE AAbryuruPL/sdxSDerTscnOJTxRZEs/2zIdf7aqhuqCe9P9w/lSq1mPWckBgtNJx V36HXm5q0nvEyBJuu3ikYD8EyQrF4nAsa+Xe0E9H2XZtA/rQX9uBasqVRS/vgS9T fsdHIWqJ7jS0NhkMgQJTNy/NjGEAm6xdqSHoRCqLv9qHTN1yD9C8r/N5+fOqf6jh wDlTVns8Se9yMrxTWt0RN3Rf64Zc2X3O1iroe596vR71AQvyXxwxN0aNEo5uPUip nCM6K5OJBk+vDOA93aZbKGHBWJp3gOJdAEUbgScXZvOGQa7MF+MaK8aZK6Ad9zV2 MYxAn8RYZP/UQIzIJWeVJMC0/F/ugmdrnURltf88gqeG17x4eBw0et6PenKf779X vHBXok5uPMQbcV3T7HH79J4hMi2Qn8wV7G9j3CzMMT7qqYVITbq7R28FUOJIuUDm 64jL/IXRfFDsuV72PctDkmu7UPDSioJUgsGTGTjH/6G+eUvq8utu8hWEkYnGWE4W thYPUaE50CCUCF6PiW6/ =abpK -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/ehabkost/tags/x86-and-machine-pull-request' into staging x86, machine, numa queue (2017-01-23) # gpg: Signature made Mon 23 Jan 2017 23:26:59 GMT # gpg: using RSA key 0x2807936F984DC5A6 # gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>" # Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF D1AA 2807 936F 984D C5A6 * remotes/ehabkost/tags/x86-and-machine-pull-request: kvm: Allow invtsc migration if tsc-khz is set explicitly kvm: Simplify invtsc check hw/core/null-machine: Add the possibility to instantiate a CPU and RAM qemu-options: Rename variables on the -numa "cpus" option MAINTAINERS: Add an entry for hw/core/null-machine.c machine: Make possible_cpu_arch_ids() return const pointer pc: don't return cpu pointer from pc_new_cpu() as it's not needed anymore pc: cleanup: move smbios_set_cpuid() into pc_build_smbios() arch_init: Remove unnecessary default_config_files table vl: Ensure the numa_post_machine_init func in the appropriate location i386: Return migration-safe field on query-cpu-definitions i386: Remove AMD feature flag aliases from Opteron models x86: add AVX512_VPOPCNTDQ features Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
a678502e4f
@ -819,6 +819,7 @@ M: Eduardo Habkost <ehabkost@redhat.com>
|
||||
M: Marcel Apfelbaum <marcel@redhat.com>
|
||||
S: Supported
|
||||
F: hw/core/machine.c
|
||||
F: hw/core/null-machine.c
|
||||
F: include/hw/boards.h
|
||||
|
||||
Xtensa Machines
|
||||
|
27
arch_init.c
27
arch_init.c
@ -83,33 +83,6 @@ int graphic_depth = 32;
|
||||
|
||||
const uint32_t arch_type = QEMU_ARCH;
|
||||
|
||||
static struct defconfig_file {
|
||||
const char *filename;
|
||||
/* Indicates it is an user config file (disabled by -no-user-config) */
|
||||
bool userconfig;
|
||||
} default_config_files[] = {
|
||||
{ CONFIG_QEMU_CONFDIR "/qemu.conf", true },
|
||||
{ NULL }, /* end of list */
|
||||
};
|
||||
|
||||
int qemu_read_default_config_files(bool userconfig)
|
||||
{
|
||||
int ret;
|
||||
struct defconfig_file *f;
|
||||
|
||||
for (f = default_config_files; f->filename; f++) {
|
||||
if (!userconfig && f->userconfig) {
|
||||
continue;
|
||||
}
|
||||
ret = qemu_read_config_file(f->filename);
|
||||
if (ret < 0 && ret != -ENOENT) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct soundhw {
|
||||
const char *name;
|
||||
const char *descr;
|
||||
|
@ -190,7 +190,7 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
|
||||
{
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
CPUArchIdList *id_list;
|
||||
const CPUArchIdList *id_list;
|
||||
int i;
|
||||
|
||||
assert(mc->possible_cpu_arch_ids);
|
||||
@ -201,7 +201,6 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
|
||||
state->devs[i].cpu = id_list->cpus[i].cpu;
|
||||
state->devs[i].arch_id = id_list->cpus[i].arch_id;
|
||||
}
|
||||
g_free(id_list);
|
||||
memory_region_init_io(&state->ctrl_reg, owner, &cpu_hotplug_ops, state,
|
||||
"acpi-mem-hotplug", ACPI_CPU_HOTPLUG_REG_LEN);
|
||||
memory_region_add_subregion(as, base_addr, &state->ctrl_reg);
|
||||
@ -325,7 +324,7 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
||||
Aml *one = aml_int(1);
|
||||
Aml *sb_scope = aml_scope("_SB");
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
|
||||
const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
|
||||
char *cphp_res_path = g_strdup_printf("%s." CPUHP_RES_DEVICE, res_root);
|
||||
Object *obj = object_resolve_path_type("", TYPE_ACPI_DEVICE_IF, NULL);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
|
||||
@ -574,5 +573,4 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
||||
aml_append(table, method);
|
||||
|
||||
g_free(cphp_res_path);
|
||||
g_free(arch_ids);
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine,
|
||||
Aml *zero = aml_int(0);
|
||||
Aml *one = aml_int(1);
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
|
||||
const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
|
||||
/*
|
||||
@ -329,8 +329,6 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine,
|
||||
apic_idx = apic_id + 1;
|
||||
}
|
||||
aml_append(sb_scope, aml_name_decl(CPU_ON_BITMAP, pkg));
|
||||
g_free(apic_ids);
|
||||
|
||||
aml_append(ctx, sb_scope);
|
||||
|
||||
method = aml_method("\\_GPE._E02", 0, AML_NOTSERIALIZED);
|
||||
|
@ -12,7 +12,6 @@ common-obj-$(CONFIG_XILINX_AXI) += stream.o
|
||||
common-obj-$(CONFIG_PTIMER) += ptimer.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += sysbus.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += machine.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += null-machine.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += loader.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o
|
||||
common-obj-$(CONFIG_SOFTMMU) += register.o
|
||||
@ -20,3 +19,4 @@ common-obj-$(CONFIG_SOFTMMU) += or-irq.o
|
||||
common-obj-$(CONFIG_PLATFORM_BUS) += platform-bus.o
|
||||
|
||||
obj-$(CONFIG_SOFTMMU) += generic-loader.o
|
||||
obj-$(CONFIG_SOFTMMU) += null-machine.o
|
||||
|
@ -13,18 +13,41 @@
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/boards.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "cpu.h"
|
||||
|
||||
static void machine_none_init(MachineState *machine)
|
||||
static void machine_none_init(MachineState *mch)
|
||||
{
|
||||
CPUState *cpu = NULL;
|
||||
|
||||
/* Initialize CPU (if a model has been specified) */
|
||||
if (mch->cpu_model) {
|
||||
cpu = cpu_init(mch->cpu_model);
|
||||
if (!cpu) {
|
||||
error_report("Unable to initialize CPU");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* RAM at address zero */
|
||||
if (mch->ram_size) {
|
||||
MemoryRegion *ram = g_new(MemoryRegion, 1);
|
||||
|
||||
memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
|
||||
memory_region_add_subregion(get_system_memory(), 0, ram);
|
||||
}
|
||||
}
|
||||
|
||||
static void machine_none_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "empty machine";
|
||||
mc->init = machine_none_init;
|
||||
mc->max_cpus = 0;
|
||||
mc->max_cpus = 1;
|
||||
mc->default_ram_size = 0;
|
||||
}
|
||||
|
||||
DEFINE_MACHINE("none", machine_none_machine_init)
|
||||
|
@ -332,7 +332,7 @@ build_fadt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm,
|
||||
}
|
||||
|
||||
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
|
||||
CPUArchIdList *apic_ids, GArray *entry)
|
||||
const CPUArchIdList *apic_ids, GArray *entry)
|
||||
{
|
||||
uint32_t apic_id = apic_ids->cpus[uid].arch_id;
|
||||
|
||||
@ -373,7 +373,7 @@ static void
|
||||
build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(pcms);
|
||||
CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms));
|
||||
const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms));
|
||||
int madt_start = table_data->len;
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(pcms->acpi_dev);
|
||||
AcpiDeviceIf *adev = ACPI_DEVICE_IF(pcms->acpi_dev);
|
||||
@ -394,7 +394,6 @@ build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms)
|
||||
x2apic_mode = true;
|
||||
}
|
||||
}
|
||||
g_free(apic_ids);
|
||||
|
||||
io_apic = acpi_data_push(table_data, sizeof *io_apic);
|
||||
io_apic->type = ACPI_APIC_IO;
|
||||
@ -2294,7 +2293,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||
int srat_start, numa_start, slots;
|
||||
uint64_t mem_len, mem_base, next_base;
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
|
||||
const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
ram_addr_t hotplugabble_address_space_size =
|
||||
object_property_get_int(OBJECT(pcms), PC_MACHINE_MEMHP_REGION_SIZE,
|
||||
@ -2393,7 +2392,6 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||
(void *)(table_data->data + srat_start),
|
||||
"SRAT",
|
||||
table_data->len - srat_start, 1, NULL, NULL);
|
||||
g_free(apic_ids);
|
||||
}
|
||||
|
||||
static void
|
||||
|
51
hw/i386/pc.c
51
hw/i386/pc.c
@ -701,16 +701,20 @@ static uint32_t x86_cpu_apic_id_from_index(unsigned int cpu_index)
|
||||
}
|
||||
}
|
||||
|
||||
static void pc_build_smbios(FWCfgState *fw_cfg)
|
||||
static void pc_build_smbios(PCMachineState *pcms)
|
||||
{
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
struct smbios_phys_mem_area *mem_array;
|
||||
unsigned i, array_count;
|
||||
X86CPU *cpu = X86_CPU(pcms->possible_cpus->cpus[0].cpu);
|
||||
|
||||
/* tell smbios about cpuid version and features */
|
||||
smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]);
|
||||
|
||||
smbios_tables = smbios_get_table_legacy(&smbios_tables_len);
|
||||
if (smbios_tables) {
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
|
||||
fw_cfg_add_bytes(pcms->fw_cfg, FW_CFG_SMBIOS_ENTRIES,
|
||||
smbios_tables, smbios_tables_len);
|
||||
}
|
||||
|
||||
@ -731,9 +735,9 @@ static void pc_build_smbios(FWCfgState *fw_cfg)
|
||||
g_free(mem_array);
|
||||
|
||||
if (smbios_anchor) {
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables",
|
||||
fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-tables",
|
||||
smbios_tables, smbios_tables_len);
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor",
|
||||
fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-anchor",
|
||||
smbios_anchor, smbios_anchor_len);
|
||||
}
|
||||
}
|
||||
@ -1088,28 +1092,24 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
|
||||
}
|
||||
}
|
||||
|
||||
static X86CPU *pc_new_cpu(const char *typename, int64_t apic_id,
|
||||
Error **errp)
|
||||
static void pc_new_cpu(const char *typename, int64_t apic_id, Error **errp)
|
||||
{
|
||||
X86CPU *cpu = NULL;
|
||||
Object *cpu = NULL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
cpu = X86_CPU(object_new(typename));
|
||||
cpu = object_new(typename);
|
||||
|
||||
object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
|
||||
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
|
||||
object_property_set_int(cpu, apic_id, "apic-id", &local_err);
|
||||
object_property_set_bool(cpu, true, "realized", &local_err);
|
||||
|
||||
object_unref(cpu);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
object_unref(OBJECT(cpu));
|
||||
cpu = NULL;
|
||||
}
|
||||
return cpu;
|
||||
}
|
||||
|
||||
void pc_hot_add_cpu(const int64_t id, Error **errp)
|
||||
{
|
||||
X86CPU *cpu;
|
||||
ObjectClass *oc;
|
||||
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
|
||||
int64_t apic_id = x86_cpu_apic_id_from_index(id);
|
||||
@ -1129,12 +1129,11 @@ void pc_hot_add_cpu(const int64_t id, Error **errp)
|
||||
|
||||
assert(pcms->possible_cpus->cpus[0].cpu); /* BSP is always present */
|
||||
oc = OBJECT_CLASS(CPU_GET_CLASS(pcms->possible_cpus->cpus[0].cpu));
|
||||
cpu = pc_new_cpu(object_class_get_name(oc), apic_id, &local_err);
|
||||
pc_new_cpu(object_class_get_name(oc), apic_id, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
object_unref(OBJECT(cpu));
|
||||
}
|
||||
|
||||
void pc_cpus_init(PCMachineState *pcms)
|
||||
@ -1144,7 +1143,6 @@ void pc_cpus_init(PCMachineState *pcms)
|
||||
ObjectClass *oc;
|
||||
const char *typename;
|
||||
gchar **model_pieces;
|
||||
X86CPU *cpu = NULL;
|
||||
MachineState *machine = MACHINE(pcms);
|
||||
|
||||
/* init CPUs */
|
||||
@ -1186,14 +1184,9 @@ void pc_cpus_init(PCMachineState *pcms)
|
||||
pcms->possible_cpus->cpus[i].arch_id = x86_cpu_apic_id_from_index(i);
|
||||
pcms->possible_cpus->len++;
|
||||
if (i < smp_cpus) {
|
||||
cpu = pc_new_cpu(typename, x86_cpu_apic_id_from_index(i),
|
||||
&error_fatal);
|
||||
object_unref(OBJECT(cpu));
|
||||
pc_new_cpu(typename, x86_cpu_apic_id_from_index(i), &error_fatal);
|
||||
}
|
||||
}
|
||||
|
||||
/* tell smbios about cpuid version and features */
|
||||
smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]);
|
||||
}
|
||||
|
||||
static void pc_build_feature_control_file(PCMachineState *pcms)
|
||||
@ -1266,7 +1259,7 @@ void pc_machine_done(Notifier *notifier, void *data)
|
||||
|
||||
acpi_setup();
|
||||
if (pcms->fw_cfg) {
|
||||
pc_build_smbios(pcms->fw_cfg);
|
||||
pc_build_smbios(pcms);
|
||||
pc_build_feature_control_file(pcms);
|
||||
/* update FW_CFG_NB_CPUS to account for -device added CPUs */
|
||||
fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus);
|
||||
@ -2247,15 +2240,11 @@ static unsigned pc_cpu_index_to_socket_id(unsigned cpu_index)
|
||||
return topo.pkg_id;
|
||||
}
|
||||
|
||||
static CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *machine)
|
||||
static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *machine)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
int len = sizeof(CPUArchIdList) +
|
||||
sizeof(CPUArchId) * (pcms->possible_cpus->len);
|
||||
CPUArchIdList *list = g_malloc(len);
|
||||
|
||||
memcpy(list, pcms->possible_cpus, len);
|
||||
return list;
|
||||
assert(pcms->possible_cpus);
|
||||
return pcms->possible_cpus;
|
||||
}
|
||||
|
||||
static HotpluggableCPUList *pc_query_hotpluggable_cpus(MachineState *machine)
|
||||
|
@ -57,6 +57,6 @@ typedef struct AcpiDeviceIfClass {
|
||||
void (*ospm_status)(AcpiDeviceIf *adev, ACPIOSTInfoList ***list);
|
||||
void (*send_event)(AcpiDeviceIf *adev, AcpiEventStatusBits ev);
|
||||
void (*madt_cpu)(AcpiDeviceIf *adev, int uid,
|
||||
CPUArchIdList *apic_ids, GArray *entry);
|
||||
const CPUArchIdList *apic_ids, GArray *entry);
|
||||
} AcpiDeviceIfClass;
|
||||
#endif
|
||||
|
@ -135,7 +135,7 @@ struct MachineClass {
|
||||
HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
|
||||
DeviceState *dev);
|
||||
unsigned (*cpu_index_to_socket_id)(unsigned cpu_index);
|
||||
CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
|
||||
const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
|
||||
HotpluggableCPUList *(*query_hotpluggable_cpus)(MachineState *machine);
|
||||
};
|
||||
|
||||
|
@ -361,7 +361,7 @@ uint16_t pvpanic_port(void);
|
||||
|
||||
/* acpi-build.c */
|
||||
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
|
||||
CPUArchIdList *apic_ids, GArray *entry);
|
||||
const CPUArchIdList *apic_ids, GArray *entry);
|
||||
|
||||
/* e820 types */
|
||||
#define E820_RAM 1
|
||||
|
@ -23,8 +23,4 @@ int qemu_read_config_file(const char *filename);
|
||||
void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
|
||||
Error **errp);
|
||||
|
||||
/* Read default QEMU config files
|
||||
*/
|
||||
int qemu_read_default_config_files(bool userconfig);
|
||||
|
||||
#endif /* QEMU_CONFIG_FILE_H */
|
||||
|
@ -119,11 +119,11 @@ specifies the maximum number of hotpluggable CPUs.
|
||||
ETEXI
|
||||
|
||||
DEF("numa", HAS_ARG, QEMU_OPTION_numa,
|
||||
"-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]\n"
|
||||
"-numa node[,memdev=id][,cpus=cpu[-cpu]][,nodeid=node]\n", QEMU_ARCH_ALL)
|
||||
"-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
|
||||
"-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n", QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
@item -numa node[,mem=@var{size}][,cpus=@var{cpu[-cpu]}][,nodeid=@var{node}]
|
||||
@itemx -numa node[,memdev=@var{id}][,cpus=@var{cpu[-cpu]}][,nodeid=@var{node}]
|
||||
@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
|
||||
@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
|
||||
@findex -numa
|
||||
Simulate a multi node NUMA system. If @samp{mem}, @samp{memdev}
|
||||
and @samp{cpus} are omitted, resources are split equally. Also, note
|
||||
|
@ -2,6 +2,6 @@
|
||||
#include "hw/i386/pc.h"
|
||||
|
||||
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
|
||||
CPUArchIdList *apic_ids, GArray *entry)
|
||||
const CPUArchIdList *apic_ids, GArray *entry)
|
||||
{
|
||||
}
|
||||
|
@ -48,6 +48,7 @@ typedef struct X86CPUDefinition X86CPUDefinition;
|
||||
* X86CPUClass:
|
||||
* @cpu_def: CPU model definition
|
||||
* @kvm_required: Whether CPU model requires KVM to be enabled.
|
||||
* @migration_safe: See CpuDefinitionInfo::migration_safe
|
||||
* @parent_realize: The parent class' realize handler.
|
||||
* @parent_reset: The parent class' reset handler.
|
||||
*
|
||||
@ -62,6 +63,7 @@ typedef struct X86CPUClass {
|
||||
X86CPUDefinition *cpu_def;
|
||||
|
||||
bool kvm_required;
|
||||
bool migration_safe;
|
||||
|
||||
/* Optional description of CPU model.
|
||||
* If unavailable, cpu_def->model_id is used */
|
||||
|
@ -435,7 +435,7 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
NULL, "avx512vbmi", "umip", "pku",
|
||||
"ospke", NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, "avx512-vpopcntdq", NULL,
|
||||
"la57", NULL, NULL, NULL,
|
||||
NULL, NULL, "rdpid", NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
@ -1339,12 +1339,7 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
.features[FEAT_1_ECX] =
|
||||
CPUID_EXT_SSE3,
|
||||
.features[FEAT_8000_0001_EDX] =
|
||||
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,
|
||||
CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
.xlevel = 0x80000008,
|
||||
.model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
|
||||
},
|
||||
@ -1365,13 +1360,7 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
CPUID_EXT_CX16 | CPUID_EXT_SSE3,
|
||||
/* Missing: CPUID_EXT2_RDTSCP */
|
||||
.features[FEAT_8000_0001_EDX] =
|
||||
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,
|
||||
CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
.features[FEAT_8000_0001_ECX] =
|
||||
CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
.xlevel = 0x80000008,
|
||||
@ -1395,13 +1384,7 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
CPUID_EXT_SSE3,
|
||||
/* Missing: CPUID_EXT2_RDTSCP */
|
||||
.features[FEAT_8000_0001_EDX] =
|
||||
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,
|
||||
CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
|
||||
.features[FEAT_8000_0001_ECX] =
|
||||
CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
|
||||
CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
|
||||
@ -1428,13 +1411,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
CPUID_EXT_SSE3,
|
||||
/* Missing: CPUID_EXT2_RDTSCP */
|
||||
.features[FEAT_8000_0001_EDX] =
|
||||
CPUID_EXT2_LM |
|
||||
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,
|
||||
CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
|
||||
CPUID_EXT2_SYSCALL,
|
||||
.features[FEAT_8000_0001_ECX] =
|
||||
CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
|
||||
CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
|
||||
@ -1464,13 +1442,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
|
||||
/* Missing: CPUID_EXT2_RDTSCP */
|
||||
.features[FEAT_8000_0001_EDX] =
|
||||
CPUID_EXT2_LM |
|
||||
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,
|
||||
CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
|
||||
CPUID_EXT2_SYSCALL,
|
||||
.features[FEAT_8000_0001_ECX] =
|
||||
CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
|
||||
CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
|
||||
@ -2236,6 +2209,8 @@ static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
|
||||
x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
|
||||
info->has_unavailable_features = true;
|
||||
info->q_typename = g_strdup(object_class_get_name(oc));
|
||||
info->migration_safe = cc->migration_safe;
|
||||
info->has_migration_safe = true;
|
||||
|
||||
entry = g_malloc0(sizeof(*entry));
|
||||
entry->value = info;
|
||||
@ -2383,6 +2358,7 @@ static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
|
||||
X86CPUClass *xcc = X86_CPU_CLASS(oc);
|
||||
|
||||
xcc->cpu_def = cpudef;
|
||||
xcc->migration_safe = true;
|
||||
}
|
||||
|
||||
static void x86_register_cpudef_type(X86CPUDefinition *def)
|
||||
@ -2395,6 +2371,11 @@ static void x86_register_cpudef_type(X86CPUDefinition *def)
|
||||
.class_data = def,
|
||||
};
|
||||
|
||||
/* AMD aliases are handled at runtime based on CPUID vendor, so
|
||||
* they shouldn't be set on the CPU model table.
|
||||
*/
|
||||
assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
|
||||
|
||||
type_register(&ti);
|
||||
g_free(typename);
|
||||
}
|
||||
|
@ -630,6 +630,7 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS];
|
||||
#define CPUID_7_0_ECX_UMIP (1U << 2)
|
||||
#define CPUID_7_0_ECX_PKU (1U << 3)
|
||||
#define CPUID_7_0_ECX_OSPKE (1U << 4)
|
||||
#define CPUID_7_0_ECX_AVX512_VPOPCNTDQ (1U << 14) /* POPCNT for vectors of DW/QW */
|
||||
#define CPUID_7_0_ECX_LA57 (1U << 16)
|
||||
#define CPUID_7_0_ECX_RDPID (1U << 22)
|
||||
|
||||
|
@ -963,15 +963,17 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
has_msr_mcg_ext_ctl = has_msr_feature_control = true;
|
||||
}
|
||||
|
||||
c = cpuid_find_entry(&cpuid_data.cpuid, 0x80000007, 0);
|
||||
if (c && (c->edx & 1<<8) && invtsc_mig_blocker == NULL) {
|
||||
/* for migration */
|
||||
error_setg(&invtsc_mig_blocker,
|
||||
"State blocked by non-migratable CPU device"
|
||||
" (invtsc flag)");
|
||||
migrate_add_blocker(invtsc_mig_blocker);
|
||||
/* for savevm */
|
||||
vmstate_x86_cpu.unmigratable = 1;
|
||||
if (!env->user_tsc_khz) {
|
||||
if ((env->features[FEAT_8000_0007_EDX] & CPUID_APM_INVTSC) &&
|
||||
invtsc_mig_blocker == NULL) {
|
||||
/* for migration */
|
||||
error_setg(&invtsc_mig_blocker,
|
||||
"State blocked by non-migratable CPU device"
|
||||
" (invtsc flag)");
|
||||
migrate_add_blocker(invtsc_mig_blocker);
|
||||
/* for savevm */
|
||||
vmstate_x86_cpu.unmigratable = 1;
|
||||
}
|
||||
}
|
||||
|
||||
cpuid_data.cpuid.padding = 0;
|
||||
|
23
vl.c
23
vl.c
@ -2950,6 +2950,18 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemu_read_default_config_file(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = qemu_read_config_file(CONFIG_QEMU_CONFDIR "/qemu.conf");
|
||||
if (ret < 0 && ret != -ENOENT) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv, char **envp)
|
||||
{
|
||||
int i;
|
||||
@ -3077,10 +3089,8 @@ int main(int argc, char **argv, char **envp)
|
||||
}
|
||||
}
|
||||
|
||||
if (defconfig) {
|
||||
int ret;
|
||||
ret = qemu_read_default_config_files(userconfig);
|
||||
if (ret < 0) {
|
||||
if (defconfig && userconfig) {
|
||||
if (qemu_read_default_config_file() < 0) {
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
@ -4513,8 +4523,6 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
cpu_synchronize_all_post_init();
|
||||
|
||||
numa_post_machine_init();
|
||||
|
||||
if (hax_enabled()) {
|
||||
hax_sync_vcpus();
|
||||
}
|
||||
@ -4539,6 +4547,9 @@ int main(int argc, char **argv, char **envp)
|
||||
device_init_func, NULL, NULL)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
numa_post_machine_init();
|
||||
|
||||
rom_reset_order_override();
|
||||
|
||||
/* Did we create any drives that we failed to create a device for? */
|
||||
|
Loading…
Reference in New Issue
Block a user