mirror of https://github.com/xemu-project/xemu.git
include/hw/ide: Unexport pci_piix3_xen_ide_unplug()
This function was declared in a generic and public header, implemented in a device-specific source file but only used in xen_platform. Given its 'aux' parameter, this function is more xen-specific than piix-specific. Also, the hardcoded magic constants seem to be generic and related to PCIIDEState and IDEBus rather than piix. Therefore, move this function to xen_platform, unexport it, and drop the "piix3" in the function name as well. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Reviewed-by: Paul Durrant <paul@xen.org> Acked-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220513180957.90514-4-shentey@gmail.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
parent
3690241746
commit
6a8a8b62bd
|
@ -26,6 +26,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "hw/ide.h"
|
#include "hw/ide.h"
|
||||||
|
#include "hw/ide/pci.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
#include "hw/xen/xen_common.h"
|
#include "hw/xen/xen_common.h"
|
||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
|
@ -134,6 +135,51 @@ static void pci_unplug_nics(PCIBus *bus)
|
||||||
pci_for_each_device(bus, 0, unplug_nic, NULL);
|
pci_for_each_device(bus, 0, unplug_nic, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Xen HVM unplug protocol [1] specifies a mechanism to allow guests to
|
||||||
|
* request unplug of 'aux' disks (which is stated to mean all IDE disks,
|
||||||
|
* except the primary master).
|
||||||
|
*
|
||||||
|
* NOTE: The semantics of what happens if unplug of all disks and 'aux' disks
|
||||||
|
* is simultaneously requested is not clear. The implementation assumes
|
||||||
|
* that an 'all' request overrides an 'aux' request.
|
||||||
|
*
|
||||||
|
* [1] https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=docs/misc/hvm-emulated-unplug.pandoc
|
||||||
|
*/
|
||||||
|
static void pci_xen_ide_unplug(DeviceState *dev, bool aux)
|
||||||
|
{
|
||||||
|
PCIIDEState *pci_ide;
|
||||||
|
int i;
|
||||||
|
IDEDevice *idedev;
|
||||||
|
IDEBus *idebus;
|
||||||
|
BlockBackend *blk;
|
||||||
|
|
||||||
|
pci_ide = PCI_IDE(dev);
|
||||||
|
|
||||||
|
for (i = aux ? 1 : 0; i < 4; i++) {
|
||||||
|
idebus = &pci_ide->bus[i / 2];
|
||||||
|
blk = idebus->ifs[i % 2].blk;
|
||||||
|
|
||||||
|
if (blk && idebus->ifs[i % 2].drive_kind != IDE_CD) {
|
||||||
|
if (!(i % 2)) {
|
||||||
|
idedev = idebus->master;
|
||||||
|
} else {
|
||||||
|
idedev = idebus->slave;
|
||||||
|
}
|
||||||
|
|
||||||
|
blk_drain(blk);
|
||||||
|
blk_flush(blk);
|
||||||
|
|
||||||
|
blk_detach_dev(blk, DEVICE(idedev));
|
||||||
|
idebus->ifs[i % 2].blk = NULL;
|
||||||
|
idedev->conf.blk = NULL;
|
||||||
|
monitor_remove_blk(blk);
|
||||||
|
blk_unref(blk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qdev_reset_all(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void unplug_disks(PCIBus *b, PCIDevice *d, void *opaque)
|
static void unplug_disks(PCIBus *b, PCIDevice *d, void *opaque)
|
||||||
{
|
{
|
||||||
uint32_t flags = *(uint32_t *)opaque;
|
uint32_t flags = *(uint32_t *)opaque;
|
||||||
|
@ -147,7 +193,7 @@ static void unplug_disks(PCIBus *b, PCIDevice *d, void *opaque)
|
||||||
|
|
||||||
switch (pci_get_word(d->config + PCI_CLASS_DEVICE)) {
|
switch (pci_get_word(d->config + PCI_CLASS_DEVICE)) {
|
||||||
case PCI_CLASS_STORAGE_IDE:
|
case PCI_CLASS_STORAGE_IDE:
|
||||||
pci_piix3_xen_ide_unplug(DEVICE(d), aux);
|
pci_xen_ide_unplug(DEVICE(d), aux);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCI_CLASS_STORAGE_SCSI:
|
case PCI_CLASS_STORAGE_SCSI:
|
||||||
|
|
|
@ -173,52 +173,6 @@ static void pci_piix_ide_realize(PCIDevice *dev, Error **errp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The Xen HVM unplug protocol [1] specifies a mechanism to allow guests to
|
|
||||||
* request unplug of 'aux' disks (which is stated to mean all IDE disks,
|
|
||||||
* except the primary master).
|
|
||||||
*
|
|
||||||
* NOTE: The semantics of what happens if unplug of all disks and 'aux' disks
|
|
||||||
* is simultaneously requested is not clear. The implementation assumes
|
|
||||||
* that an 'all' request overrides an 'aux' request.
|
|
||||||
*
|
|
||||||
* [1] https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=docs/misc/hvm-emulated-unplug.pandoc
|
|
||||||
*/
|
|
||||||
int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux)
|
|
||||||
{
|
|
||||||
PCIIDEState *pci_ide;
|
|
||||||
int i;
|
|
||||||
IDEDevice *idedev;
|
|
||||||
IDEBus *idebus;
|
|
||||||
BlockBackend *blk;
|
|
||||||
|
|
||||||
pci_ide = PCI_IDE(dev);
|
|
||||||
|
|
||||||
for (i = aux ? 1 : 0; i < 4; i++) {
|
|
||||||
idebus = &pci_ide->bus[i / 2];
|
|
||||||
blk = idebus->ifs[i % 2].blk;
|
|
||||||
|
|
||||||
if (blk && idebus->ifs[i % 2].drive_kind != IDE_CD) {
|
|
||||||
if (!(i % 2)) {
|
|
||||||
idedev = idebus->master;
|
|
||||||
} else {
|
|
||||||
idedev = idebus->slave;
|
|
||||||
}
|
|
||||||
|
|
||||||
blk_drain(blk);
|
|
||||||
blk_flush(blk);
|
|
||||||
|
|
||||||
blk_detach_dev(blk, DEVICE(idedev));
|
|
||||||
idebus->ifs[i % 2].blk = NULL;
|
|
||||||
idedev->conf.blk = NULL;
|
|
||||||
monitor_remove_blk(blk);
|
|
||||||
blk_unref(blk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qdev_reset_all(dev);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pci_piix_ide_exitfn(PCIDevice *dev)
|
static void pci_piix_ide_exitfn(PCIDevice *dev)
|
||||||
{
|
{
|
||||||
PCIIDEState *d = PCI_IDE(dev);
|
PCIIDEState *d = PCI_IDE(dev);
|
||||||
|
|
|
@ -8,9 +8,6 @@
|
||||||
ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
|
ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
|
||||||
DriveInfo *hd0, DriveInfo *hd1);
|
DriveInfo *hd0, DriveInfo *hd1);
|
||||||
|
|
||||||
/* ide-pci.c */
|
|
||||||
int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux);
|
|
||||||
|
|
||||||
/* ide-mmio.c */
|
/* ide-mmio.c */
|
||||||
void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1);
|
void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue