[qemu/f16] Fux usb passthrough, floppy support

Justin M. Forbes jforbes at fedoraproject.org
Mon Jan 30 20:05:43 UTC 2012


commit 6f9d9cf506eab902f3cc34f2f0be9d057ca12c3b
Author: Justin M. Forbes <jforbes at redhat.com>
Date:   Mon Jan 30 14:05:37 2012 -0600

    Fux usb passthrough, floppy support

 0029-fdc-Fix-floppy-port-I-O.patch                 |   38 ++++
 ...Avoid-reentrancy-in-DMA-transfer-handlers.patch |   52 +++++
 0031-pc-Fix-floppy-drives-with-if-none.patch       |  195 ++++++++++++++++++++
 ...-dont_trigger_assert_on_packet_completion.patch |   21 ++
 qemu.spec                                          |   20 ++-
 5 files changed, 325 insertions(+), 1 deletions(-)
---
diff --git a/0029-fdc-Fix-floppy-port-I-O.patch b/0029-fdc-Fix-floppy-port-I-O.patch
new file mode 100644
index 0000000..3b71243
--- /dev/null
+++ b/0029-fdc-Fix-floppy-port-I-O.patch
@@ -0,0 +1,38 @@
+From 8175ec8e0fee5f110d91209096e77159ad6404f7 Mon Sep 17 00:00:00 2001
+From: Kevin Wolf <kwolf at redhat.com>
+Date: Tue, 18 Oct 2011 16:41:45 +0200
+Subject: [PATCH 1/2] fdc: Fix floppy port I/O
+
+The floppy device was broken by commit 212ec7ba (fdc: Convert to
+isa_register_portio_list). While the old interface provided the port number
+relative to the floppy drive's io_base, the new one provides the real port
+number, so we need to apply a bitmask now to get the register number.
+
+Signed-off-by: Kevin Wolf <kwolf at redhat.com>
+---
+ hw/fdc.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/hw/fdc.c b/hw/fdc.c
+index 9fdbc75..ec99c78 100644
+--- a/hw/fdc.c
++++ b/hw/fdc.c
+@@ -433,6 +433,7 @@ static uint32_t fdctrl_read (void *opaque, uint32_t reg)
+     FDCtrl *fdctrl = opaque;
+     uint32_t retval;
+ 
++    reg &= 7;
+     switch (reg) {
+     case FD_REG_SRA:
+         retval = fdctrl_read_statusA(fdctrl);
+@@ -470,6 +471,7 @@ static void fdctrl_write (void *opaque, uint32_t reg, uint32_t value)
+ 
+     FLOPPY_DPRINTF("write reg%d: 0x%02x\n", reg & 7, value);
+ 
++    reg &= 7;
+     switch (reg) {
+     case FD_REG_DOR:
+         fdctrl_write_dor(fdctrl, value);
+-- 
+1.7.7.5
+
diff --git a/0030-dma-Avoid-reentrancy-in-DMA-transfer-handlers.patch b/0030-dma-Avoid-reentrancy-in-DMA-transfer-handlers.patch
new file mode 100644
index 0000000..c29e8e7
--- /dev/null
+++ b/0030-dma-Avoid-reentrancy-in-DMA-transfer-handlers.patch
@@ -0,0 +1,52 @@
+From 86f1e4e2f57af82aae0944ed704ab91dc36fc9b7 Mon Sep 17 00:00:00 2001
+From: Kevin Wolf <kwolf at redhat.com>
+Date: Fri, 28 Oct 2011 05:28:13 -0400
+Subject: [PATCH 2/2] dma: Avoid reentrancy in DMA transfer handlers
+
+With the conversion of the block layer to coroutines, bdrv_read/write
+have changed to run a nested event loop that calls qemu_bh_poll.
+Consequently a scheduled BH can be called while a DMA transfer handler
+runs and this means that DMA_run becomes reentrant.
+
+Devices haven't been designed to cope with that, so instead of running a
+nested transfer handler just wait for the next invocation of the BH from the
+main loop.
+
+This fixes some problems with the floppy device.
+
+Signed-off-by: Kevin Wolf <kwolf at redhat.com>
+---
+ hw/dma.c |   10 ++++++++++
+ 1 files changed, 10 insertions(+), 0 deletions(-)
+
+diff --git a/hw/dma.c b/hw/dma.c
+index 8a7302a..0a9322d 100644
+--- a/hw/dma.c
++++ b/hw/dma.c
+@@ -358,6 +358,14 @@ static void DMA_run (void)
+     struct dma_cont *d;
+     int icont, ichan;
+     int rearm = 0;
++    static int running = 0;
++
++    if (running) {
++        rearm = 1;
++        goto out;
++    } else {
++        running = 1;
++    }
+ 
+     d = dma_controllers;
+ 
+@@ -374,6 +382,8 @@ static void DMA_run (void)
+         }
+     }
+ 
++    running = 0;
++out:
+     if (rearm)
+         qemu_bh_schedule_idle(dma_bh);
+ }
+-- 
+1.7.7.5
+
diff --git a/0031-pc-Fix-floppy-drives-with-if-none.patch b/0031-pc-Fix-floppy-drives-with-if-none.patch
new file mode 100644
index 0000000..97cca2c
--- /dev/null
+++ b/0031-pc-Fix-floppy-drives-with-if-none.patch
@@ -0,0 +1,195 @@
+From a6b957c3dbc67e674f457d6c9738076f47ad8bd9 Mon Sep 17 00:00:00 2001
+From: Kevin Wolf <kwolf at redhat.com>
+Date: Thu, 20 Oct 2011 16:37:26 +0200
+Subject: [PATCH] pc: Fix floppy drives with if=none
+
+Commit 63ffb564 broke floppy devices specified on the command line like
+-drive file=...,if=none,id=floppy -global isa-fdc.driveA=floppy because it
+relies on drive_get() which works only with -fda/-drive if=floppy.
+
+This patch resembles what we're already doing for IDE, i.e. remember the floppy
+device that was created and use that to extract the BlockDriverStates where
+needed.
+
+Signed-off-by: Kevin Wolf <kwolf at redhat.com>
+Reviewed-by: Markus Armbruster <armbru at redhat.com>
+---
+ hw/fdc.c     |   12 ++++++++++++
+ hw/fdc.h     |    9 +++++++--
+ hw/pc.c      |   25 ++++++++++++++-----------
+ hw/pc.h      |    3 ++-
+ hw/pc_piix.c |    5 +++--
+ 5 files changed, 38 insertions(+), 16 deletions(-)
+
+diff --git a/hw/fdc.c b/hw/fdc.c
+index ec99c78..4bd6abf 100644
+--- a/hw/fdc.c
++++ b/hw/fdc.c
+@@ -1913,6 +1913,18 @@ static int sun4m_fdc_init1(SysBusDevice *dev)
+     return fdctrl_init_common(fdctrl);
+ }
+ 
++void fdc_get_bs(BlockDriverState *bs[], ISADevice *dev)
++{
++    FDCtrlISABus *isa = DO_UPCAST(FDCtrlISABus, busdev, dev);
++    FDCtrl *fdctrl = &isa->state;
++    int i;
++
++    for (i = 0; i < MAX_FD; i++) {
++        bs[i] = fdctrl->drives[i].bs;
++    }
++}
++
++
+ static const VMStateDescription vmstate_isa_fdc ={
+     .name = "fdc",
+     .version_id = 2,
+diff --git a/hw/fdc.h b/hw/fdc.h
+index 09f73c6..506feb6 100644
+--- a/hw/fdc.h
++++ b/hw/fdc.h
+@@ -7,14 +7,15 @@
+ /* fdc.c */
+ #define MAX_FD 2
+ 
+-static inline void fdctrl_init_isa(DriveInfo **fds)
++static inline ISADevice *fdctrl_init_isa(DriveInfo **fds)
+ {
+     ISADevice *dev;
+ 
+     dev = isa_try_create("isa-fdc");
+     if (!dev) {
+-        return;
++        return NULL;
+     }
++
+     if (fds[0]) {
+         qdev_prop_set_drive_nofail(&dev->qdev, "driveA", fds[0]->bdrv);
+     }
+@@ -22,10 +23,14 @@ static inline void fdctrl_init_isa(DriveInfo **fds)
+         qdev_prop_set_drive_nofail(&dev->qdev, "driveB", fds[1]->bdrv);
+     }
+     qdev_init_nofail(&dev->qdev);
++
++    return dev;
+ }
+ 
+ void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
+                         target_phys_addr_t mmio_base, DriveInfo **fds);
+ void sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base,
+                        DriveInfo **fds, qemu_irq *fdc_tc);
++void fdc_get_bs(BlockDriverState *bs[], ISADevice *dev);
++
+ #endif
+diff --git a/hw/pc.c b/hw/pc.c
+index a3e8539..4903803 100644
+--- a/hw/pc.c
++++ b/hw/pc.c
+@@ -333,12 +333,12 @@ static void pc_cmos_init_late(void *opaque)
+ 
+ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
+                   const char *boot_device,
+-                  BusState *idebus0, BusState *idebus1,
++                  ISADevice *floppy, BusState *idebus0, BusState *idebus1,
+                   ISADevice *s)
+ {
+     int val, nb, nb_heads, max_track, last_sect, i;
+     FDriveType fd_type[2];
+-    DriveInfo *fd[2];
++    BlockDriverState *fd[MAX_FD];
+     static pc_cmos_init_late_arg arg;
+ 
+     /* various important CMOS locations needed by PC/Bochs bios */
+@@ -380,14 +380,16 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
+     }
+ 
+     /* floppy type */
+-    for (i = 0; i < 2; i++) {
+-        fd[i] = drive_get(IF_FLOPPY, 0, i);
+-        if (fd[i] && bdrv_is_inserted(fd[i]->bdrv)) {
+-            bdrv_get_floppy_geometry_hint(fd[i]->bdrv, &nb_heads, &max_track,
+-                                          &last_sect, FDRIVE_DRV_NONE,
+-                                          &fd_type[i]);
+-        } else {
+-            fd_type[i] = FDRIVE_DRV_NONE;
++    if (floppy) {
++        fdc_get_bs(fd, floppy);
++        for (i = 0; i < 2; i++) {
++            if (fd[i] && bdrv_is_inserted(fd[i])) {
++                bdrv_get_floppy_geometry_hint(fd[i], &nb_heads, &max_track,
++                                              &last_sect, FDRIVE_DRV_NONE,
++                                              &fd_type[i]);
++            } else {
++                fd_type[i] = FDRIVE_DRV_NONE;
++            }
+         }
+     }
+     val = (cmos_get_fd_drive_type(fd_type[0]) << 4) |
+@@ -1092,6 +1094,7 @@ static void cpu_request_exit(void *opaque, int irq, int level)
+ 
+ void pc_basic_device_init(qemu_irq *isa_irq,
+                           ISADevice **rtc_state,
++                          ISADevice **floppy,
+                           bool no_vmport)
+ {
+     int i;
+@@ -1156,7 +1159,7 @@ void pc_basic_device_init(qemu_irq *isa_irq,
+     for(i = 0; i < MAX_FD; i++) {
+         fd[i] = drive_get(IF_FLOPPY, 0, i);
+     }
+-    fdctrl_init_isa(fd);
++    *floppy = fdctrl_init_isa(fd);
+ }
+ 
+ void pc_pci_device_init(PCIBus *pci_bus)
+diff --git a/hw/pc.h b/hw/pc.h
+index 6d5730b..24b7fe2 100644
+--- a/hw/pc.h
++++ b/hw/pc.h
+@@ -138,11 +138,12 @@ qemu_irq *pc_allocate_cpu_irq(void);
+ void pc_vga_init(PCIBus *pci_bus);
+ void pc_basic_device_init(qemu_irq *isa_irq,
+                           ISADevice **rtc_state,
++                          ISADevice **floppy,
+                           bool no_vmport);
+ void pc_init_ne2k_isa(NICInfo *nd);
+ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
+                   const char *boot_device,
+-                  BusState *ide0, BusState *ide1,
++                  ISADevice *floppy, BusState *ide0, BusState *ide1,
+                   ISADevice *s);
+ void pc_pci_device_init(PCIBus *pci_bus);
+ 
+diff --git a/hw/pc_piix.c b/hw/pc_piix.c
+index c5c16b4..a634860 100644
+--- a/hw/pc_piix.c
++++ b/hw/pc_piix.c
+@@ -89,6 +89,7 @@ static void pc_init1(ram_addr_t ram_size,
+     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+     BusState *idebus[MAX_IDE_BUS];
+     ISADevice *rtc_state;
++    ISADevice *floppy;
+ 
+     global_cpu_model = cpu_model;
+ 
+@@ -141,7 +142,7 @@ static void pc_init1(ram_addr_t ram_size,
+     }
+ 
+     /* init basic PC hardware */
+-    pc_basic_device_init(isa_irq, &rtc_state, xen_enabled());
++    pc_basic_device_init(isa_irq, &rtc_state, &floppy, xen_enabled());
+ 
+     for(i = 0; i < nb_nics; i++) {
+         NICInfo *nd = &nd_table[i];
+@@ -170,7 +171,7 @@ static void pc_init1(ram_addr_t ram_size,
+     audio_init(isa_irq, pci_enabled ? pci_bus : NULL);
+ 
+     pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
+-                 idebus[0], idebus[1], rtc_state);
++                 floppy, idebus[0], idebus[1], rtc_state);
+ 
+     if (pci_enabled && usb_enabled) {
+         usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
+-- 
+1.7.7.5
+
diff --git a/0101-usb-hub-dont_trigger_assert_on_packet_completion.patch b/0101-usb-hub-dont_trigger_assert_on_packet_completion.patch
new file mode 100644
index 0000000..6d70092
--- /dev/null
+++ b/0101-usb-hub-dont_trigger_assert_on_packet_completion.patch
@@ -0,0 +1,21 @@
+diff --git a/hw/usb-hub.c b/hw/usb-hub.c
+index b49a2fe..6278825 100644
+--- a/hw/usb-hub.c
++++ b/hw/usb-hub.c
+@@ -207,10 +207,14 @@ static void usb_hub_complete(USBPort *port, USBPacket *packet)
+     /*
+      * Just pass it along upstream for now.
+      *
+-     * If we ever inplement usb 2.0 split transactions this will
++     * If we ever implement usb 2.0 split transactions this will
+      * become a little more complicated ...
++     *
++     * Can't use usb_packet_complete() here because packet->owner is
++     * cleared already, go call the ->complete() callback directly
++     * instead.
+      */
+-    usb_packet_complete(&s->dev, packet);
++    s->dev.port->ops->complete(s->dev.port, packet);
+ }
+ 
+ static void usb_hub_handle_attach(USBDevice *dev)
diff --git a/qemu.spec b/qemu.spec
index 4118598..6224bfe 100644
--- a/qemu.spec
+++ b/qemu.spec
@@ -1,7 +1,7 @@
 Summary: QEMU is a FAST! processor emulator
 Name: qemu
 Version: 0.15.1
-Release: 3%{?dist}
+Release: 4%{?dist}
 # Epoch because we pushed a qemu-1.0 package
 Epoch: 2
 License: GPLv2+ and LGPLv2+ and BSD
@@ -70,12 +70,19 @@ Patch25: 0025-spice-qemu-char-Generate-chardev-open-close-events.patch
 Patch26: 0026-usb-redir-Call-qemu_chr_guest_open-close.patch
 Patch27: 0027-usb-redir-Device-disconnect-re-connect-robustness-fi.patch
 Patch28: 0028-usb-redir-Don-t-try-to-write-to-the-chardev-after-a-.patch
+Patch29: 0029-fdc-Fix-floppy-port-I-O.patch
+Patch30: 0030-dma-Avoid-reentrancy-in-DMA-transfer-handlers.patch
+Patch31: 0031-pc-Fix-floppy-drives-with-if-none.patch
+
 
 # Allow -machine parameter to be used without specifying a machine type.
 # Upstream in qemu but apparently not in qemu-kvm yet.
 # qemu commit 2645c6dcaf6ea2a51a3b6dfa407dd203004e4d11
 Patch100: qemu-Allow-to-leave-type-on-default-in-machine.patch
 
+# Upstream patches from 1.0
+Patch101: 0101-usb-hub-dont_trigger_assert_on_packet_completion.patch
+
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: SDL-devel zlib-devel which texi2html gnutls-devel cyrus-sasl-devel
 BuildRequires: libaio-devel
@@ -322,8 +329,12 @@ such as kvm_stat.
 %patch26 -p1
 %patch27 -p1
 %patch28 -p1
+%patch29 -p1
+%patch30 -p1
+%patch31 -p1
 
 %patch100 -p1
+%patch101 -p1
 
 %build
 # By default we build everything, but allow x86 to build a minimal version
@@ -704,6 +715,13 @@ fi
 %{_mandir}/man1/qemu-img.1*
 
 %changelog
+* Mon Jan 30 2012 Justin M. Forbes <jforbes at redhat.com> - 2:0.15.1-4
+- Add vhost-net to kvm.modules
+- Fix USB passthrough assert on packet completion (#769625)
+- 
+* Thu Jan  5 2012 Christophe Fergeau <cfergeau at redhat.com> - 2:0.15.1-3.1
+- Backport patches from qemu 1.0 to fix floppy drives (#753863)
+
 * Fri Nov 18 2011 Justin M. Forbes <jforbes at redhat.com> - 2:0.15.1-3
 - Enable support for fedora-13 machine type (#748218)
 - don't force ksm enable on updates (#754946)


More information about the scm-commits mailing list