Support default block interfaces per QEMUMachine
There are QEMUMachines that have neither IF_IDE nor IF_SCSI as a default/standard interface to their block devices / drives. Therefore, this patch introduces a new field default_block_type per QEMUMachine struct. The prior use_scsi field becomes thereby obsolete and is replaced through .default_block_type = IF_SCSI. This patch also changes the default for s390x to IF_VIRTIO and removes an early hack that converts IF_IDE drives. Other parties have already claimed interest (e.g. IF_SD for exynos) To create a sane default, for machines that dont specify a default_block_type, this patch makes IF_IDE = 0 and IF_NONE = 1. I checked all users of IF_NONE (blockdev.c and ww/device-hotplug.c) as well as IF_IDE and it seems that it is ok to change the defines - in other words, I found no obvious (to me) assumption in the code regarding IF_NONE==0. IF_NONE is only set if there is an explicit if=none. Without if=* the interface becomes IF_DEFAULT. I would suggest to have some additional care, e.g. by letting this patch sit some days in the block tree. Based on an initial patch from Einar Lueck <elelueck@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> CC: Igor Mitsyanko <i.mitsyanko@samsung.com> CC: Markus Armbruster <armbru@redhat.com> CC: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Alexander Graf <agraf@suse.de> Acked-by: Igor Mitsyanko <i.mitsyanko@samsung.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									c208e8c2d8
								
							
						
					
					
						commit
						2d0d2837dc
					
				| 
						 | 
					@ -275,7 +275,7 @@ static bool do_check_io_limits(BlockIOLimit *io_limits)
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
 | 
					DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char *buf;
 | 
					    const char *buf;
 | 
				
			||||||
    const char *file = NULL;
 | 
					    const char *file = NULL;
 | 
				
			||||||
| 
						 | 
					@ -325,7 +325,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
 | 
				
			||||||
            return NULL;
 | 
					            return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        type = default_to_scsi ? IF_SCSI : IF_IDE;
 | 
					        type = block_default_type;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    max_devs = if_max_devs[type];
 | 
					    max_devs = if_max_devs[type];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,8 +19,13 @@ void blockdev_auto_del(BlockDriverState *bs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    IF_DEFAULT = -1,            /* for use with drive_add() only */
 | 
					    IF_DEFAULT = -1,            /* for use with drive_add() only */
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * IF_IDE must be zero, because we want QEMUMachine member
 | 
				
			||||||
 | 
					     * block_default_type to default-initialize to IF_IDE
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    IF_IDE = 0,
 | 
				
			||||||
    IF_NONE,
 | 
					    IF_NONE,
 | 
				
			||||||
    IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
 | 
					    IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
 | 
				
			||||||
    IF_COUNT
 | 
					    IF_COUNT
 | 
				
			||||||
} BlockInterfaceType;
 | 
					} BlockInterfaceType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +56,7 @@ DriveInfo *drive_get_by_blockdev(BlockDriverState *bs);
 | 
				
			||||||
QemuOpts *drive_def(const char *optstr);
 | 
					QemuOpts *drive_def(const char *optstr);
 | 
				
			||||||
QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
 | 
					QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
 | 
				
			||||||
                    const char *optstr);
 | 
					                    const char *optstr);
 | 
				
			||||||
DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi);
 | 
					DriveInfo *drive_init(QemuOpts *arg, BlockInterfaceType block_default_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* device-hotplug */
 | 
					/* device-hotplug */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
#ifndef HW_BOARDS_H
 | 
					#ifndef HW_BOARDS_H
 | 
				
			||||||
#define HW_BOARDS_H
 | 
					#define HW_BOARDS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "blockdev.h"
 | 
				
			||||||
#include "qdev.h"
 | 
					#include "qdev.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct QEMUMachineInitArgs {
 | 
					typedef struct QEMUMachineInitArgs {
 | 
				
			||||||
| 
						 | 
					@ -24,7 +25,7 @@ typedef struct QEMUMachine {
 | 
				
			||||||
    const char *desc;
 | 
					    const char *desc;
 | 
				
			||||||
    QEMUMachineInitFunc *init;
 | 
					    QEMUMachineInitFunc *init;
 | 
				
			||||||
    QEMUMachineResetFunc *reset;
 | 
					    QEMUMachineResetFunc *reset;
 | 
				
			||||||
    int use_scsi;
 | 
					    BlockInterfaceType block_default_type;
 | 
				
			||||||
    int max_cpus;
 | 
					    int max_cpus;
 | 
				
			||||||
    unsigned int no_serial:1,
 | 
					    unsigned int no_serial:1,
 | 
				
			||||||
        no_parallel:1,
 | 
					        no_parallel:1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ DriveInfo *add_init_drive(const char *optstr)
 | 
				
			||||||
    if (!opts)
 | 
					    if (!opts)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dinfo = drive_init(opts, current_machine->use_scsi);
 | 
					    dinfo = drive_init(opts, current_machine->block_default_type);
 | 
				
			||||||
    if (!dinfo) {
 | 
					    if (!dinfo) {
 | 
				
			||||||
        qemu_opts_del(opts);
 | 
					        qemu_opts_del(opts);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -326,7 +326,7 @@ static QEMUMachine highbank_machine = {
 | 
				
			||||||
    .name = "highbank",
 | 
					    .name = "highbank",
 | 
				
			||||||
    .desc = "Calxeda Highbank (ECX-1000)",
 | 
					    .desc = "Calxeda Highbank (ECX-1000)",
 | 
				
			||||||
    .init = highbank_init,
 | 
					    .init = highbank_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,6 @@ static QEMUMachine leon3_generic_machine = {
 | 
				
			||||||
    .name     = "leon3_generic",
 | 
					    .name     = "leon3_generic",
 | 
				
			||||||
    .desc     = "Leon-3 generic",
 | 
					    .desc     = "Leon-3 generic",
 | 
				
			||||||
    .init     = leon3_generic_hw_init,
 | 
					    .init     = leon3_generic_hw_init,
 | 
				
			||||||
    .use_scsi = 0,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void leon3_machine_init(void)
 | 
					static void leon3_machine_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -324,14 +324,14 @@ static QEMUMachine mips_magnum_machine = {
 | 
				
			||||||
    .name = "magnum",
 | 
					    .name = "magnum",
 | 
				
			||||||
    .desc = "MIPS Magnum",
 | 
					    .desc = "MIPS Magnum",
 | 
				
			||||||
    .init = mips_magnum_init,
 | 
					    .init = mips_magnum_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine mips_pica61_machine = {
 | 
					static QEMUMachine mips_pica61_machine = {
 | 
				
			||||||
    .name = "pica61",
 | 
					    .name = "pica61",
 | 
				
			||||||
    .desc = "Acer Pica 61",
 | 
					    .desc = "Acer Pica 61",
 | 
				
			||||||
    .init = mips_pica61_init,
 | 
					    .init = mips_pica61_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mips_jazz_machine_init(void)
 | 
					static void mips_jazz_machine_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ static void pc_fw_add_pflash_drv(void)
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!drive_init(opts, machine->use_scsi)) {
 | 
					    if (!drive_init(opts, machine->block_default_type)) {
 | 
				
			||||||
        qemu_opts_del(opts);
 | 
					        qemu_opts_del(opts);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,7 +122,6 @@ static QEMUMachine puv3_machine = {
 | 
				
			||||||
    .desc = "PKUnity Version-3 based on UniCore32",
 | 
					    .desc = "PKUnity Version-3 based on UniCore32",
 | 
				
			||||||
    .init = puv3_init,
 | 
					    .init = puv3_init,
 | 
				
			||||||
    .is_default = 1,
 | 
					    .is_default = 1,
 | 
				
			||||||
    .use_scsi = 0,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void puv3_machine_init(void)
 | 
					static void puv3_machine_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,14 +364,14 @@ static QEMUMachine realview_eb_machine = {
 | 
				
			||||||
    .name = "realview-eb",
 | 
					    .name = "realview-eb",
 | 
				
			||||||
    .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
 | 
					    .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
 | 
				
			||||||
    .init = realview_eb_init,
 | 
					    .init = realview_eb_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine realview_eb_mpcore_machine = {
 | 
					static QEMUMachine realview_eb_mpcore_machine = {
 | 
				
			||||||
    .name = "realview-eb-mpcore",
 | 
					    .name = "realview-eb-mpcore",
 | 
				
			||||||
    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
 | 
					    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
 | 
				
			||||||
    .init = realview_eb_mpcore_init,
 | 
					    .init = realview_eb_mpcore_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -385,7 +385,7 @@ static QEMUMachine realview_pbx_a9_machine = {
 | 
				
			||||||
    .name = "realview-pbx-a9",
 | 
					    .name = "realview-pbx-a9",
 | 
				
			||||||
    .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
 | 
					    .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
 | 
				
			||||||
    .init = realview_pbx_a9_init,
 | 
					    .init = realview_pbx_a9_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,21 +314,6 @@ static void s390_init(QEMUMachineInitArgs *args)
 | 
				
			||||||
        qdev_set_nic_properties(dev, nd);
 | 
					        qdev_set_nic_properties(dev, nd);
 | 
				
			||||||
        qdev_init_nofail(dev);
 | 
					        qdev_init_nofail(dev);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Create VirtIO disk drives */
 | 
					 | 
				
			||||||
    for(i = 0; i < MAX_BLK_DEVS; i++) {
 | 
					 | 
				
			||||||
        DriveInfo *dinfo;
 | 
					 | 
				
			||||||
        DeviceState *dev;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        dinfo = drive_get(IF_IDE, 0, i);
 | 
					 | 
				
			||||||
        if (!dinfo) {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        dev = qdev_create((BusState *)s390_bus, "virtio-blk-s390");
 | 
					 | 
				
			||||||
        qdev_prop_set_drive_nofail(dev, "drive", dinfo->bdrv);
 | 
					 | 
				
			||||||
        qdev_init_nofail(dev);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine s390_machine = {
 | 
					static QEMUMachine s390_machine = {
 | 
				
			||||||
| 
						 | 
					@ -336,6 +321,7 @@ static QEMUMachine s390_machine = {
 | 
				
			||||||
    .alias = "s390",
 | 
					    .alias = "s390",
 | 
				
			||||||
    .desc = "VirtIO based S390 machine",
 | 
					    .desc = "VirtIO based S390 machine",
 | 
				
			||||||
    .init = s390_init,
 | 
					    .init = s390_init,
 | 
				
			||||||
 | 
					    .block_default_type = IF_VIRTIO,
 | 
				
			||||||
    .no_cdrom = 1,
 | 
					    .no_cdrom = 1,
 | 
				
			||||||
    .no_floppy = 1,
 | 
					    .no_floppy = 1,
 | 
				
			||||||
    .no_serial = 1,
 | 
					    .no_serial = 1,
 | 
				
			||||||
| 
						 | 
					@ -352,3 +338,4 @@ static void s390_machine_init(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
machine_init(s390_machine_init);
 | 
					machine_init(s390_machine_init);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -924,9 +924,9 @@ static QEMUMachine spapr_machine = {
 | 
				
			||||||
    .desc = "pSeries Logical Partition (PAPR compliant)",
 | 
					    .desc = "pSeries Logical Partition (PAPR compliant)",
 | 
				
			||||||
    .init = ppc_spapr_init,
 | 
					    .init = ppc_spapr_init,
 | 
				
			||||||
    .reset = ppc_spapr_reset,
 | 
					    .reset = ppc_spapr_reset,
 | 
				
			||||||
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = MAX_CPUS,
 | 
					    .max_cpus = MAX_CPUS,
 | 
				
			||||||
    .no_parallel = 1,
 | 
					    .no_parallel = 1,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void spapr_machine_init(void)
 | 
					static void spapr_machine_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								hw/sun4m.c
								
								
								
								
							
							
						
						
									
										24
									
								
								hw/sun4m.c
								
								
								
								
							| 
						 | 
					@ -1426,7 +1426,7 @@ static QEMUMachine ss5_machine = {
 | 
				
			||||||
    .name = "SS-5",
 | 
					    .name = "SS-5",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation 5",
 | 
					    .desc = "Sun4m platform, SPARCstation 5",
 | 
				
			||||||
    .init = ss5_init,
 | 
					    .init = ss5_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .is_default = 1,
 | 
					    .is_default = 1,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1434,7 +1434,7 @@ static QEMUMachine ss10_machine = {
 | 
				
			||||||
    .name = "SS-10",
 | 
					    .name = "SS-10",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation 10",
 | 
					    .desc = "Sun4m platform, SPARCstation 10",
 | 
				
			||||||
    .init = ss10_init,
 | 
					    .init = ss10_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1442,7 +1442,7 @@ static QEMUMachine ss600mp_machine = {
 | 
				
			||||||
    .name = "SS-600MP",
 | 
					    .name = "SS-600MP",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCserver 600MP",
 | 
					    .desc = "Sun4m platform, SPARCserver 600MP",
 | 
				
			||||||
    .init = ss600mp_init,
 | 
					    .init = ss600mp_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1450,7 +1450,7 @@ static QEMUMachine ss20_machine = {
 | 
				
			||||||
    .name = "SS-20",
 | 
					    .name = "SS-20",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation 20",
 | 
					    .desc = "Sun4m platform, SPARCstation 20",
 | 
				
			||||||
    .init = ss20_init,
 | 
					    .init = ss20_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1458,35 +1458,35 @@ static QEMUMachine voyager_machine = {
 | 
				
			||||||
    .name = "Voyager",
 | 
					    .name = "Voyager",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation Voyager",
 | 
					    .desc = "Sun4m platform, SPARCstation Voyager",
 | 
				
			||||||
    .init = vger_init,
 | 
					    .init = vger_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine ss_lx_machine = {
 | 
					static QEMUMachine ss_lx_machine = {
 | 
				
			||||||
    .name = "LX",
 | 
					    .name = "LX",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation LX",
 | 
					    .desc = "Sun4m platform, SPARCstation LX",
 | 
				
			||||||
    .init = ss_lx_init,
 | 
					    .init = ss_lx_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine ss4_machine = {
 | 
					static QEMUMachine ss4_machine = {
 | 
				
			||||||
    .name = "SS-4",
 | 
					    .name = "SS-4",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCstation 4",
 | 
					    .desc = "Sun4m platform, SPARCstation 4",
 | 
				
			||||||
    .init = ss4_init,
 | 
					    .init = ss4_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine scls_machine = {
 | 
					static QEMUMachine scls_machine = {
 | 
				
			||||||
    .name = "SPARCClassic",
 | 
					    .name = "SPARCClassic",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCClassic",
 | 
					    .desc = "Sun4m platform, SPARCClassic",
 | 
				
			||||||
    .init = scls_init,
 | 
					    .init = scls_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine sbook_machine = {
 | 
					static QEMUMachine sbook_machine = {
 | 
				
			||||||
    .name = "SPARCbook",
 | 
					    .name = "SPARCbook",
 | 
				
			||||||
    .desc = "Sun4m platform, SPARCbook",
 | 
					    .desc = "Sun4m platform, SPARCbook",
 | 
				
			||||||
    .init = sbook_init,
 | 
					    .init = sbook_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct sun4d_hwdef sun4d_hwdefs[] = {
 | 
					static const struct sun4d_hwdef sun4d_hwdefs[] = {
 | 
				
			||||||
| 
						 | 
					@ -1709,7 +1709,7 @@ static QEMUMachine ss1000_machine = {
 | 
				
			||||||
    .name = "SS-1000",
 | 
					    .name = "SS-1000",
 | 
				
			||||||
    .desc = "Sun4d platform, SPARCserver 1000",
 | 
					    .desc = "Sun4d platform, SPARCserver 1000",
 | 
				
			||||||
    .init = ss1000_init,
 | 
					    .init = ss1000_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 8,
 | 
					    .max_cpus = 8,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1717,7 +1717,7 @@ static QEMUMachine ss2000_machine = {
 | 
				
			||||||
    .name = "SS-2000",
 | 
					    .name = "SS-2000",
 | 
				
			||||||
    .desc = "Sun4d platform, SPARCcenter 2000",
 | 
					    .desc = "Sun4d platform, SPARCcenter 2000",
 | 
				
			||||||
    .init = ss2000_init,
 | 
					    .init = ss2000_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 20,
 | 
					    .max_cpus = 20,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1896,7 +1896,7 @@ static QEMUMachine ss2_machine = {
 | 
				
			||||||
    .name = "SS-2",
 | 
					    .name = "SS-2",
 | 
				
			||||||
    .desc = "Sun4c platform, SPARCstation 2",
 | 
					    .desc = "Sun4c platform, SPARCstation 2",
 | 
				
			||||||
    .init = ss2_init,
 | 
					    .init = ss2_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sun4m_register_types(void)
 | 
					static void sun4m_register_types(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -358,14 +358,14 @@ static QEMUMachine versatilepb_machine = {
 | 
				
			||||||
    .name = "versatilepb",
 | 
					    .name = "versatilepb",
 | 
				
			||||||
    .desc = "ARM Versatile/PB (ARM926EJ-S)",
 | 
					    .desc = "ARM Versatile/PB (ARM926EJ-S)",
 | 
				
			||||||
    .init = vpb_init,
 | 
					    .init = vpb_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QEMUMachine versatileab_machine = {
 | 
					static QEMUMachine versatileab_machine = {
 | 
				
			||||||
    .name = "versatileab",
 | 
					    .name = "versatileab",
 | 
				
			||||||
    .desc = "ARM Versatile/AB (ARM926EJ-S)",
 | 
					    .desc = "ARM Versatile/AB (ARM926EJ-S)",
 | 
				
			||||||
    .init = vab_init,
 | 
					    .init = vab_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void versatile_machine_init(void)
 | 
					static void versatile_machine_init(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -477,7 +477,7 @@ static QEMUMachine vexpress_a9_machine = {
 | 
				
			||||||
    .name = "vexpress-a9",
 | 
					    .name = "vexpress-a9",
 | 
				
			||||||
    .desc = "ARM Versatile Express for Cortex-A9",
 | 
					    .desc = "ARM Versatile Express for Cortex-A9",
 | 
				
			||||||
    .init = vexpress_a9_init,
 | 
					    .init = vexpress_a9_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -485,7 +485,7 @@ static QEMUMachine vexpress_a15_machine = {
 | 
				
			||||||
    .name = "vexpress-a15",
 | 
					    .name = "vexpress-a15",
 | 
				
			||||||
    .desc = "ARM Versatile Express for Cortex-A15",
 | 
					    .desc = "ARM Versatile Express for Cortex-A15",
 | 
				
			||||||
    .init = vexpress_a15_init,
 | 
					    .init = vexpress_a15_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 4,
 | 
					    .max_cpus = 4,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,7 @@ static QEMUMachine zynq_machine = {
 | 
				
			||||||
    .name = "xilinx-zynq-a9",
 | 
					    .name = "xilinx-zynq-a9",
 | 
				
			||||||
    .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
 | 
					    .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
 | 
				
			||||||
    .init = zynq_init,
 | 
					    .init = zynq_init,
 | 
				
			||||||
    .use_scsi = 1,
 | 
					    .block_default_type = IF_SCSI,
 | 
				
			||||||
    .max_cpus = 1,
 | 
					    .max_cpus = 1,
 | 
				
			||||||
    .no_sdcard = 1
 | 
					    .no_sdcard = 1
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								vl.c
								
								
								
								
							
							
						
						
									
										21
									
								
								vl.c
								
								
								
								
							| 
						 | 
					@ -886,9 +886,9 @@ static int cleanup_add_fd(QemuOpts *opts, void *opaque)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int drive_init_func(QemuOpts *opts, void *opaque)
 | 
					static int drive_init_func(QemuOpts *opts, void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int *use_scsi = opaque;
 | 
					    BlockInterfaceType *block_default_type = opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return drive_init(opts, *use_scsi) == NULL;
 | 
					    return drive_init(opts, *block_default_type) == NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
 | 
					static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
 | 
				
			||||||
| 
						 | 
					@ -899,14 +899,15 @@ static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void default_drive(int enable, int snapshot, int use_scsi,
 | 
					static void default_drive(int enable, int snapshot,
 | 
				
			||||||
 | 
					                          BlockInterfaceType block_default_type,
 | 
				
			||||||
                          BlockInterfaceType type, int index,
 | 
					                          BlockInterfaceType type, int index,
 | 
				
			||||||
                          const char *optstr)
 | 
					                          const char *optstr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QemuOpts *opts;
 | 
					    QemuOpts *opts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type == IF_DEFAULT) {
 | 
					    if (type == IF_DEFAULT) {
 | 
				
			||||||
        type = use_scsi ? IF_SCSI : IF_IDE;
 | 
					        type = block_default_type;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!enable || drive_get_by_index(type, index)) {
 | 
					    if (!enable || drive_get_by_index(type, index)) {
 | 
				
			||||||
| 
						 | 
					@ -917,7 +918,7 @@ static void default_drive(int enable, int snapshot, int use_scsi,
 | 
				
			||||||
    if (snapshot) {
 | 
					    if (snapshot) {
 | 
				
			||||||
        drive_enable_snapshot(opts, NULL);
 | 
					        drive_enable_snapshot(opts, NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!drive_init(opts, use_scsi)) {
 | 
					    if (!drive_init(opts, type)) {
 | 
				
			||||||
        exit(1);
 | 
					        exit(1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3770,14 +3771,16 @@ int main(int argc, char **argv, char **envp)
 | 
				
			||||||
    /* open the virtual block devices */
 | 
					    /* open the virtual block devices */
 | 
				
			||||||
    if (snapshot)
 | 
					    if (snapshot)
 | 
				
			||||||
        qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0);
 | 
					        qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0);
 | 
				
			||||||
    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, &machine->use_scsi, 1) != 0)
 | 
					    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
 | 
				
			||||||
 | 
					                          &machine->block_default_type, 1) != 0) {
 | 
				
			||||||
        exit(1);
 | 
					        exit(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default_drive(default_cdrom, snapshot, machine->use_scsi,
 | 
					    default_drive(default_cdrom, snapshot, machine->block_default_type,
 | 
				
			||||||
                  IF_DEFAULT, 2, CDROM_OPTS);
 | 
					                  IF_DEFAULT, 2, CDROM_OPTS);
 | 
				
			||||||
    default_drive(default_floppy, snapshot, machine->use_scsi,
 | 
					    default_drive(default_floppy, snapshot, machine->block_default_type,
 | 
				
			||||||
                  IF_FLOPPY, 0, FD_OPTS);
 | 
					                  IF_FLOPPY, 0, FD_OPTS);
 | 
				
			||||||
    default_drive(default_sdcard, snapshot, machine->use_scsi,
 | 
					    default_drive(default_sdcard, snapshot, machine->block_default_type,
 | 
				
			||||||
                  IF_SD, 0, SD_OPTS);
 | 
					                  IF_SD, 0, SD_OPTS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL);
 | 
					    register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue