operations of memory regison(PIIX4_PROC_BASE) for cpu hostplug can be transfered to EC space naturally by adding EC support.
Signed-off-by: liguang <[email protected]> --- hw/acpi/piix4.c | 46 ++++++++++------------------------------------ hw/i386/pc.c | 16 ++++++++-------- include/hw/acpi/ec.h | 5 +++-- 3 files changed, 21 insertions(+), 46 deletions(-) diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index 8c5b39a..44928e3 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -600,31 +600,6 @@ static const MemoryRegionOps piix4_pci_ops = { }, }; -static uint64_t cpu_status_read(void *opaque, hwaddr addr, unsigned int size) -{ - PIIX4PMState *s = opaque; - CPUStatus *cpus = &s->gpe_cpu; - uint64_t val = cpus->sts[addr]; - - return val; -} - -static void cpu_status_write(void *opaque, hwaddr addr, uint64_t data, - unsigned int size) -{ - /* TODO: implement VCPU removal on guest signal that CPU can be removed */ -} - -static const MemoryRegionOps cpu_hotplug_ops = { - .read = cpu_status_read, - .write = cpu_status_write, - .endianness = DEVICE_LITTLE_ENDIAN, - .valid = { - .min_access_size = 1, - .max_access_size = 1, - }, -}; - static void pm_ec_sci_req(Notifier *n, void *opaque) { PIIX4PMState *s = container_of(n, PIIX4PMState, ec_sci_notifier); @@ -653,18 +628,20 @@ static void piix4_cpu_hotplug_req(PIIX4PMState *s, CPUState *cpu, cpu_id = k->get_arch_id(CPU(cpu)); if (action == PLUG) { g->sts[cpu_id / 8] |= (1 << (cpu_id % 8)); + ec_acpi_space_poke(EC_ACPI_SPACE_CPUM + cpu_id/8, 1 << (cpu_id%8)); + if (qemu_ec_enabled()) { + ec_acpi_event(EVENT_CPU_ONLINE); + } } else { g->sts[cpu_id / 8] &= ~(1 << (cpu_id % 8)); + if (qemu_ec_enabled()) { + uint8_t tmp; + tmp = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + cpu_id/8); + tmp &= ~(1 << (cpu_id%8)); + ec_acpi_space_poke(EC_ACPI_SPACE_CPUM + cpu_id/8, tmp); + } } pm_update_sci(s); - - if (qemu_ec_enabled()) { - uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS); - - ec_acpi_event(EVENT_CPU_ONLINE); - ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, 1 << cpu_id | cpu_sts); - ec_acpi_space_poke(EC_ACPI_SPACE_CPUN, cpu_id); - } } static void piix4_cpu_added_req(Notifier *n, void *opaque) @@ -701,9 +678,6 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion *parent, pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev); qemu_for_each_cpu(piix4_init_cpu_status, &s->gpe_cpu); - memory_region_init_io(&s->io_cpu, &cpu_hotplug_ops, s, "apci-cpu-hotplug", - PIIX4_PROC_LEN); - memory_region_add_subregion(parent, PIIX4_PROC_BASE, &s->io_cpu); s->cpu_added_notifier.notify = piix4_cpu_added_req; qemu_register_cpu_added_notifier(&s->cpu_added_notifier); s->ec_sci_notifier.notify = pm_ec_sci_req; diff --git a/hw/i386/pc.c b/hw/i386/pc.c index a239892..8e98705 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -927,14 +927,14 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) { DeviceState *icc_bridge; int64_t apic_id = x86_cpu_apic_id_from_index(id); - uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS); + uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + apic_id/8); if (cpu_exists(apic_id)) { - if (cpu_sts & 1 << id) { + if (cpu_sts & 1 << id%8) { error_setg(errp, "Unable to add CPU: %" PRIi64 ", it already exists", id); } else { - ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts | 1 << id); + ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts | 1 << id%8); } return; } @@ -945,7 +945,7 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) return; } - ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts | 1 << id); + ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts | 1 << id%8); icc_bridge = DEVICE(object_resolve_path_type("icc-bridge", TYPE_ICC_BRIDGE, NULL)); pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp); @@ -953,7 +953,7 @@ void pc_hot_add_cpu(const int64_t id, Error **errp) void pc_hot_del_cpu(const int64_t id, Error **errp) { - uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS); + uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + id/8); if (id >= max_cpus) { error_setg(errp, "Unable to del CPU: %" PRIi64 @@ -961,9 +961,9 @@ void pc_hot_del_cpu(const int64_t id, Error **errp) return; } - if (cpu_sts & 1 << id) { - ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts & ~(1 << id)); - ec_acpi_space_poke(EC_ACPI_SPACE_CPUN, id); + if (cpu_sts & 1 << id/8) { + ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts & ~(1 << id%8)); + ec_acpi_space_poke(EC_ACPI_SPACE_CPUI, id); } else { error_setg(errp, "Unable to del CPU: %" PRIi64 ", it was not added before.", id); diff --git a/include/hw/acpi/ec.h b/include/hw/acpi/ec.h index 276d62a..8109e04 100644 --- a/include/hw/acpi/ec.h +++ b/include/hw/acpi/ec.h @@ -26,8 +26,9 @@ #define EVENT_CPU_OFFLINE 0x2 /* index of acpi space*/ -#define EC_ACPI_SPACE_CPUS 1 -#define EC_ACPI_SPACE_CPUN 2 +#define EC_ACPI_SPACE_CCMD 2 +#define EC_ACPI_SPACE_CPUI 3 +#define EC_ACPI_SPACE_CPUM 4 void qemu_register_ec_sci_notifier(Notifier *notifier); bool qemu_ec_enabled(void); -- 1.7.2.5
