vl, pc: turn -no-fd-bootchk into a machine property

Add a fd-bootchk property to PC machine types, so that -no-fd-bootchk
returns an error if the machine does not support booting from floppies
and checking for boot signatures therein.

Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-02-13 10:56:56 +01:00
parent 158a054c4d
commit 84e945aad2
5 changed files with 37 additions and 9 deletions

View File

@ -399,8 +399,8 @@ static int boot_device2nibble(char boot_device)
return 0; return 0;
} }
static void set_boot_dev(MC146818RtcState *s, const char *boot_device, static void set_boot_dev(PCMachineState *pcms, MC146818RtcState *s,
Error **errp) const char *boot_device, Error **errp)
{ {
#define PC_MAX_BOOT_DEVICES 3 #define PC_MAX_BOOT_DEVICES 3
int nbds, bds[3] = { 0, }; int nbds, bds[3] = { 0, };
@ -420,12 +420,14 @@ static void set_boot_dev(MC146818RtcState *s, const char *boot_device,
} }
} }
mc146818rtc_set_cmos_data(s, 0x3d, (bds[1] << 4) | bds[0]); mc146818rtc_set_cmos_data(s, 0x3d, (bds[1] << 4) | bds[0]);
mc146818rtc_set_cmos_data(s, 0x38, (bds[2] << 4) | (fd_bootchk ? 0x0 : 0x1)); mc146818rtc_set_cmos_data(s, 0x38, (bds[2] << 4) | !pcms->fd_bootchk);
} }
static void pc_boot_set(void *opaque, const char *boot_device, Error **errp) static void pc_boot_set(void *opaque, const char *boot_device, Error **errp)
{ {
set_boot_dev(opaque, boot_device, errp); PCMachineState *pcms = PC_MACHINE(current_machine);
set_boot_dev(pcms, opaque, boot_device, errp);
} }
static void pc_cmos_init_floppy(MC146818RtcState *rtc_state, ISADevice *floppy) static void pc_cmos_init_floppy(MC146818RtcState *rtc_state, ISADevice *floppy)
@ -611,7 +613,15 @@ void pc_cmos_init(PCMachineState *pcms,
mc146818rtc_set_cmos_data(s, 0x5c, val >> 8); mc146818rtc_set_cmos_data(s, 0x5c, val >> 8);
mc146818rtc_set_cmos_data(s, 0x5d, val >> 16); mc146818rtc_set_cmos_data(s, 0x5d, val >> 16);
set_boot_dev(s, MACHINE(pcms)->boot_config.order, &error_fatal); object_property_add_link(OBJECT(pcms), "rtc_state",
TYPE_ISA_DEVICE,
(Object **)&x86ms->rtc,
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
object_property_set_link(OBJECT(pcms), "rtc_state", OBJECT(s),
&error_abort);
set_boot_dev(pcms, s, MACHINE(pcms)->boot_config.order, &error_fatal);
val = 0; val = 0;
val |= 0x02; /* FPU is there */ val |= 0x02; /* FPU is there */
@ -1535,6 +1545,20 @@ static void pc_machine_set_vmport(Object *obj, Visitor *v, const char *name,
visit_type_OnOffAuto(v, name, &pcms->vmport, errp); visit_type_OnOffAuto(v, name, &pcms->vmport, errp);
} }
static bool pc_machine_get_fd_bootchk(Object *obj, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
return pcms->fd_bootchk;
}
static void pc_machine_set_fd_bootchk(Object *obj, bool value, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
pcms->fd_bootchk = value;
}
static bool pc_machine_get_smbus(Object *obj, Error **errp) static bool pc_machine_get_smbus(Object *obj, Error **errp)
{ {
PCMachineState *pcms = PC_MACHINE(obj); PCMachineState *pcms = PC_MACHINE(obj);
@ -1723,6 +1747,7 @@ static void pc_machine_initfn(Object *obj)
#ifdef CONFIG_HPET #ifdef CONFIG_HPET
pcms->hpet_enabled = true; pcms->hpet_enabled = true;
#endif #endif
pcms->fd_bootchk = true;
pcms->default_bus_bypass_iommu = false; pcms->default_bus_bypass_iommu = false;
pcms->pcspk = isa_new(TYPE_PC_SPEAKER); pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
@ -1869,6 +1894,10 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
NULL, NULL); NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP, object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP,
"SMBIOS Entry Point type [32, 64]"); "SMBIOS Entry Point type [32, 64]");
object_class_property_add_bool(oc, "fd-bootchk",
pc_machine_get_fd_bootchk,
pc_machine_set_fd_bootchk);
} }
static const TypeInfo pc_machine_info = { static const TypeInfo pc_machine_info = {

View File

@ -50,6 +50,7 @@ typedef struct PCMachineState {
bool hpet_enabled; bool hpet_enabled;
bool i8042_enabled; bool i8042_enabled;
bool default_bus_bypass_iommu; bool default_bus_bypass_iommu;
bool fd_bootchk;
uint64_t max_fw_size; uint64_t max_fw_size;
/* ACPI Memory hotplug IO base address */ /* ACPI Memory hotplug IO base address */
@ -146,7 +147,6 @@ OBJECT_DECLARE_TYPE(PCMachineState, PCMachineClass, PC_MACHINE)
GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled); GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled);
/* pc.c */ /* pc.c */
extern int fd_bootchk;
void pc_acpi_smi_interrupt(void *opaque, int irq, int level); void pc_acpi_smi_interrupt(void *opaque, int irq, int level);

View File

@ -2650,7 +2650,7 @@ DEF("no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk,
SRST SRST
``-no-fd-bootchk`` ``-no-fd-bootchk``
Disable boot signature checking for floppy disks in BIOS. May be Disable boot signature checking for floppy disks in BIOS. May be
needed to boot from old floppy disks. needed to boot from old floppy disks. Synonym of ``-m fd-bootchk=off``.
ERST ERST
DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable, DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable,

View File

@ -41,7 +41,6 @@ int vga_interface_type = VGA_NONE;
bool vga_interface_created; bool vga_interface_created;
Chardev *parallel_hds[MAX_PARALLEL_PORTS]; Chardev *parallel_hds[MAX_PARALLEL_PORTS];
int win2k_install_hack; int win2k_install_hack;
int fd_bootchk = 1;
int graphic_rotate; int graphic_rotate;
QEMUOptionRom option_rom[MAX_OPTION_ROMS]; QEMUOptionRom option_rom[MAX_OPTION_ROMS];
int nb_option_roms; int nb_option_roms;

View File

@ -2927,7 +2927,7 @@ void qemu_init(int argc, char **argv)
optarg, FD_OPTS); optarg, FD_OPTS);
break; break;
case QEMU_OPTION_no_fd_bootchk: case QEMU_OPTION_no_fd_bootchk:
fd_bootchk = 0; qdict_put_str(machine_opts_dict, "fd-bootchk", "off");
break; break;
case QEMU_OPTION_netdev: case QEMU_OPTION_netdev:
default_net = 0; default_net = 0;