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 void AcpiCpuHotplug_add(ACPIGPE
*gpe
, AcpiCpuHotplug
*g
, CPUState
*cpu
)
41 CPUClass
*k
= CPU_GET_CLASS(cpu
);
44 *gpe
->sts
= *gpe
->sts
| ACPI_CPU_HOTPLUG_STATUS
;
45 cpu_id
= k
->get_arch_id(CPU(cpu
));
46 g_assert((cpu_id
/ 8) < ACPI_GPE_PROC_LEN
);
47 g
->sts
[cpu_id
/ 8] |= (1 << (cpu_id
% 8));
50 void AcpiCpuHotplug_init(MemoryRegion
*parent
, Object
*owner
,
51 AcpiCpuHotplug
*gpe_cpu
, uint16_t base
)
56 CPUClass
*cc
= CPU_GET_CLASS(cpu
);
57 int64_t id
= cc
->get_arch_id(cpu
);
59 g_assert((id
/ 8) < ACPI_GPE_PROC_LEN
);
60 gpe_cpu
->sts
[id
/ 8] |= (1 << (id
% 8));
62 memory_region_init_io(&gpe_cpu
->io
, owner
, &AcpiCpuHotplug_ops
,
63 gpe_cpu
, "acpi-cpu-hotplug", ACPI_GPE_PROC_LEN
);
64 memory_region_add_subregion(parent
, base
, &gpe_cpu
->io
);