>From 45b40eecff85b9a7ae4caf4ae184905a79e5a139 Mon Sep 17 00:00:00 2001 From: Xiantao Zhang <[EMAIL PROTECTED]> Date: Fri, 7 Nov 2008 18:13:13 +0800 Subject: [PATCH] KVM: Userspace: Make device-assignment work for kvm/ia64.
kvm/ia64 have supported vt-d from 2.6.28rc1, this patch
enables its userspace's support.
Signed-off-by: Xiantao Zhang <[EMAIL PROTECTED]>
---
kernel/ia64/Kbuild | 4 ++++
qemu/Makefile.target | 7 ++++---
qemu/hw/device-assignment.c | 4 ++++
qemu/hw/ipf.c | 27 +++++++++++++++++++++++++--
qemu/hw/pc.h | 2 ++
qemu/vl.c | 8 ++++----
6 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/kernel/ia64/Kbuild b/kernel/ia64/Kbuild
index e9660ba..88eaa39 100644
--- a/kernel/ia64/Kbuild
+++ b/kernel/ia64/Kbuild
@@ -3,6 +3,10 @@ obj-m := kvm.o kvm-intel.o
kvm-objs := kvm_main.o ioapic.o coalesced_mmio.o kvm-ia64.o kvm_fw.o \
irq_comm.o ../anon_inodes.o ../external-module-compat.o
+ifeq ($(CONFIG_DMAR),y)
+kvm-objs += vtd.o
+endif
+
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
kvm-intel-objs := vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
vtlb.o process.o memset.o memcpy.o
diff --git a/qemu/Makefile.target b/qemu/Makefile.target
index d504b75..229b1c6 100644
--- a/qemu/Makefile.target
+++ b/qemu/Makefile.target
@@ -720,15 +720,16 @@ OBJS += virtio.o virtio-net.o virtio-blk.o
virtio-balloon.o
OBJS += device-hotplug.o
+ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
+OBJS+= device-assignment.o
+endif
+
ifeq ($(TARGET_BASE_ARCH), i386)
# Hardware support
OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o
OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o
OBJS+= cirrus_vga.o apic.o parallel.o acpi.o piix_pci.o
OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o extboot.o
-ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
-OBJS+= device-assignment.o
-endif
ifeq ($(USE_KVM_PIT), 1)
OBJS+= i8254-kvm.o
endif
diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 78b7e14..5cda7d9 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -457,6 +457,10 @@ void assigned_dev_update_irq(PCIDevice *d)
irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
irq = piix_get_irq(irq);
+#ifdef TARGET_IA64
+ irq = ipf_map_irq(d, irq);
+#endif
+
if (irq != assigned_dev->girq) {
struct kvm_assigned_irq assigned_irq_data;
diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index 337c854..f4a2853 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -38,6 +38,7 @@
#include "firmware.h"
#include "ia64intrin.h"
#include <unistd.h>
+#include "device-assignment.h"
#include "qemu-kvm.h"
@@ -450,7 +451,6 @@ static void ipf_init1(ram_addr_t ram_size, int vga_ram_size,
/*Load firware to its proper position.*/
if (kvm_enabled()) {
- int r;
unsigned long image_size;
char *image = NULL;
uint8_t *fw_image_start;
@@ -645,8 +645,26 @@ static void ipf_init1(ram_addr_t ram_size, int
vga_ram_size,
unit_id++;
}
}
-}
+#ifdef USE_KVM_DEVICE_ASSIGNMENT
+ if (kvm_enabled()) {
+ int i;
+ for (i = 0; i < assigned_devices_index; i++) {
+ if (add_assigned_device(assigned_devices[i]) < 0) {
+ fprintf(stderr, "Warning: could not add assigned device %s\n",
+ assigned_devices[i]);
+ }
+ }
+
+ if (init_all_assigned_devices(pci_bus)) {
+ fprintf(stderr, "Failed to initialize assigned devices\n");
+ exit (1);
+ }
+ }
+#endif /* USE_KVM_DEVICE_ASSIGNMENT */
+
+}
+
static void ipf_init_pci(ram_addr_t ram_size, int vga_ram_size,
const char *boot_device, DisplayState *ds,
const char *kernel_filename,
@@ -695,3 +713,8 @@ void ioapic_set_irq(void *opaque, int irq_num, int level)
return;
}
}
+
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num)
+{
+ return ioapic_map_irq(pci_dev->devfn, irq_num);
+}
diff --git a/qemu/hw/pc.h b/qemu/hw/pc.h
index fddfdfa..074195d 100644
--- a/qemu/hw/pc.h
+++ b/qemu/hw/pc.h
@@ -118,6 +118,8 @@ int piix4_init(PCIBus *bus, int devfn);
int piix_get_irq(int pin);
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
+
/* vga.c */
enum vga_retrace_method {
VGA_RETRACE_DUMB,
diff --git a/qemu/vl.c b/qemu/vl.c
index 561e254..c383587 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8694,7 +8694,7 @@ static void help(int exitcode)
#endif
"-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
"-no-kvm-pit disable KVM kernel mode PIT\n"
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) ||
defined(__linux__)
"-pcidevice host=bus:dev.func[,dma=none][,name=string]\n"
" expose a PCI device to the guest OS.\n"
" dma=none: don't perform any dma translations
(default is to use an iommu)\n"
@@ -8819,7 +8819,7 @@ enum {
QEMU_OPTION_no_kvm,
QEMU_OPTION_no_kvm_irqchip,
QEMU_OPTION_no_kvm_pit,
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) ||
defined(__linux__)
QEMU_OPTION_pcidevice,
#endif
QEMU_OPTION_no_reboot,
@@ -8911,7 +8911,7 @@ static const QEMUOption qemu_options[] = {
#endif
{ "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
{ "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) ||
defined(__linux__)
{ "pcidevice", HAS_ARG, QEMU_OPTION_pcidevice },
#endif
#endif
@@ -9859,7 +9859,7 @@ int main(int argc, char **argv)
kvm_pit = 0;
break;
}
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) ||
defined(__linux__)
case QEMU_OPTION_pcidevice:
if (assigned_devices_index >= MAX_DEV_ASSIGN_CMDLINE) {
fprintf(stderr, "Too many assigned devices\n");
--
1.6.0
0001-KVM-Userspace-Make-device-assignment-work-for-kvm.patch
Description: 0001-KVM-Userspace-Make-device-assignment-work-for-kvm.patch
