On 10/20/2016 03:55 AM, Kevin Wolf wrote:
We have been complaining for a long time about how the floppy controller and
floppy drives are combined in a single qdev device and how this makes the
device awkward to work with because it behaves different from all other block
devices.
The latest reason to complain was when I noticed that using qdev device names
in QMP commands (e.g. for media change) doesn't really work when only the
controller is a qdev device, but the drives aren't.
So I decided to have a go at it, and this is the result.
It doesn't actually change any of the inner workings of the floppy controller,
but it wires things up differently on the qdev layer so that a floppy
controller now exposes a bus on which the floppy drives sit. This results in a
structure that is similar to IDE where the actual drive state is still in the
controller and the qdev device basically just contains the qdev properties -
not pretty, but quite workable.
The commit message of patch 3 explains how to use it. In short, there is a
'-device floppy' now and it does what you would expect if you ever used ide-cd.
The other problem is old command lines, especially those using things like
'-global isa-fdc,driveA=...'. In order to keep them working, we need to forward
the property to an internally created floppy drive device. This is a bit like
usb-storage, which we know is ugly, but works well enough in practice. The good
news here is that in contrast to usb-storage, the floppy controller only does
the forwarding for legacy configurations; as soon as you start using '-device
floppy', it doesn't happen any more.
So as you may have expected, this conversion doesn't result in a perfect
device, but I think it's definitely an improvement over the old state. I hope
you like it despite the warts. :-)
v4:
- John says that his grep is broken and hangs at 100% CPU with my attempt to
extract the floppy controller from info qtree. Use a simpler sed command
instead (which, unlike the grep command, doesn't handle arbitrary indentation
level of the next item, but we know what comes next, so just hardcoding 10
spaces works, too).
v3:
- Fixed omissons in the conversion sysbus-fdc and the Sun one. Nice, combining
floppy controllers and weird platforms in a single series. [John]
v2:
- Added patch 4 (qemu-iotests case for floppy config on the command line)
- Patch 2: Create a floppy device only if a BlockBackend exists instead of
always creating two of them
- Patch 2: Initialise drive->fdctrl even if no drive is attached, it is
accessed anyway during migration
- Patch 3: Keep 'type' qdev property and FDrive->drive in sync
- Patch 3: Removed if with condition that is always true
Kevin Wolf (4):
fdc: Add a floppy qbus
fdc: Add a floppy drive qdev
fdc: Move qdev properties to FloppyDrive
qemu-iotests: Test creating floppy drives
hw/block/fdc.c | 271 ++++++++--
tests/qemu-iotests/172 | 242 +++++++++
tests/qemu-iotests/172.out | 1170 ++++++++++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/group | 1 +
vl.c | 1 +
5 files changed, 1637 insertions(+), 48 deletions(-)
create mode 100755 tests/qemu-iotests/172
create mode 100644 tests/qemu-iotests/172.out
You're going to kill me, but...
the qemu-name scrubbing isn't working quite right:
-qemu: -device floppy,drive=none0,physical_block_size=1024: Physical and
logical block size must be 512 for floppy
-qemu: -device floppy,drive=none0,physical_block_size=1024: Device
initialization failed.
+qemu-system-x86_64: -device
floppy,drive=none0,physical_block_size=1024: Physical and logical block
size must be 512 for floppy
+qemu-system-x86_64: -device
floppy,drive=none0,physical_block_size=1024: Device initialization failed.
I'm building from e.g. ~/src/qemu/bin/git and doing ../../configure
--etc; and then running tests from ~/s/q/b/g/tests/qemu-iotests.
and to Konrad's point, is it okay to have both a "Floppy" device and a
"floppy" device? One is a bus and the other is not, but maybe "floppy"
and "floppy-drive" or "floppy-device" or something less accidentally
ambiguous.
As to the proper casing of these objects... IDE as you've stated uses
"IDE" for the bus and "ide-device" for the abstract device, "ide-drive,"
"ide-hd" and "ide-cd" for instances, "pci-ide" and "ich9-ahci" for the
HBAs.
Lowercase is probably okay for both the bus and the device -- looks like
very few type names have caps. (German grammar be damned.)
Happy Friday? :(