Allows to enable/disable the floppy controller. Default depends on MachineClass->no_floppy. It's ON for now, but we can flip the default for 6.2+ machine types.
NOTE: This requires -nodefaults or no_floppy=1 to actually have an effect. Otherwise the default floppy drive created by qemu will auto-enable the floppy controller. Not sure how to deal with that best. IMHO we should simply stop creating a default floppy, unfortunaly that will break live migration. Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- include/hw/i386/pc.h | 2 ++ hw/i386/pc.c | 23 +++++++++++++++++++++++ hw/i386/pc_piix.c | 8 +++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 88dffe751724..b418ead6c260 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -38,6 +38,7 @@ typedef struct PCMachineState { /* Configuration options: */ uint64_t max_ram_below_4g; OnOffAuto vmport; + OnOffAuto floppy; bool acpi_build_enabled; bool smbus_enabled; @@ -59,6 +60,7 @@ typedef struct PCMachineState { #define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g" #define PC_MACHINE_DEVMEM_REGION_SIZE "device-memory-region-size" #define PC_MACHINE_VMPORT "vmport" +#define PC_MACHINE_FLOPPY "floppy" #define PC_MACHINE_SMBUS "smbus" #define PC_MACHINE_SATA "sata" #define PC_MACHINE_PIT "pit" diff --git a/hw/i386/pc.c b/hw/i386/pc.c index c2b9d62a358f..832ea9cc8ef8 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1468,6 +1468,23 @@ static void pc_machine_set_vmport(Object *obj, Visitor *v, const char *name, visit_type_OnOffAuto(v, name, &pcms->vmport, errp); } +static void pc_machine_get_floppy(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + OnOffAuto floppy = pcms->floppy; + + visit_type_OnOffAuto(v, name, &floppy, errp); +} + +static void pc_machine_set_floppy(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + visit_type_OnOffAuto(v, name, &pcms->floppy, errp); +} + static bool pc_machine_get_smbus(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); @@ -1751,6 +1768,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) object_class_property_set_description(oc, PC_MACHINE_VMPORT, "Enable vmport (pc & q35)"); + object_class_property_add(oc, PC_MACHINE_FLOPPY, "OnOffAuto", + pc_machine_get_floppy, pc_machine_set_floppy, + NULL, NULL); + object_class_property_set_description(oc, PC_MACHINE_FLOPPY, + "Enable floppy (pc only)"); + object_class_property_add_bool(oc, PC_MACHINE_SMBUS, pc_machine_get_smbus, pc_machine_set_smbus); diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 30b8bd6ea92d..7f81729e42cd 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -235,8 +235,14 @@ static void pc_init1(MachineState *machine, pcms->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON; } + if (pcms->floppy == ON_OFF_AUTO_AUTO) { + pcms->floppy = MACHINE_CLASS(pcmc)->no_floppy + ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON; + } + /* init basic PC hardware */ - pc_basic_device_init(pcms, isa_bus, x86ms->gsi, &rtc_state, true, + pc_basic_device_init(pcms, isa_bus, x86ms->gsi, &rtc_state, + pcms->floppy == ON_OFF_AUTO_ON, 0x4); pc_nic_init(pcmc, isa_bus, pci_bus); -- 2.31.1