Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- hw/i386/pc.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 348b15f..4e07ef9 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -57,6 +57,7 @@ #include "hw/boards.h" #include "hw/pci/pci_host.h" #include "acpi-build.h" +#include "qom/node.h" /* debug PC/ISA interrupts */ //#define DEBUG_IRQ @@ -927,11 +928,13 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level) } } -static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id, +static X86CPU *pc_new_cpu(const char *cpu_model, int64_t id, DeviceState *icc_bridge, Error **errp) { X86CPU *cpu; Error *local_err = NULL; + Object *thread; + int64_t apic_id = x86_cpu_apic_id_from_index(id); cpu = cpu_x86_create(cpu_model, icc_bridge, &local_err); if (local_err != NULL) { @@ -942,11 +945,17 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id, object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err); object_property_set_bool(OBJECT(cpu), true, "realized", &local_err); + thread = object_get_thread_from_index(id); + if (thread) { + object_property_set_link(thread, OBJECT(cpu), "cpu", &local_err); + } + if (local_err) { error_propagate(errp, local_err); object_unref(OBJECT(cpu)); cpu = NULL; } + return cpu; } @@ -976,7 +985,29 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) icc_bridge = DEVICE(object_resolve_path_type("icc-bridge", TYPE_ICC_BRIDGE, NULL)); - pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp); + pc_new_cpu(current_cpu_model, id, icc_bridge, errp); +} + +static void qdev_cpus_init(void) +{ + int i, nodes; + gchar *node_name; + Object *obj; + + if (nb_numa_nodes) { + nodes = nb_numa_nodes; + } else { + nodes = 1; + } + + for (i = 0; i < nodes; i++) { + obj = object_new(TYPE_NODE); + node_name = g_strdup_printf("node[%" PRIi32 "]", i); + object_property_add_child(qdev_get_machine(), + node_name, obj, NULL); + g_free(node_name); + } + } void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) @@ -995,9 +1026,10 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge) } current_cpu_model = cpu_model; + qdev_cpus_init(); + for (i = 0; i < smp_cpus; i++) { - cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i), - icc_bridge, &error); + cpu = pc_new_cpu(cpu_model, i, icc_bridge, &error); if (error) { error_report("%s", error_get_pretty(error)); error_free(error); -- 1.8.1.4