Add -disk interface
PATCH 3/7 Add floppy support by -disk
In reply to Laurent VivierThis patch allows to define floppy using the "-disk" syntax. It adds an interface type "floppy".
"-fda file" is an alias for "-disk file,index=0,if=floppy" "-fdb file" is an alias for "-disk file,index=1,if=floppy"
--
vl.c | 86 +++++++++++++++++++++++++++++++++++-------------------------------- vl.h | 2 - 2 files changed, 46 insertions(+), 42 deletions(-)
vl.c +45 -41
@@ -4711,6 +4711,7 @@ } } +#define FD_ALIAS ",index=%d,if=floppy"#define HD_ALIAS ",index=%d,media=disk"#ifdef TARGET_PPC
@@ -4722,7 +4723,7 @@static int disk_init (const char *str,int snapshot,QEMUMachine *machine) {char buf[16 ]; -enum {IF_IDE ,IF_SCSI } interface; +enum {IF_IDE ,IF_SCSI ,IF_FLOPPY } interface;enum {MEDIA_DISK ,MEDIA_CDROM } media;int bus_id, unit_id;int cyls, heads, secs, translation;
@@ -4811,6 +4812,8 @@ interface =IF_IDE ; else if (!strcmp(buf, "scsi")) interface =IF_SCSI ; + else if (!strcmp(buf, "floppy")) + interface =IF_FLOPPY ; else {fprintf (stderr,"unsupported bus type '%s'\n" , buf);return -1 ;
@@ -4966,6 +4969,30 @@ } }break ; +case IF_FLOPPY : +if (disk_index ==-1 ) { + disk_index =0 ; +while (fd_table[disk_index] && disk_index <MAX_FD ) + disk_index++; + } +if (disk_index >=MAX_FD ) { +fprintf (stderr,"qemu: too many floppy\n" ); +return -1 ; + } + +if (!fd_table[disk_index]) { +snprintf (buf,sizeof (buf),"fd%c" , disk_index +'a' ); + fd_table[disk_index] =bdrv_new (buf); +bdrv_set_type_hint (fd_table[disk_index],BDRV_TYPE_FLOPPY ); + +if ( file[0 ] && (bdrv_open (fd_table[disk_index], file, + snapshot ?BDRV_O_SNAPSHOT :0 ) <0 )) { +fprintf (stderr,"qemu: could not open floppy disk image '%s'\n" , + file); +return -1 ; + } + } +break ; }return 0 ; }
@@ -7848,7 +7875,6 @@int i, pflash_index;int snapshot, linux_boot;const char *initrd_filename; -const char *fd_filename[MAX_FD ];const char *pflash_filename[MAX_PFLASH ];const char *sd_filename;const char *mtd_filename;
@@ -7912,8 +7938,6 @@ machine = first_machine; cpu_model =NULL ; initrd_filename =NULL ; -for (i =0 ; i <MAX_FD ; i++) - fd_filename[i] =NULL ;for (i =0 ; i <MAX_PFLASH ; i++) pflash_filename[i] =NULL ; pflash_index =0 ;
@@ -8169,10 +8193,14 @@ }break ;case QEMU_OPTION_fda: - fd_filename[0 ] = optarg; -break ;case QEMU_OPTION_fdb: - fd_filename[1 ] = optarg; +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" FD_ALIAS , optarg, popt->index - QEMU_OPTION_fda); + nb_disks++;break ;#ifdef TARGET_I386 case QEMU_OPTION_no_fd_bootchk:
@@ -8516,19 +8544,11 @@if (!linux_boot && (!strchr (boot_device,'n' )) && - nb_disks ==0 && - fd_filename[0 ] =='\0' ) + nb_disks ==0 )help (1 ); -/* boot to floppy or the default cd if no hard disk defined yet */ if (!boot_device[0 ]) { -if (nb_disks) - boot_device[0 ] ='c' ; -else if (fd_filename[0 ] !='\0' ) - boot_device[0 ] ='a' ; -else - boot_device[0 ] ='d' ; - boot_device[1 ] =0 ; +pstrcpy (boot_device,sizeof (boot_device),BOOTCHARS ); }setvbuf (stdout,NULL , _IOLBF,0 );
@@ -8606,35 +8626,19 @@ nb_disks++; } +/* we always create at least on floppy */ + +if (nb_disks <MAX_DISKS ) { +snprintf (disks[nb_disks],sizeof (disks[0 ]),FD_ALIAS ,0 ); + nb_disks++; + } +/* open the virtual block devices */ for (i =0 ; i < nb_disks; i++)if (disk_init (disks[i], snapshot, machine) ==-1 )exit (1 ); -/* we always create at least one floppy disk */ - fd_table[0 ] =bdrv_new ("fda" ); -bdrv_set_type_hint (fd_table[0 ],BDRV_TYPE_FLOPPY ); - -for (i =0 ; i <MAX_FD ; i++) { -if (fd_filename[i]) { -if (!fd_table[i]) { -char buf[64 ]; -snprintf (buf,sizeof (buf),"fd%c" , i +'a' ); - fd_table[i] =bdrv_new (buf); -bdrv_set_type_hint (fd_table[i],BDRV_TYPE_FLOPPY ); - } -if (fd_filename[i][0 ] !='\0' ) { -if (bdrv_open (fd_table[i], fd_filename[i], - snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { -fprintf (stderr,"qemu: could not open floppy disk image '%s'\n" , - fd_filename[i]); -exit (1 ); - } - } - } - } -/* Open the virtual parallel flash block devices */ for (i =0 ; i <MAX_PFLASH ; i++) {if (pflash_filename[i]) {
@@ -8750,7 +8754,7 @@ } machine->init (ram_size, vga_ram_size, boot_device, - ds, fd_filename, snapshot, + ds,NULL , snapshot, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);/* init USB devices */
vl.h +1 -1
@@ -994,7 +994,7 @@#define MAX_IDE_DEVS 2#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS) -#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS) +#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD)extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ];extern BlockDriverState *sd_table[MAX_SCSI_DISKS +1 ];
PATCH 4/7 remove fd_filename from the machine init interface
As the parameter fd_filename seems unused and as we can't provide it anymore using the "-disk" interface, this patch removes it.
--
hw/an5206.c | 2 +- hw/etraxfs.c | 2 +- hw/integratorcp.c | 2 +- hw/mcf5208.c | 2 +- hw/mips_malta.c | 2 +- hw/mips_mipssim.c | 2 +- hw/mips_pica61.c | 2 +- hw/mips_r4k.c | 2 +- hw/palm.c | 2 +- hw/pc.c | 12 +++++------- hw/ppc405_boards.c | 4 ++-- hw/ppc_chrp.c | 2 +- hw/ppc_oldworld.c | 2 +- hw/ppc_prep.c | 2 +- hw/r2d.c | 2 +- hw/realview.c | 2 +- hw/shix.c | 2 +- hw/spitz.c | 8 ++++---- hw/sun4m.c | 4 ++-- hw/sun4u.c | 2 +- hw/versatilepb.c | 10 +++++----- vl.c | 2 +- vl.h | 2 +- 23 files changed, 36 insertions(+), 38 deletions(-)
vl.h +1 -1
@@ -732,7 +732,7 @@typedef void QEMUMachineInitFunc (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model);
hw/an5206.c +1 -1
@@ -28,7 +28,7 @@/* Board init. */ static void an5206_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/etraxfs.c +1 -1
@@ -108,7 +108,7 @@static void bareetraxfs_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/integratorcp.c +1 -1
@@ -464,7 +464,7 @@static void integratorcp_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/mcf5208.c +1 -1
@@ -199,7 +199,7 @@static void mcf5208evb_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/mips_malta.c +1 -1
@@ -741,7 +741,7 @@static void mips_malta_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/mips_mipssim.c +1 -1
@@ -75,7 +75,7 @@static void mips_mipssim_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/palm.c +1 -1
@@ -117,7 +117,7 @@static void palmte_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/ppc405_boards.c +2 -2
@@ -173,7 +173,7 @@ static void ref405ep_init (int ram_size, int vga_ram_size, const char *boot_device, DisplayState *ds, - const char **fd_filename, int snapshot, + int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename,
@@ -499,7 +499,7 @@ static void taihu_405ep_init(int ram_size, int vga_ram_size, const char *boot_device, DisplayState *ds, - const char **fd_filename, int snapshot, + int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename,
hw/ppc_chrp.c +1 -1
@@ -50,7 +50,7 @@/* PowerPC Mac99 hardware initialisation */ static void ppc_core99_init (int ram_size, int vga_ram_size, const char *boot_device, DisplayState *ds, - const char **fd_filename, int snapshot, + int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename,
hw/ppc_oldworld.c +1 -1
@@ -94,7 +94,7 @@ static void ppc_heathrow_init (int ram_size, int vga_ram_size, const char *boot_device, DisplayState *ds, - const char **fd_filename, int snapshot, + int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename,
hw/r2d.c +1 -1
@@ -28,7 +28,7 @@#define SDRAM_SIZE 0x04000000static void r2d_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState * ds,const char **fd_filename,int snapshot, +DisplayState * ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/shix.c +1 -1
@@ -63,7 +63,7 @@ }static void shix_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState * ds,const char **fd_filename,int snapshot, +DisplayState * ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/spitz.c +4 -4
@@ -1230,7 +1230,7 @@static void spitz_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
@@ -1240,7 +1240,7 @@static void borzoi_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
@@ -1250,7 +1250,7 @@static void akita_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
@@ -1260,7 +1260,7 @@static void terrier_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/sun4u.c +1 -1
@@ -332,7 +332,7 @@/* Sun4u hardware initialisation */ static void sun4u_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/mips_pica61.c +1 -1
@@ -56,7 +56,7 @@static void mips_pica61_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/mips_r4k.c +1 -1
@@ -138,7 +138,7 @@static void mips_r4k_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/pc.c +5 -7
@@ -669,7 +669,7 @@/* PC hardware initialisation */ static void pc_init1 (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,int pci_enabled)
@@ -949,29 +949,27 @@ }static void pc_init_pci (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename, -int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {pc_init1 (ram_size, vga_ram_size, boot_device, - ds, fd_filename, snapshot, + ds, snapshot, kernel_filename, kernel_cmdline, initrd_filename,1 ); }static void pc_init_isa (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename, -int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {pc_init1 (ram_size, vga_ram_size, boot_device, - ds, fd_filename, snapshot, + ds, snapshot, kernel_filename, kernel_cmdline, initrd_filename,0 ); }
hw/ppc_prep.c +1 -1
@@ -522,7 +522,7 @@/* PowerPC PREP hardware initialisation */ static void ppc_prep_init (int ram_size, int vga_ram_size, const char *boot_device, - DisplayState *ds, const char **fd_filename, + DisplayState *ds, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename,
hw/realview.c +1 -1
@@ -14,7 +14,7 @@static void realview_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/sun4m.c +2 -2
@@ -571,7 +571,7 @@/* SPARCstation 5 hardware initialisation */ static void ss5_init (int RAM_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
@@ -584,7 +584,7 @@/* SPARCstation 10 hardware initialisation */ static void ss10_init (int RAM_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {
hw/versatilepb.c +5 -5
@@ -153,7 +153,7 @@static void versatile_init (int ram_size,int vga_ram_size,const char *boot_device,DisplayState *ds, -const char **fd_filename,int snapshot, +int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model,int board_id)
@@ -268,23 +268,23 @@ }static void vpb_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {versatile_init (ram_size, vga_ram_size, boot_device, - ds, fd_filename, snapshot, + ds, snapshot, kernel_filename, kernel_cmdline, initrd_filename, cpu_model,0x183 ); }static void vab_init (int ram_size,int vga_ram_size,const char *boot_device, -DisplayState *ds,const char **fd_filename,int snapshot, +DisplayState *ds,int snapshot,const char *kernel_filename,const char *kernel_cmdline,const char *initrd_filename,const char *cpu_model) {versatile_init (ram_size, vga_ram_size, boot_device, - ds, fd_filename, snapshot, + ds, snapshot, kernel_filename, kernel_cmdline, initrd_filename, cpu_model,0x25e ); }
vl.c +1 -1
@@ -8754,7 +8754,7 @@ } machine->init (ram_size, vga_ram_size, boot_device, - ds,NULL , snapshot, + ds, snapshot, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);/* init USB devices */
PATCH 5/7 Add parallel flash support by -disk
This patch allows to define a parallel flash using -disk syntax. It adds an interface type "pflash".
"-pflash file" is an alias for "-disk file,if=pflash"
--
vl.c | 59 +++++++++++++++++++++++++++++++++-------------------------- vl.h | 2 +- 2 files changed, 34 insertions(+), 27 deletions(-)
vl.c +33 -26
@@ -4712,6 +4712,7 @@ }#define FD_ALIAS ",index=%d,if=floppy" +#define PFLASH_ALIAS ",if=pflash"#define HD_ALIAS ",index=%d,media=disk"#ifdef TARGET_PPC
@@ -4723,7 +4724,7 @@static int disk_init (const char *str,int snapshot,QEMUMachine *machine) {char buf[16 ]; -enum {IF_IDE ,IF_SCSI ,IF_FLOPPY } interface; +enum {IF_IDE ,IF_SCSI ,IF_FLOPPY ,IF_PFLASH } interface;enum {MEDIA_DISK ,MEDIA_CDROM } media;int bus_id, unit_id;int cyls, heads, secs, translation;
@@ -4814,6 +4815,8 @@ interface =IF_SCSI ; else if (!strcmp(buf, "floppy")) interface =IF_FLOPPY ; + else if (!strcmp(buf, "pflash")) + interface =IF_PFLASH ; else {fprintf (stderr,"unsupported bus type '%s'\n" , buf);return -1 ;
@@ -4993,6 +4996,29 @@ } }break ; +case IF_PFLASH : +if (disk_index ==-1 ) { + disk_index =0 ; +while (pflash_table[disk_index] && disk_index <MAX_PFLASH ) + disk_index++; + } +if (disk_index >=MAX_PFLASH ) { +fprintf (stderr,"qemu: too many parallel flash images\n" ); +return -1 ; + } + +if (!pflash_table[disk_index]) { +snprintf (buf,sizeof (buf),"fl%c" , disk_index +'a' ); + pflash_table[disk_index] =bdrv_new (buf); + +if (file[0 ] &&bdrv_open (pflash_table[disk_index], file, + snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { +fprintf (stderr,"qemu: could not open flash image '%s'\n" , + file); +return -1 ; + } + } +break ; }return 0 ; }
@@ -7872,10 +7898,9 @@int use_gdbstub;const char *gdbstub_port;#endif -int i, pflash_index; +int i;int snapshot, linux_boot;const char *initrd_filename; -const char *pflash_filename[MAX_PFLASH ];const char *sd_filename;const char *mtd_filename;const char *kernel_filename, *kernel_cmdline;
@@ -7938,9 +7963,6 @@ machine = first_machine; cpu_model =NULL ; initrd_filename =NULL ; -for (i =0 ; i <MAX_PFLASH ; i++) - pflash_filename[i] =NULL ; - pflash_index =0 ; sd_filename =NULL ; mtd_filename =NULL ; ram_size =DEFAULT_RAM_SIZE *1024 *1024 ;
@@ -8097,11 +8119,13 @@ sd_filename = optarg;break ;case QEMU_OPTION_pflash: -if (pflash_index >=MAX_PFLASH ) { -fprintf (stderr,"qemu: too many parallel flash images\n" ); +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" );exit (1 ); } - pflash_filename[pflash_index++] = optarg; +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" PFLASH_ALIAS , optarg); + nb_disks++;break ;case QEMU_OPTION_snapshot: snapshot =1 ;
@@ -8639,23 +8663,6 @@if (disk_init (disks[i], snapshot, machine) ==-1 )exit (1 ); -/* Open the virtual parallel flash block devices */ -for (i =0 ; i <MAX_PFLASH ; i++) { -if (pflash_filename[i]) { -if (!pflash_table[i]) { -char buf[64 ]; -snprintf (buf,sizeof (buf),"fl%c" , i +'a' ); - pflash_table[i] =bdrv_new (buf); - } -if (bdrv_open (pflash_table[i], pflash_filename[i], - snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { -fprintf (stderr,"qemu: could not open flash image '%s'\n" , - pflash_filename[i]); -exit (1 ); - } - } - } - sd_bdrv =bdrv_new ("sd" );/* FIXME: This isn't really a floppy, but it's a reasonable approximation. */
vl.h +1 -1
@@ -994,7 +994,7 @@#define MAX_IDE_DEVS 2#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS) -#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD) +#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD + MAX_PFLASH)extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ];extern BlockDriverState *sd_table[MAX_SCSI_DISKS +1 ];
PATCH 6/7 Add flash support by -disk
This patch allows to define a flash (mtd) using the "-disk" syntax. It adds an interface type "mtd"
"-mtdblock file" is an alias for "-disk file,if=mtd"
--
vl.c | 39 +++++++++++++++++++++++---------------- vl.h | 5 ++++- 2 files changed, 27 insertions(+), 17 deletions(-)
vl.c +23 -16
@@ -4713,6 +4713,7 @@#define FD_ALIAS ",index=%d,if=floppy"#define PFLASH_ALIAS ",if=pflash" +#define MTD_ALIAS ",if=mtd"#define HD_ALIAS ",index=%d,media=disk"#ifdef TARGET_PPC
@@ -4724,7 +4725,7 @@static int disk_init (const char *str,int snapshot,QEMUMachine *machine) {char buf[16 ]; -enum {IF_IDE ,IF_SCSI ,IF_FLOPPY ,IF_PFLASH } interface; +enum {IF_IDE ,IF_SCSI ,IF_FLOPPY ,IF_PFLASH ,IF_MTD } interface;enum {MEDIA_DISK ,MEDIA_CDROM } media;int bus_id, unit_id;int cyls, heads, secs, translation;
@@ -4817,6 +4818,8 @@ interface =IF_FLOPPY ; else if (!strcmp(buf, "pflash")) interface =IF_PFLASH ; + else if (!strcmp(buf, "mtd")) + interface =IF_MTD ; else {fprintf (stderr,"unsupported bus type '%s'\n" , buf);return -1 ;
@@ -5019,6 +5022,18 @@ } }break ; +case IF_MTD : +if (!mtd_bdrv) { + mtd_bdrv =bdrv_new ("mtd" ); +if (file[0 ] &&bdrv_open (mtd_bdrv, file, + snapshot ?BDRV_O_SNAPSHOT :0 ) <0 + ||qemu_key_check (mtd_bdrv, file)) { +fprintf (stderr,"qemu: could not open Flash image %s\n" , + file); +return -1 ; + } + } +break ; }return 0 ; }
@@ -7902,7 +7917,6 @@int snapshot, linux_boot;const char *initrd_filename;const char *sd_filename; -const char *mtd_filename;const char *kernel_filename, *kernel_cmdline;DisplayState *ds = &display_state;int cyls, heads, secs, translation;
@@ -7964,7 +7978,6 @@ cpu_model =NULL ; initrd_filename =NULL ; sd_filename =NULL ; - mtd_filename =NULL ; ram_size =DEFAULT_RAM_SIZE *1024 *1024 ; vga_ram_size =VGA_RAM_SIZE ;#ifdef CONFIG_GDBSTUB
@@ -8113,7 +8126,13 @@ nb_disks++;break ;case QEMU_OPTION_mtdblock: - mtd_filename = optarg; +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" MTD_ALIAS , optarg); + nb_disks++;break ;case QEMU_OPTION_sd: sd_filename = optarg;
@@ -8676,18 +8695,6 @@qemu_key_check (sd_bdrv, sd_filename); } -if (mtd_filename) { - mtd_bdrv =bdrv_new ("mtd" ); -if (bdrv_open (mtd_bdrv, mtd_filename, - snapshot ?BDRV_O_SNAPSHOT :0 ) <0 || -qemu_key_check (mtd_bdrv, mtd_filename)) { -fprintf (stderr,"qemu: could not open Flash image %s\n" , - mtd_filename); -bdrv_delete (mtd_bdrv); - mtd_bdrv =0 ; - } - } -register_savevm ("timer" ,0 ,2 , timer_save, timer_load,NULL );register_savevm ("ram" ,0 ,2 , ram_save, ram_load,NULL );
vl.h +4 -1
@@ -994,7 +994,10 @@#define MAX_IDE_DEVS 2#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS) -#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD + MAX_PFLASH) +#define MAX_MTD 1 + +#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD + MAX_PFLASH + \ + MAX_MTD)extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ];extern BlockDriverState *sd_table[MAX_SCSI_DISKS +1 ];
PATCH 7/7 Add SecureDigital support by -disk
This patch allows to define SecureDigital disk using "-disk" syntax" It adds an interface type "sd"
"-sd file" becomes the alias of "-disk file,if=sd"
--
vl.c | 43 ++++++++++++++++++++++++++----------------- vl.h | 3 ++- 2 files changed, 28 insertions(+), 18 deletions(-)
vl.c +26 -17
@@ -4714,6 +4714,7 @@#define FD_ALIAS ",index=%d,if=floppy"#define PFLASH_ALIAS ",if=pflash"#define MTD_ALIAS ",if=mtd" +#define SD_ALIAS ",if=sd"#define HD_ALIAS ",index=%d,media=disk"#ifdef TARGET_PPC
@@ -4725,7 +4726,7 @@static int disk_init (const char *str,int snapshot,QEMUMachine *machine) {char buf[16 ]; -enum {IF_IDE ,IF_SCSI ,IF_FLOPPY ,IF_PFLASH ,IF_MTD } interface; +enum {IF_IDE ,IF_SCSI ,IF_FLOPPY ,IF_PFLASH ,IF_MTD ,IF_SD } interface;enum {MEDIA_DISK ,MEDIA_CDROM } media;int bus_id, unit_id;int cyls, heads, secs, translation;
@@ -4820,6 +4821,8 @@ interface =IF_PFLASH ; else if (!strcmp(buf, "mtd")) interface =IF_MTD ; + else if (!strcmp(buf, "sd")) + interface =IF_SD ; else {fprintf (stderr,"unsupported bus type '%s'\n" , buf);return -1 ;
@@ -5034,6 +5037,21 @@ } }break ; +case IF_SD : +if (!sd_bdrv) { + sd_bdrv =bdrv_new ("sd" ); +/* FIXME: This isn't really a floppy, but it's a reasonable +approximation. */ +bdrv_set_type_hint (sd_bdrv,BDRV_TYPE_FLOPPY ); +if (file[0 ] &&bdrv_open (sd_bdrv, file, + snapshot ?BDRV_O_SNAPSHOT :0 ) <0 + ||qemu_key_check (sd_bdrv, file)) { +fprintf (stderr,"qemu: could not open SD card image %s\n" , + file); +return -1 ; + } + } +break ; }return 0 ; }
@@ -7916,7 +7934,6 @@int i;int snapshot, linux_boot;const char *initrd_filename; -const char *sd_filename;const char *kernel_filename, *kernel_cmdline;DisplayState *ds = &display_state;int cyls, heads, secs, translation;
@@ -7977,7 +7994,6 @@ machine = first_machine; cpu_model =NULL ; initrd_filename =NULL ; - sd_filename =NULL ; ram_size =DEFAULT_RAM_SIZE *1024 *1024 ; vga_ram_size =VGA_RAM_SIZE ;#ifdef CONFIG_GDBSTUB
@@ -8135,7 +8151,13 @@ nb_disks++;break ;case QEMU_OPTION_sd: - sd_filename = optarg; +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" SD_ALIAS , optarg); + nb_disks++;break ;case QEMU_OPTION_pflash:if (nb_disks >=MAX_DISKS ) {
@@ -8682,19 +8704,6 @@if (disk_init (disks[i], snapshot, machine) ==-1 )exit (1 ); - sd_bdrv =bdrv_new ("sd" ); -/* FIXME: This isn't really a floppy, but it's a reasonable -approximation. */ -bdrv_set_type_hint (sd_bdrv,BDRV_TYPE_FLOPPY ); -if (sd_filename) { -if (bdrv_open (sd_bdrv, sd_filename, - snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { -fprintf (stderr,"qemu: could not open SD card image %s\n" , - sd_filename); - }else -qemu_key_check (sd_bdrv, sd_filename); - } -register_savevm ("timer" ,0 ,2 , timer_save, timer_load,NULL );register_savevm ("ram" ,0 ,2 , ram_save, ram_load,NULL );
vl.h +2 -1
@@ -995,9 +995,10 @@#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS)#define MAX_MTD 1 +#define MAX_SD 1#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS + MAX_FD + MAX_PFLASH + \ - MAX_MTD) + MAX_MTD + MAX_SD)extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ];extern BlockDriverState *sd_table[MAX_SCSI_DISKS +1 ];
PATCH 1/7 Add arg -disk to define new disk with more features
In reply to Laurent VivierThis patch introduces a new parameter allowing to define disks.
The new parameter is "-disk":
-disk file[,if=type][,index=i][,bus=n][,unit=m][,media=d][,cyls=c,heads=h,secs=s[,trans=t]][snapshot=on|off]
where:
file is the disk image
type is the interface type (ide)
i is the index of the disk on the interface (0, 1, 2, ...) n is the bus number of the given type
m is the unit number on the the given bus
d is the type of the media (disk, cdrom)
c,h,s,t are the parameters usually given by -hdachs snapshot allows to enable or not the snapshot for this disk
"-cdrom file" is an alias for "-disk file,index=2,media=cdrom" "-hda file" is an alias for "-disk file,index=0,media=disk" "-hdb file" is an alias for "-disk file,index=1,media=disk" "-hdc file" is an alias for "-disk file,index=2,media=disk" "-hdd file" is an alias for "-disk file,index=3,media=disk" "-hda file -hdachs a,b,c" is an alias for
"-disk file,index=0,cyls=a,heads=b,secs=c"
You can also define a cdrom on the slave of ide0 with:
"-disk file,if=ide,bus=0,unit=1,media=cdrom"
--
hw/mips_pica61.c | 5 hw/mips_r4k.c | 5 hw/pc.c | 5 hw/ppc_prep.c | 5 monitor.c | 2 vl.c | 346 ++++++++++++++++++++++++++++++++++++++++++++++--------- vl.h | 8 - 7 files changed, 311 insertions(+), 65 deletions(-)
vl.c +292 -54
@@ -149,9 +149,9 @@void *ioport_opaque[MAX_IOPORTS ];IOPortReadFunc *ioport_read_table[3 ][MAX_IOPORTS ];IOPortWriteFunc *ioport_write_table[3 ][MAX_IOPORTS ]; -/* Note: bs_table[MAX_DISKS] is a dummy block driver if none available +/* Note: bs_table[MAX_IDE_DISKS] is a dummy block driver if none available to store the VM snapshots */ -BlockDriverState *bs_table[MAX_DISKS +1 ], *fd_table[MAX_FD ]; +BlockDriverState *bs_table[MAX_IDE_DISKS +1 ], *fd_table[MAX_FD ];BlockDriverState *pflash_table[MAX_PFLASH ];BlockDriverState *sd_bdrv;BlockDriverState *mtd_bdrv;
@@ -1748,7 +1748,7 @@case 's' : {int i; -for (i =0 ; i <MAX_DISKS ; i++) { +for (i =0 ; i <MAX_IDE_DISKS ; i++) {if (bs_table[i])bdrv_commit (bs_table[i]); }
@@ -4706,6 +4706,205 @@ } } +#define HD_ALIAS ",index=%d,media=disk" + +#ifdef TARGET_PPC +#define CDROM_ALIAS ",index=1,media=cdrom" +#else +#define CDROM_ALIAS ",index=2,media=cdrom" +#endif + +static int disk_init (const char *str,int snapshot) +{ +char buf[16 ]; +enum {IF_IDE ,IF_SCSI } interface; +enum {MEDIA_DISK ,MEDIA_CDROM } media; +int bus_id, unit_id; +int cyls, heads, secs, translation; +char *p; +char *file; +int disk_index; + + file = str; + p = str; +while (*p !='\0' && *p !=',' ) + p++; +if (*p ==',' ) { + *p ='\0' ; + p++; + } + + cyls = heads = secs =0 ; + bus_id =-1 ; + unit_id =-1 ; + disk_index =-1 ; + translation =BIOS_ATA_TRANSLATION_AUTO ; + interface =IF_IDE ; + media =MEDIA_DISK ; + +/* extract parameters */ + +if (get_param_value (buf,sizeof (buf),"bus" , p)) { + bus_id =strtol (buf,NULL ,0 ); +if (bus_id <0 ) { +fprintf (stderr,"qemu: invalid bus id\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"unit" , p)) { + unit_id =strtol (buf,NULL ,0 ); +if (unit_id <0 ) { +fprintf (stderr,"qemu: invalid unit id\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"index" , p)) { + disk_index =strtol (buf,NULL ,0 ); +if (disk_index <0 ) { +fprintf (stderr,"qemu: invalid disk index\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"cyls" , p)) { + cyls =strtol (buf,NULL ,0 ); +if (cyls <1 || cyls >16383 ) { +fprintf (stderr,"qemu: invalid physical cyls number\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"heads" , p)) { + heads =strtol (buf,NULL ,0 ); +if (heads <1 || heads >16 ) { +fprintf (stderr,"qemu: invalid physical heads number\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"secs" , p)) { + secs =strtol (buf,NULL ,0 ); +if (secs <1 || secs >63 ) { +fprintf (stderr,"qemu: invalid physical secs number\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"if" , p)) { +if (!strcmp (buf,"ide" )) + interface =IF_IDE ; +else if (!strcmp (buf,"scsi" )) + interface =IF_SCSI ; +else { +fprintf (stderr,"unsupported bus type '%s'\n" , buf); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"trans" , p)) { +if (!strcmp (buf,"none" )) + translation =BIOS_ATA_TRANSLATION_NONE ; +else if (!strcmp (buf,"lba" )) + translation =BIOS_ATA_TRANSLATION_LBA ; +else if (!strcmp (buf,"auto" )) + translation =BIOS_ATA_TRANSLATION_AUTO ; +else { +fprintf (stderr,"qemu: invalid translation type\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"media" , p)) { +if (!(strcmp (buf,"disk" ))) { + media =MEDIA_DISK ; + }else if (!strcmp (buf,"cdrom" )) { +if (cyls || secs || heads) { +fprintf (stderr,"qemu: invalid physical CHS format\n" ); +return -1 ; + } + media =MEDIA_CDROM ; + }else { +fprintf (stderr,"qemu: invalid media\n" ); +return -1 ; + } + } + +if (get_param_value (buf,sizeof (buf),"snapshot" , p)) { +if (!(strcmp (buf,"on" ))) + snapshot =1 ; +else if (!(strcmp (buf,"off" ))) + snapshot =0 ; +else { +fprintf (stderr,"qemu: invalid snapshot option\n" ); +return -1 ; + } + } + +switch (interface) { +case IF_IDE : +if (bus_id >=MAX_IDE_BUS ) { +fprintf (stderr,"qemu: bus number too big\n" ); +return -1 ; + } +if (unit_id >=MAX_IDE_DEVS ) { +fprintf (stderr,"qemu: unit number too big\n" ); +return -1 ; + } + +if (disk_index ==-1 ) { +if (bus_id !=-1 && unit_id !=-1 ) { + disk_index = bus_id *MAX_IDE_DEVS + unit_id; + }else { +if (bus_id !=-1 ) + disk_index = bus_id *MAX_IDE_DEVS ; +else + disk_index =0 ; +while (bs_table[disk_index] && disk_index <MAX_IDE_DISKS ) + disk_index++; + } + } + +if (disk_index >=MAX_IDE_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +return -1 ; + } + +if (!bs_table[disk_index]) { +switch (media) { +case MEDIA_DISK : +snprintf (buf,sizeof (buf),"hd%c" , disk_index +'a' ); + bs_table[disk_index] =bdrv_new (buf); +break ; +case MEDIA_CDROM : +snprintf (buf,sizeof (buf),"cdrom%c" , disk_index +'0' ); + bs_table[disk_index] =bdrv_new (buf); +bdrv_set_type_hint (bs_table[disk_index],BDRV_TYPE_CDROM ); +break ; + } + +if (file[0 ] &&bdrv_open (bs_table[disk_index], file, + snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { +fprintf (stderr,"qemu: could not open hard disk image '%s'\n" , + file); +return -1 ; + } + +if (cyls !=0 ) { +bdrv_set_geometry_hint (bs_table[disk_index], + cyls, heads, secs); +bdrv_set_translation_hint (bs_table[disk_index], translation); + } + } +break ; +case IF_SCSI : +/* TODO */ +break ; + } +return 0 ; +} +/***********************************************************/ /* USB devices */
@@ -5489,7 +5688,7 @@if (bs_snapshots)return bs_snapshots; -for (i =0 ; i <=MAX_DISKS ; i++) { +for (i =0 ; i <=MAX_IDE_DISKS ; i++) { bs = bs_table[i];if (bdrv_can_snapshot (bs)) goto ok;
@@ -5598,7 +5797,7 @@/* create the snapshots */ -for (i =0 ; i <MAX_DISKS ; i++) { +for (i =0 ; i <MAX_IDE_DISKS ; i++) { bs1 = bs_table[i];if (bdrv_has_snapshot (bs1)) {if (must_delete) {
@@ -5641,7 +5840,7 @@ saved_vm_running = vm_running;vm_stop (0 ); -for (i =0 ; i <=MAX_DISKS ; i++) { +for (i =0 ; i <=MAX_IDE_DISKS ; i++) { bs1 = bs_table[i];if (bdrv_has_snapshot (bs1)) { ret =bdrv_snapshot_goto (bs1, name);
@@ -5702,7 +5901,7 @@return ; } -for (i =0 ; i <=MAX_DISKS ; i++) { +for (i =0 ; i <=MAX_IDE_DISKS ; i++) { bs1 = bs_table[i];if (bdrv_has_snapshot (bs1)) { ret =bdrv_snapshot_delete (bs1, name);
@@ -5731,7 +5930,7 @@return ; }term_printf ("Snapshot devices:" ); -for (i =0 ; i <=MAX_DISKS ; i++) { +for (i =0 ; i <=MAX_IDE_DISKS ; i++) { bs1 = bs_table[i];if (bdrv_has_snapshot (bs1)) {if (bs == bs1)
@@ -6436,7 +6635,7 @@/* find if the memory block is available on a virtual block device */ sector_num =-1 ; -for (j =0 ; j <MAX_DISKS ; j++) { +for (j =0 ; j <MAX_IDE_DISKS ; j++) {if (bs_table[j]) { sector_num =bdrv_hash_find (bs_table[j], phys_ram_base + i,BDRV_HASH_BLOCK_SIZE );
@@ -6444,7 +6643,7 @@break ; } } -if (j ==MAX_DISKS ) +if (j ==MAX_IDE_DISKS ) goto normal_compress; buf[0 ] =1 ; buf[1 ] = j;
@@ -6495,7 +6694,7 @@ram_decompress_buf (s, buf +1 ,9 ); bs_index = buf[1 ]; sector_num =be64_to_cpupu ((const uint64_t *)(buf +2 )); -if (bs_index >=MAX_DISKS || bs_table[bs_index] ==NULL ) { +if (bs_index >=MAX_IDE_DISKS || bs_table[bs_index] ==NULL ) {fprintf (stderr,"Invalid block device index %d\n" , bs_index); goto error; }
@@ -6996,6 +7195,8 @@"-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n" "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n" "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n" +"-disk file[,if=type][,index=i][,bus=n][,unit=m][,media=d][,cyls=c,heads=h,secs=s[,trans=t]][snapshot=on|off]\n" +" use 'file' as a disk image\n" "-mtdblock file use 'file' as on-board Flash memory image\n" "-sd file use 'file' as SecureDigital card image\n" "-pflash file use 'file' as a parallel flash image\n"
@@ -7144,6 +7345,7 @@ QEMU_OPTION_hdb, QEMU_OPTION_hdc, QEMU_OPTION_hdd, + QEMU_OPTION_disk, QEMU_OPTION_cdrom, QEMU_OPTION_mtdblock, QEMU_OPTION_sd,
@@ -7232,6 +7434,7 @@ { "hdb", HAS_ARG, QEMU_OPTION_hdb }, { "hdc", HAS_ARG, QEMU_OPTION_hdc }, { "hdd", HAS_ARG, QEMU_OPTION_hdd }, + { "disk", HAS_ARG, QEMU_OPTION_disk }, { "cdrom", HAS_ARG, QEMU_OPTION_cdrom }, { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock }, { "sd", HAS_ARG, QEMU_OPTION_sd },
@@ -7354,10 +7557,10 @@ {BlockDriverState *bs; -if (index <4 ) { +if (index <MAX_IDE_DISKS ) { bs = bs_table[index]; - }else if (index <6 ) { - bs = fd_table[index -4 ]; + }else if (index <MAX_IDE_DISKS +MAX_FD ) { + bs = fd_table[index -MAX_IDE_DISKS ]; }else { bs =NULL ; }
@@ -7556,10 +7759,10 @@int use_gdbstub;const char *gdbstub_port;#endif -int i, cdrom_index, pflash_index; +int i, pflash_index;int snapshot, linux_boot;const char *initrd_filename; -const char *hd_filename[MAX_DISKS ], *fd_filename[MAX_FD ]; +const char *fd_filename[MAX_FD ];const char *pflash_filename[MAX_PFLASH ];const char *sd_filename;const char *mtd_filename;
@@ -7567,7 +7770,10 @@DisplayState *ds = &display_state;int cyls, heads, secs, translation;char net_clients[MAX_NET_CLIENTS ][256 ]; +char disks[MAX_DISKS ][256 ];int nb_net_clients; +int nb_disks; +int hda_index;int optind;const char *r, *optarg;CharDriverState *monitor_hd;
@@ -7622,8 +7828,6 @@ initrd_filename =NULL ;for (i =0 ; i <MAX_FD ; i++) fd_filename[i] =NULL ; -for (i =0 ; i <MAX_DISKS ; i++) - hd_filename[i] =NULL ;for (i =0 ; i <MAX_PFLASH ; i++) pflash_filename[i] =NULL ; pflash_index =0 ;
@@ -7639,11 +7843,6 @@ nographic =0 ; kernel_filename =NULL ; kernel_cmdline ="" ; -#ifdef TARGET_PPC - cdrom_index =1 ; -#else - cdrom_index =2 ; -#endif cyls = heads = secs =0 ; translation =BIOS_ATA_TRANSLATION_AUTO ;pstrcpy (monitor_device,sizeof (monitor_device),"vc" );
@@ -7661,6 +7860,8 @@ usb_devices_index =0 ; nb_net_clients =0 ; + nb_disks =0 ; + hda_index =-1 ; nb_nics =0 ;/* default mac address of the first network interface */
@@ -7671,7 +7872,10 @@break ; r = argv[optind];if (r[0 ] !='-' ) { - hd_filename[0 ] = argv[optind++]; + hda_index = nb_disks; +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" HD_ALIAS , argv[optind++],0 ); + nb_disks++; }else {const QEMUOption *popt;
@@ -7731,17 +7935,51 @@ initrd_filename = optarg;break ;case QEMU_OPTION_hda: +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } + hda_index = nb_disks; +if (cyls ==0 ) +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" HD_ALIAS , optarg,0 ); +else { +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" HD_ALIAS +",cyls=%d,heads=%d,secs=%d%s" , + optarg,0 , cyls, heads, secs, + translation ==BIOS_ATA_TRANSLATION_LBA ? +",trans=lba" : + translation ==BIOS_ATA_TRANSLATION_NONE ? +",trans=none" :"" ); + } + nb_disks++; +break ;case QEMU_OPTION_hdb:case QEMU_OPTION_hdc:case QEMU_OPTION_hdd: {int hd_index; +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } hd_index = popt->index - QEMU_OPTION_hda; - hd_filename[hd_index] = optarg; -if (hd_index == cdrom_index) - cdrom_index =-1 ; +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" HD_ALIAS , optarg, hd_index); + nb_disks++; }break ; +case QEMU_OPTION_disk: +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); + } +pstrcpy (disks[nb_disks], +sizeof (disks[0 ]), + optarg); + nb_disks++; +break ;case QEMU_OPTION_mtdblock: mtd_filename = optarg;break ;
@@ -7792,6 +8030,15 @@fprintf (stderr,"qemu: invalid physical CHS format\n" );exit (1 ); } +if (hda_index !=-1 ) +snprintf (disks[hda_index] +strlen (disks[hda_index]), +sizeof (disks[0 ]) -strlen (disks[hda_index]), +",cyls=%d,heads=%d,secs=%d%s" , + cyls, heads, secs, + translation ==BIOS_ATA_TRANSLATION_LBA ? +",trans=lba" : + translation ==BIOS_ATA_TRANSLATION_NONE ? +",trans=none" :"" ); }break ;case QEMU_OPTION_nographic:
@@ -7810,9 +8057,13 @@ kernel_cmdline = optarg;break ;case QEMU_OPTION_cdrom: -if (cdrom_index >=0 ) { - hd_filename[cdrom_index] = optarg; +if (nb_disks >=MAX_DISKS ) { +fprintf (stderr,"qemu: too many disks\n" ); +exit (1 ); } +snprintf (disks[nb_disks],sizeof (disks[0 ]), +"%s" CDROM_ALIAS , optarg); + nb_disks++;break ;case QEMU_OPTION_boot:if (strlen (optarg) >MAX_BOOT_DEVICES ) {
@@ -8179,14 +8430,13 @@if (!linux_boot && (!strchr (boot_device,'n' )) && - hd_filename[0 ] =='\0' && - (cdrom_index >=0 && hd_filename[cdrom_index] =='\0' ) && + nb_disks ==0 && fd_filename[0 ] =='\0' )help (1 );/* boot to floppy or the default cd if no hard disk defined yet */ if (!boot_device[0 ]) { -if (hd_filename[0 ] !='\0' ) +if (nb_disks) boot_device[0 ] ='c' ;else if (fd_filename[0 ] !='\0' ) boot_device[0 ] ='a' ;
@@ -8261,32 +8511,20 @@exit (1 ); } -/* we always create the cdrom drive, even if no disk is there */ bdrv_init (); -if (cdrom_index >=0 ) { - bs_table[cdrom_index] =bdrv_new ("cdrom" ); -bdrv_set_type_hint (bs_table[cdrom_index],BDRV_TYPE_CDROM ); + +/* we always create the cdrom drive, even if no disk is there */ + +if (nb_disks <MAX_DISKS ) { +pstrcpy (disks[nb_disks],sizeof (disks[0 ]),CDROM_ALIAS ); + nb_disks++; }/* open the virtual block devices */ -for (i =0 ; i <MAX_DISKS ; i++) { -if (hd_filename[i]) { -if (!bs_table[i]) { -char buf[64 ]; -snprintf (buf,sizeof (buf),"hd%c" , i +'a' ); - bs_table[i] =bdrv_new (buf); - } -if (bdrv_open (bs_table[i], hd_filename[i], snapshot ?BDRV_O_SNAPSHOT :0 ) <0 ) { -fprintf (stderr,"qemu: could not open hard disk image '%s'\n" , - hd_filename[i]); -exit (1 ); - } -if (i ==0 && cyls !=0 ) { -bdrv_set_geometry_hint (bs_table[i], cyls, heads, secs); -bdrv_set_translation_hint (bs_table[i], translation); - } - } - } + +for (i =0 ; i < nb_disks; i++) +if (disk_init (disks[i], snapshot) ==-1 ) +exit (1 );/* we always create at least one floppy disk */ fd_table[0 ] =bdrv_new ("fda" );
vl.h +6 -2
@@ -984,9 +984,13 @@extern uint8_t _translate_keycode (const int key);/* ide.c */ -#define MAX_DISKS 4 +#define MAX_IDE_BUS 2 +#define MAX_IDE_DEVS 2 +#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS) -extern BlockDriverState *bs_table[MAX_DISKS +1 ]; +#define MAX_DISKS (MAX_IDE_DISKS) + +extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ];extern BlockDriverState *sd_bdrv;extern BlockDriverState *mtd_bdrv;
monitor.c +1 -1
@@ -204,7 +204,7 @@int i, all_devices; all_devices = !strcmp (device,"all" ); -for (i =0 ; i <MAX_DISKS ; i++) { +for (i =0 ; i <MAX_IDE_DISKS ; i++) {if (bs_table[i]) {if (all_devices || !strcmp (bdrv_get_device_name (bs_table[i]), device))
hw/mips_pica61.c +3 -2
@@ -136,9 +136,10 @@i8042_mm_init (i8259[6 ], i8259[7 ],0x80005060 ,0 );/* IDE controller */ -for (i =0 ; i <2 ; i++) +for (i =0 ; i <MAX_IDE_BUS ; i++)isa_ide_init (ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], - bs_table[2 * i], bs_table[2 * i +1 ]); + bs_table[MAX_IDE_DEVS * i], + bs_table[MAX_IDE_DEVS * i +1 ]);/* Network controller */ /* FIXME: missing NS SONIC DP83932 */
hw/mips_r4k.c +3 -2
@@ -240,9 +240,10 @@ } } -for (i =0 ; i <2 ; i++) +for (i =0 ; i <MAX_IDE_BUS ; i++)isa_ide_init (ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], - bs_table[2 * i], bs_table[2 * i +1 ]); + bs_table[MAX_IDE_DEVS * i], + bs_table[MAX_IDE_DEVS * i +1 ]);i8042_init (i8259[1 ], i8259[12 ],0x60 );ds1225y_init (0x9000 ,"nvram" );
hw/pc.c +3 -2
@@ -892,9 +892,10 @@if (pci_enabled) {pci_piix3_ide_init (pci_bus, bs_table, piix3_devfn +1 , i8259); }else { -for (i =0 ; i <2 ; i++) { +for (i =0 ; i <MAX_IDE_BUS ; i++) {isa_ide_init (ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], - bs_table[2 * i], bs_table[2 * i +1 ]); + bs_table[MAX_IDE_DEVS * i], + bs_table[MAX_IDE_DEVS * i +1 ]); } }
hw/ppc_prep.c +3 -2
@@ -649,9 +649,10 @@ } } -for (i =0 ; i <2 ; i++) { +for (i =0 ; i <MAX_IDE_BUS ; i++) {isa_ide_init (ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], - bs_table[2 * i], bs_table[2 * i +1 ]); + bs_table[MAX_IDE_DEVS * i], + bs_table[MAX_IDE_DEVS * i +1 ]); }i8042_init (i8259[1 ], i8259[12 ],0x60 );DMA_init (1 );
cover Add -disk interface
This series of patches add a new interface to qemu to define storages.
The new parameter is "-disk":
-disk file[,if=type][,index=i][,bus=n][,unit=m][,media=d][,cyls=c,heads=h,secs=s[,trans=t]][snapshot=on|off]
where:
file is the disk image
type is the interface type (ide, scsi, floppy, pflash, mtd, sd) i is the index of the disk on the interface (0, 1, 2, ...) n is the bus number of the given type
m is the unit number on the the given bus
d is the type of the media (disk, cdrom)
c,h,s,t are the parameters usually given by -hdachs snapshot allows to enable or not the snapshot for this disk
"-cdrom file" is an alias for "-disk file,index=2,media=cdrom" "-hda file" is an alias for "-disk file,index=0,media=disk" "-hdb file" is an alias for "-disk file,index=1,media=disk" "-hdc file" is an alias for "-disk file,index=2,media=disk" "-hdd file" is an alias for "-disk file,index=3,media=disk" "-hda file -hdachs a,b,c" is an alias for
"-disk file,index=0,cyls=a,heads=b,secs=c"
"-fda file" is an alias for "-disk file,index=0,if=floppy" "-fdb file" is an alias for "-disk file,index=1,if=floppy" "-pflash file" is an alias for "-disk file,if=pflash" "-mtdblock file" is an alias for "-disk file,if=mtd" "-sd file" becomes the alias of "-disk file,if=sd"
You can also define a cdrom on the slave of ide0 with:
"-disk file,if=ide,bus=0,unit=1,media=cdrom" You can define a cdrom on the scsi bus 0 with unit id 3:
"-disk file,if=scsi,bus=0,unit=3,media=cdrom"
You can define a scsi disk on bus 0 with unit id 6 with:
"-disk file,if=scsi,bus=0,unit=6"
You can define disks with default ordering:
"-disk a.img -disk b.img -disk c.img" is equal to "-hda a.img -hdb b.img -hdc c.img"
[PATCH 1/7] Add arg -disk to define new disk with more features
Define -disk, support interface type "ide"
[PATCH 2/7] Add scsi support for the target PC
support interface type "scsi"
[PATCH 3/7] Add floppy support by -disk
support interface type "floppy"
[PATCH 4/7] remove fd_filename from the machine init interface
change machine init interface to remove fd_filename
[PATCH 5/7] Add parallel flash support by -disk
support interface type "pflash"
[PATCH 6/7] Add flash support by -disk
support interface type "mtd"
[PATCH 7/7] Add SecureDigital support by -disk
support interface type "sd"
PATCH 2/7 Add scsi support for the target PC
In reply to Laurent VivierThis patch adds the SCSI support for the target PC. It allows to initalize SCSI interface in the PC init machine.
it adds a new interface type "scsi" to "-disk" interface.
"-disk file,if=scsi,bus=0,unit=6" allows to connect the disk image file to the bus 0 with the unit id 6.
if there is no SCSI disk, the SCSI interface is not created.
It also defines the default interface type to "scsi" for targets "realview", "SS-5", "SS-10", "versatilepb", "versatileab" to keep old behavior, where "-hda" is a SCSI disk.
--
hw/esp.c | 4 +- hw/pc.c | 30 ++++++++------- hw/realview.c | 6 +-- hw/sun4m.c | 6 +-- hw/versatilepb.c | 6 +-- monitor.c | 7 +++ vl.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++------ vl.h | 9 ++++ 8 files changed, 139 insertions(+), 37 deletions(-)
hw/pc.c +16 -14
@@ -927,23 +927,25 @@if (i440fx_state) {i440fx_init_memory_mappings (i440fx_state); } -#if 0 -/* ??? Need to figure out some way for the user to -specify SCSI devices. */ +if (pci_enabled) { -void *scsi; -BlockDriverState *bdrv; +void *scsi[SCSI_MAX_BUS ]; +int max_bus =-1 ; + +for (i =0 ; i <MAX_SCSI_DISKS ; i++) +if (sd_table[i]) + max_bus = i /SCSI_MAX_DEVS +1 ; + +for (i =0 ; i < max_bus; i++) + scsi[i] =lsi_scsi_init (pci_bus,-1 ); - scsi =lsi_scsi_init (pci_bus,-1 ); - bdrv =bdrv_new ("scsidisk" ); -bdrv_open (bdrv,"scsi_disk.img" ,0 ); -lsi_scsi_attach (scsi, bdrv,-1 ); - bdrv =bdrv_new ("scsicd" ); -bdrv_open (bdrv,"scsi_cd.iso" ,0 ); -bdrv_set_type_hint (bdrv,BDRV_TYPE_CDROM ); -lsi_scsi_attach (scsi, bdrv,-1 ); +for (i =0 ; i <MAX_SCSI_DISKS ; i++) { +if (sd_table[i]) { +lsi_scsi_attach (scsi[i /SCSI_MAX_DEVS ], + sd_table[i], i %SCSI_MAX_DEVS ); + } + } } -#endif } static void pc_init_pci(int ram_size, int vga_ram_size, const char *boot_device,
hw/realview.c +3 -3
@@ -65,9 +65,9 @@usb_ohci_init_pci (pci_bus,3 ,-1 ); } scsi_hba =lsi_scsi_init (pci_bus,-1 ); -for (n =0 ; n <MAX_DISKS ; n++) { -if (bs_table[n]) { -lsi_scsi_attach (scsi_hba, bs_table[n], n); +for (n =0 ; n <SCSI_MAX_DEVS ; n++) { +if (sd_table[n]) { +lsi_scsi_attach (scsi_hba, sd_table[n], n); } }for (n =0 ; n < nb_nics; n++) {
hw/versatilepb.c +3 -3
@@ -199,9 +199,9 @@usb_ohci_init_pci (pci_bus,3 ,-1 ); } scsi_hba =lsi_scsi_init (pci_bus,-1 ); -for (n =0 ; n <MAX_DISKS ; n++) { -if (bs_table[n]) { -lsi_scsi_attach (scsi_hba, bs_table[n], n); +for (n =0 ; n <SCSI_MAX_DEVS ; n++) { +if (sd_table[n]) { +lsi_scsi_attach (scsi_hba, sd_table[n], n); } }
vl.c +97 -11
174 lines not on this page · raw message
vl.h +8 -1
@@ -983,14 +983,21 @@/* x_keymap.c */ extern uint8_t _translate_keycode (const int key); +/* lsi53c895a.c */ + +#define SCSI_MAX_DEVS 7 +#define SCSI_MAX_BUS 4 +#define MAX_SCSI_DISKS (SCSI_MAX_BUS * SCSI_MAX_DEVS) +/* ide.c */ #define MAX_IDE_BUS 2#define MAX_IDE_DEVS 2#define MAX_IDE_DISKS (MAX_IDE_BUS * MAX_IDE_DEVS) -#define MAX_DISKS (MAX_IDE_DISKS) +#define MAX_DISKS (MAX_IDE_DISKS + MAX_SCSI_DISKS)extern BlockDriverState *bs_table[MAX_IDE_DISKS +1 ]; +extern BlockDriverState *sd_table[MAX_SCSI_DISKS +1 ];extern BlockDriverState *sd_bdrv;extern BlockDriverState *mtd_bdrv;
hw/sun4m.c +3 -3
@@ -394,9 +394,9 @@ main_esp =esp_init (bs_table, hwdef->esp_base, espdma, *espdma_irq, esp_reset); -for (i =0 ; i <MAX_DISKS ; i++) { -if (bs_table[i]) { -esp_scsi_attach (main_esp, bs_table[i], i); +for (i =0 ; i <MAX_SCSI_DISKS ; i++) { +if (sd_table[i]) { +esp_scsi_attach (main_esp, sd_table[i], i); } }
monitor.c +7 -0
@@ -211,6 +211,13 @@bdrv_commit (bs_table[i]); } } +for (i =0 ; i <MAX_SCSI_DISKS ; i++) { +if (sd_table[i]) { +if (all_devices || + !strcmp (bdrv_get_device_name (sd_table[i]), device)) +bdrv_commit (sd_table[i]); + } + }if (mtd_bdrv)if (all_devices || !strcmp (bdrv_get_device_name (mtd_bdrv), device))bdrv_commit (mtd_bdrv);
hw/esp.c +2 -2
@@ -60,7 +60,7 @@uint8_t ti_buf[TI_BUFSZ ];int sense;int dma; -SCSIDevice *scsi_dev[MAX_DISKS ]; +SCSIDevice *scsi_dev[SCSI_MAX_DEVS ];SCSIDevice *current_dev;uint8_t cmdbuf[TI_BUFSZ ];int cmdlen;
@@ -122,7 +122,7 @@ s->async_len =0 ; } -if (target >=MAX_DISKS || !s->scsi_dev[target]) { +if (target >=SCSI_MAX_DEVS || !s->scsi_dev[target]) {// No such drive s->rregs[4 ] =STAT_IN ; s->rregs[5 ] =INTR_DC ;