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"
17 static uint64_t cpu_status_read(void *opaque
, hwaddr addr
, unsigned int size
)
19 AcpiCpuHotplug
*cpus
= opaque
;
20 uint64_t val
= cpus
->sts
[addr
];
25 static void cpu_status_write(void *opaque
, hwaddr addr
, uint64_t data
,
28 /* TODO: implement VCPU removal on guest signal that CPU can be removed */
31 static const MemoryRegionOps AcpiCpuHotplug_ops
= {
32 .read
= cpu_status_read
,
33 .write
= cpu_status_write
,
34 .endianness
= DEVICE_LITTLE_ENDIAN
,
41 static void acpi_set_cpu_present_bit(AcpiCpuHotplug
*g
, CPUState
*cpu
,
44 CPUClass
*k
= CPU_GET_CLASS(cpu
);
47 cpu_id
= k
->get_arch_id(cpu
);
48 if ((cpu_id
/ 8) >= ACPI_GPE_PROC_LEN
) {
49 error_setg(errp
, "acpi: invalid cpu id: %" PRIi64
, cpu_id
);
53 g
->sts
[cpu_id
/ 8] |= (1 << (cpu_id
% 8));
56 void acpi_cpu_plug_cb(ACPIREGS
*ar
, qemu_irq irq
,
57 AcpiCpuHotplug
*g
, DeviceState
*dev
, Error
**errp
)
59 acpi_set_cpu_present_bit(g
, CPU(dev
), errp
);
64 acpi_send_gpe_event(ar
, irq
, ACPI_CPU_HOTPLUG_STATUS
);
67 void acpi_cpu_hotplug_init(MemoryRegion
*parent
, Object
*owner
,
68 AcpiCpuHotplug
*gpe_cpu
, uint16_t base
)
73 acpi_set_cpu_present_bit(gpe_cpu
, cpu
, &error_abort
);
75 memory_region_init_io(&gpe_cpu
->io
, owner
, &AcpiCpuHotplug_ops
,
76 gpe_cpu
, "acpi-cpu-hotplug", ACPI_GPE_PROC_LEN
);
77 memory_region_add_subregion(parent
, base
, &gpe_cpu
->io
);