PCI: Convert pci_device_hot_add() to QObject

Return a QDict with information about the just added device.

This commit should not change user output.

Please, note that this patch does not do error handling
conversion. In error conditions the handler still calls
monitor_printf().

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Luiz Capitulino 2009-12-10 17:16:09 -02:00 committed by Anthony Liguori
parent 588b383201
commit 7a344f7ac7
3 changed files with 40 additions and 6 deletions

View File

@ -33,6 +33,7 @@
#include "scsi.h"
#include "virtio-blk.h"
#include "qemu-config.h"
#include "qemu-objects.h"
#if defined(TARGET_I386)
static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
@ -228,7 +229,36 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
return dev;
}
void pci_device_hot_add(Monitor *mon, const QDict *qdict)
void pci_device_hot_add_print(Monitor *mon, const QObject *data)
{
QDict *qdict;
assert(qobject_type(data) == QTYPE_QDICT);
qdict = qobject_to_qdict(data);
monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n",
(int) qdict_get_int(qdict, "domain"),
(int) qdict_get_int(qdict, "bus"),
(int) qdict_get_int(qdict, "slot"),
(int) qdict_get_int(qdict, "function"));
}
/**
* pci_device_hot_add(): Hot add a PCI device
*
* Return a QDict with the following device information:
*
* - "domain": domain number
* - "bus": bus number
* - "slot": slot number
* - "function": function number
*
* Example:
*
* { "domain": 0, "bus": 0, "slot": 5, "function": 0 }
*/
void pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
{
PCIDevice *dev = NULL;
const char *pci_addr = qdict_get_str(qdict, "pci_addr");
@ -255,9 +285,11 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict)
monitor_printf(mon, "invalid type: %s\n", type);
if (dev) {
monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n",
0, pci_bus_num(dev->bus), PCI_SLOT(dev->devfn),
PCI_FUNC(dev->devfn));
*ret_data =
qobject_from_jsonf("{ 'domain': 0, 'bus': %d, 'slot': %d, "
"'function': %d }", pci_bus_num(dev->bus),
PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
assert(*ret_data != NULL);
} else
monitor_printf(mon, "failed to add %s\n", opts);
}

View File

@ -810,7 +810,8 @@ ETEXI
.args_type = "pci_addr:s,type:s,opts:s?",
.params = "auto|[[<domain>:]<bus>:]<slot> nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...",
.help = "hot-add PCI device",
.mhandler.cmd = pci_device_hot_add,
.user_print = pci_device_hot_add_print,
.mhandler.cmd_new = pci_device_hot_add,
},
#endif

View File

@ -212,7 +212,8 @@ extern DriveInfo *drive_init(QemuOpts *arg, void *machine, int *fatal_error);
DriveInfo *add_init_drive(const char *opts);
/* pci-hotplug */
void pci_device_hot_add(Monitor *mon, const QDict *qdict);
void pci_device_hot_add_print(Monitor *mon, const QObject *data);
void pci_device_hot_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
void drive_hot_add(Monitor *mon, const QDict *qdict);
void pci_device_hot_remove(Monitor *mon, const char *pci_addr);
void do_pci_device_hot_remove(Monitor *mon, const QDict *qdict,