[PATCH 6/6] device assignment: support for hot-plugging PCI devices

muli
2008-10-28T10:06:56Z

From: Amit Shah <amit.shah@redhat.com>

This patch adds support for hot-plugging host PCI devices into
guests

Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Muli Ben-Yehuda <muli@il.ibm.com>
---
qemu/hw/device-hotplug.c | 21 +++++++++++++++++++++
qemu/monitor.c | 2 +-
2 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/qemu/hw/device-hotplug.c b/qemu/hw/device-hotplug.c
index 8e2bc35..817e708 100644
--- a/qemu/hw/device-hotplug.c
+++ b/qemu/hw/device-hotplug.c
@@ -6,6 +6,7 @@
#include "pc.h"
#include "console.h"
#include "block_int.h"
+#include "device-assignment.h"

#define PCI_BASE_CLASS_STORAGE 0x01
#define PCI_BASE_CLASS_NETWORK 0x02
@@ -27,6 +28,24 @@ static PCIDevice *qemu_system_hot_add_nic(const char *opts, int bus_nr)
return pci_nic_init (pci_bus, &nd_table[ret], -1);
}

+static PCIDevice *qemu_system_hot_assign_device(const char *opts, int bus_nr)
+{
+ PCIBus *pci_bus;
+ AssignedDevInfo *adev;
+
+ pci_bus = pci_find_bus(bus_nr);
+ if (!pci_bus) {
+ term_printf ("Can't find pci_bus %d\n", bus_nr);
+ return NULL;
+ }
+ adev = add_assigned_device(opts);
+ if (adev == NULL) {
+ term_printf ("Error adding device; check syntax\n");
+ return NULL;
+ }
+ return init_assigned_device(adev, pci_bus);
+}
+
static int add_init_drive(const char *opts)
{
int drive_opt_idx, drive_idx;
@@ -143,6 +162,8 @@ void device_hot_add(int pcibus, const char *type, const char *opts)
dev = qemu_system_hot_add_nic(opts, pcibus);
else if (strcmp(type, "storage") == 0)
dev = qemu_system_hot_add_storage(opts, pcibus);
+ else if (strcmp(type, "host") == 0)
+ dev = qemu_system_hot_assign_device(opts, pcibus);
else
term_printf("invalid type: %s\n", type);

diff --git a/qemu/monitor.c b/qemu/monitor.c
index 79b6b4c..d1043b1 100644
--- a/qemu/monitor.c
+++ b/qemu/monitor.c
@@ -1529,7 +1529,7 @@ static const term_cmd_t term_cmds[] = {
"[,cyls=c,heads=h,secs=s[,trans=t]]\n"
"[snapshot=on|off][,cache=on|off]",
"add drive to PCI storage controller" },
- { "pci_add", "iss", device_hot_add, "bus nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...", "hot-add PCI device" },
+ { "pci_add", "iss", device_hot_add, "bus nic|storage|host [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]... [host=02:00.0[,name=string][,dma=none]" "hot-add PCI device" },
{ "pci_del", "ii", device_hot_remove, "bus slot-number", "hot remove PCI device" },
#endif
{ "balloon", "i", do_balloon,
--
1.5.6.5