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.
13 #include "hw/acpi/cpu_hotplug.h"
15 static uint64_t cpu_status_read(void *opaque
, hwaddr addr
, unsigned int size
)
17 AcpiCpuHotplug
*cpus
= opaque
;
18 uint64_t val
= cpus
->sts
[addr
];
23 static void cpu_status_write(void *opaque
, hwaddr addr
, uint64_t data
,
26 /* TODO: implement VCPU removal on guest signal that CPU can be removed */
29 static const MemoryRegionOps AcpiCpuHotplug_ops
= {
30 .read
= cpu_status_read
,
31 .write
= cpu_status_write
,
32 .endianness
= DEVICE_LITTLE_ENDIAN
,
39 static void acpi_set_cpu_present_bit(AcpiCpuHotplug
*g
, CPUState
*cpu
,
42 CPUClass
*k
= CPU_GET_CLASS(cpu
);
45 cpu_id
= k
->get_arch_id(cpu
);
46 if ((cpu_id
/ 8) >= ACPI_GPE_PROC_LEN
) {
47 error_setg(errp
, "acpi: invalid cpu id: %" PRIi64
, cpu_id
);
51 g
->sts
[cpu_id
/ 8] |= (1 << (cpu_id
% 8));
54 void acpi_cpu_plug_cb(ACPIREGS
*ar
, qemu_irq irq
,
55 AcpiCpuHotplug
*g
, DeviceState
*dev
, Error
**errp
)
57 acpi_set_cpu_present_bit(g
, CPU(dev
), errp
);
62 ar
->gpe
.sts
[0] |= ACPI_CPU_HOTPLUG_STATUS
;
63 acpi_update_sci(ar
, irq
);
66 void acpi_cpu_hotplug_init(MemoryRegion
*parent
, Object
*owner
,
67 AcpiCpuHotplug
*gpe_cpu
, uint16_t base
)
72 acpi_set_cpu_present_bit(gpe_cpu
, cpu
, &error_abort
);
74 memory_region_init_io(&gpe_cpu
->io
, owner
, &AcpiCpuHotplug_ops
,
75 gpe_cpu
, "acpi-cpu-hotplug", ACPI_GPE_PROC_LEN
);
76 memory_region_add_subregion(parent
, base
, &gpe_cpu
->io
);