mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
target-i386: Move APIC to ICC bus
It allows APIC to be hotplugged. * map APIC's mmio at board level if it is present * do not register mmio region for each APIC, since only one is used/mapped Signed-off-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
62fc403f11
commit
53a89e262b
6 changed files with 42 additions and 24 deletions
|
@ -21,6 +21,8 @@
|
|||
#include "hw/i386/apic_internal.h"
|
||||
#include "trace.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "hw/qdev.h"
|
||||
#include "hw/sysbus.h"
|
||||
|
||||
static int apic_irq_delivered;
|
||||
bool apic_report_tpr_access;
|
||||
|
@ -282,12 +284,13 @@ static int apic_load_old(QEMUFile *f, void *opaque, int version_id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int apic_init_common(SysBusDevice *dev)
|
||||
static int apic_init_common(ICCDevice *dev)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
APICCommonClass *info;
|
||||
static DeviceState *vapic;
|
||||
static int apic_no;
|
||||
static bool mmio_registered;
|
||||
|
||||
if (apic_no >= MAX_APICS) {
|
||||
return -1;
|
||||
|
@ -296,8 +299,11 @@ static int apic_init_common(SysBusDevice *dev)
|
|||
|
||||
info = APIC_COMMON_GET_CLASS(s);
|
||||
info->init(s);
|
||||
|
||||
sysbus_init_mmio(dev, &s->io_memory);
|
||||
if (!mmio_registered) {
|
||||
ICCBus *b = ICC_BUS(qdev_get_parent_bus(DEVICE(dev)));
|
||||
memory_region_add_subregion(b->apic_address_space, 0, &s->io_memory);
|
||||
mmio_registered = true;
|
||||
}
|
||||
|
||||
/* Note: We need at least 1M to map the VAPIC option ROM */
|
||||
if (!vapic && s->vapic_control & VAPIC_ENABLE_MASK &&
|
||||
|
@ -375,19 +381,19 @@ static Property apic_properties_common[] = {
|
|||
|
||||
static void apic_common_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);
|
||||
ICCDeviceClass *idc = ICC_DEVICE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_apic_common;
|
||||
dc->reset = apic_reset_common;
|
||||
dc->no_user = 1;
|
||||
dc->props = apic_properties_common;
|
||||
sc->init = apic_init_common;
|
||||
idc->init = apic_init_common;
|
||||
}
|
||||
|
||||
static const TypeInfo apic_common_type = {
|
||||
.name = TYPE_APIC_COMMON,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.parent = TYPE_ICC_DEVICE,
|
||||
.instance_size = sizeof(APICCommonState),
|
||||
.class_size = sizeof(APICCommonClass),
|
||||
.class_init = apic_common_class_init,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue