@@ -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;
@@ -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);
@@ -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);
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 <lig.fnst@cn.fujitsu.com> --- hw/acpi/piix4.c | 46 ++++++++++------------------------------------ hw/i386/pc.c | 16 ++++++++-------- include/hw/acpi/ec.h | 5 +++-- 3 files changed, 21 insertions(+), 46 deletions(-)