From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:41983) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QUNub-0006Lv-HN for qemu-devel@nongnu.org; Wed, 08 Jun 2011 14:55:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QUNuX-00068I-8h for qemu-devel@nongnu.org; Wed, 08 Jun 2011 14:55:28 -0400 Received: from fmmailgate01.web.de ([217.72.192.221]:37238) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QUNuW-00067g-9d for qemu-devel@nongnu.org; Wed, 08 Jun 2011 14:55:24 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 8 Jun 2011 20:55:10 +0200 Message-Id: <1307559319-16183-4-git-send-email-andreas.faerber@web.de> In-Reply-To: <1307559319-16183-3-git-send-email-andreas.faerber@web.de> References: <4DEF2F25.5070104@redhat.com> <1307559319-16183-1-git-send-email-andreas.faerber@web.de> <1307559319-16183-2-git-send-email-andreas.faerber@web.de> <1307559319-16183-3-git-send-email-andreas.faerber@web.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: andreas.faerber@web.de Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [RFC v4 03/12] isa: Provide set_state callback List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , hpoussin@reactos.org, kraxel@redhat.com To allow enabling/disabling present ISA devices without hotplug, keep track of state and add a helper to avoid enabling twice. Since the properties to be configured are defined at device level, delegate the actual work to a callback function. If no callback is supplied, the device can't be disabled. Prepare VMSTATE_ISA_DEVICE for devices that support disabling. Legacy devices never change their state and won't need this yet. Cc: Gerd Hoffmann Signed-off-by: Andreas F=C3=A4rber --- hw/hw.h | 15 +++++++++++++++ hw/isa-bus.c | 29 +++++++++++++++++++++++++++++ hw/isa.h | 4 ++++ 3 files changed, 48 insertions(+), 0 deletions(-) diff --git a/hw/hw.h b/hw/hw.h index 56447a7..07b1e2e 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -628,6 +628,21 @@ extern const VMStateInfo vmstate_info_unused_buffer; .info =3D &vmstate_info_unused_buffer, \ .flags =3D VMS_BUFFER, \ } + +extern const VMStateDescription vmstate_isa_device; + +#define VMSTATE_ISA_DEVICE_V(_field, _state, _version) { \ + .name =3D (stringify(_field)), \ + .version_id =3D (_version), \ + .size =3D sizeof(ISADevice), \ + .vmsd =3D &vmstate_isa_device, \ + .flags =3D VMS_STRUCT, \ + .offset =3D vmstate_offset_value(_state, _field, ISADevice), \ +} + +#define VMSTATE_ISA_DEVICE(_field, _state) { \ + VMSTATE_ISA_DEVICE_V(_field, _state, 0) + extern const VMStateDescription vmstate_pci_device; =20 #define VMSTATE_PCI_DEVICE(_field, _state) { \ diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 2765543..d258932 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -112,6 +112,7 @@ static int isa_qdev_init(DeviceState *qdev, DeviceInf= o *base) =20 dev->isairq[0] =3D -1; dev->isairq[1] =3D -1; + dev->enabled =3D true; =20 return info->init(dev); } @@ -156,6 +157,34 @@ ISADevice *isa_create_simple(const char *name) return dev; } =20 +const VMStateDescription vmstate_isa_device =3D { + .name =3D "ISADevice", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField []) { + VMSTATE_BOOL(enabled, ISADevice), + VMSTATE_END_OF_LIST() + } +}; + +int isa_set_state(ISADevice *dev, bool enabled) +{ + ISADeviceInfo *info =3D DO_UPCAST(ISADeviceInfo, qdev, dev->qdev.inf= o); + int err; + + if (dev->enabled =3D=3D enabled) { + return 42; + } else if (info->set_state =3D=3D NULL) { + return -1; + } + err =3D info->set_state(dev, enabled); + if (err < 0) { + return err; + } + dev->enabled =3D enabled; + return err; +} + static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent) { ISADevice *d =3D DO_UPCAST(ISADevice, qdev, dev); diff --git a/hw/isa.h b/hw/isa.h index d2b6126..5d460ab 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -16,12 +16,15 @@ struct ISADevice { int nirqs; uint16_t ioports[32]; int nioports; + bool enabled; }; =20 typedef int (*isa_qdev_initfn)(ISADevice *dev); +typedef int (*isa_qdev_statefn)(ISADevice *dev, bool enabled); struct ISADeviceInfo { DeviceInfo qdev; isa_qdev_initfn init; + isa_qdev_statefn set_state; }; =20 ISABus *isa_bus_new(DeviceState *dev); @@ -34,6 +37,7 @@ void isa_qdev_register(ISADeviceInfo *info); ISADevice *isa_create(const char *name); ISADevice *isa_try_create(const char *name); ISADevice *isa_create_simple(const char *name); +int isa_set_state(ISADevice *dev, bool enabled); =20 extern target_phys_addr_t isa_mem_base; =20 --=20 1.7.5.3