2 * QEMU ACPI hotplug utilities
4 * Copyright (C) 2013 Red Hat Inc
7 * Igor Mammedov <imammedo@redhat.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
12 #include "qemu/osdep.h"
14 #include "hw/acpi/cpu_hotplug.h"
15 #include "qapi/error.h"
18 static uint64_t cpu_status_read(void *opaque
, hwaddr addr
, unsigned int size
)
20 AcpiCpuHotplug
*cpus
= opaque
;
21 uint64_t val
= cpus
->sts
[addr
];
26 static void cpu_status_write(void *opaque
, hwaddr addr
, uint64_t data
,
29 /* TODO: implement VCPU removal on guest signal that CPU can be removed */
32 static const MemoryRegionOps AcpiCpuHotplug_ops
= {
33 .read
= cpu_status_read
,
34 .write
= cpu_status_write
,
35 .endianness
= DEVICE_LITTLE_ENDIAN
,
42 static void acpi_set_cpu_present_bit(AcpiCpuHotplug
*g
, CPUState
*cpu
,
45 CPUClass
*k
= CPU_GET_CLASS(cpu
);
48 cpu_id
= k
->get_arch_id(cpu
);
49 if ((cpu_id
/ 8) >= ACPI_GPE_PROC_LEN
) {
50 error_setg(errp
, "acpi: invalid cpu id: %" PRIi64
, cpu_id
);
54 g
->sts
[cpu_id
/ 8] |= (1 << (cpu_id
% 8));
57 void acpi_cpu_plug_cb(ACPIREGS
*ar
, qemu_irq irq
,
58 AcpiCpuHotplug
*g
, DeviceState
*dev
, Error
**errp
)
60 acpi_set_cpu_present_bit(g
, CPU(dev
), errp
);
65 acpi_send_gpe_event(ar
, irq
, ACPI_CPU_HOTPLUG_STATUS
);
68 void acpi_cpu_hotplug_init(MemoryRegion
*parent
, Object
*owner
,
69 AcpiCpuHotplug
*gpe_cpu
, uint16_t base
)
74 acpi_set_cpu_present_bit(gpe_cpu
, cpu
, &error_abort
);
76 memory_region_init_io(&gpe_cpu
->io
, owner
, &AcpiCpuHotplug_ops
,
77 gpe_cpu
, "acpi-cpu-hotplug", ACPI_GPE_PROC_LEN
);
78 memory_region_add_subregion(parent
, base
, &gpe_cpu
->io
);