Commit 751c6a17042b5d011013d6963c0505d671cf708e

Authored by Gerd Hoffmann
Committed by Anthony Liguori
1 parent 8a14daa5

kill drives_table

First step cleaning up the drives handling.  This one does nothing but
removing drives_table[], still it became seriously big.

drive_get_index() is gone and is replaced by drives_get() which hands
out DriveInfo pointers instead of a table index.  This needs adaption in
*tons* of places all over.

The drives are now maintained as linked list.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hw/device-hotplug.c
... ... @@ -28,22 +28,23 @@
28 28 #include "block_int.h"
29 29 #include "sysemu.h"
30 30  
31   -int add_init_drive(const char *opts)
  31 +DriveInfo *add_init_drive(const char *opts)
32 32 {
33   - int drive_opt_idx, drive_idx;
34   - int ret = -1;
  33 + int drive_opt_idx;
  34 + int fatal_error;
  35 + DriveInfo *dinfo;
35 36  
36 37 drive_opt_idx = drive_add(NULL, "%s", opts);
37 38 if (!drive_opt_idx)
38   - return ret;
  39 + return NULL;
39 40  
40   - drive_idx = drive_init(&drives_opt[drive_opt_idx], 0, current_machine);
41   - if (drive_idx == -1) {
  41 + dinfo = drive_init(&drives_opt[drive_opt_idx], 0, current_machine, &fatal_error);
  42 + if (!dinfo) {
42 43 drive_remove(drive_opt_idx);
43   - return ret;
  44 + return NULL;
44 45 }
45 46  
46   - return drive_idx;
  47 + return dinfo;
47 48 }
48 49  
49 50 void destroy_nic(dev_match_fn *match_fn, void *arg)
... ... @@ -64,11 +65,11 @@ void destroy_nic(dev_match_fn *match_fn, void *arg)
64 65  
65 66 void destroy_bdrvs(dev_match_fn *match_fn, void *arg)
66 67 {
67   - int i;
  68 + DriveInfo *dinfo;
68 69 struct BlockDriverState *bs;
69 70  
70   - for (i = 0; i <= MAX_DRIVES; i++) {
71   - bs = drives_table[i].bdrv;
  71 + TAILQ_FOREACH(dinfo, &drives, next) {
  72 + bs = dinfo->bdrv;
72 73 if (bs) {
73 74 if (bs->private && match_fn(bs->private, arg)) {
74 75 drive_uninit(bs);
... ...
hw/etraxfs.c
... ... @@ -55,6 +55,7 @@ void bareetraxfs_init (ram_addr_t ram_size,
55 55 void *etraxfs_dmac;
56 56 struct etraxfs_dma_client *eth[2] = {NULL, NULL};
57 57 int kernel_size;
  58 + DriveInfo *dinfo;
58 59 int i;
59 60 ram_addr_t phys_ram;
60 61 ram_addr_t phys_flash;
... ... @@ -79,9 +80,9 @@ void bareetraxfs_init (ram_addr_t ram_size,
79 80  
80 81  
81 82 phys_flash = qemu_ram_alloc(FLASH_SIZE);
82   - i = drive_get_index(IF_PFLASH, 0, 0);
  83 + dinfo = drive_get(IF_PFLASH, 0, 0);
83 84 pflash_cfi02_register(0x0, phys_flash,
84   - i != -1 ? drives_table[i].bdrv : NULL, (64 * 1024),
  85 + dinfo ? dinfo->bdrv : NULL, (64 * 1024),
85 86 FLASH_SIZE >> 16,
86 87 1, 2, 0x0000, 0x0000, 0x0000, 0x0000,
87 88 0x555, 0x2aa);
... ...
hw/gumstix.c
... ... @@ -47,22 +47,22 @@ static void connex_init(ram_addr_t ram_size,
47 47 const char *initrd_filename, const char *cpu_model)
48 48 {
49 49 PXA2xxState *cpu;
50   - int index;
  50 + DriveInfo *dinfo;
51 51  
52 52 uint32_t connex_rom = 0x01000000;
53 53 uint32_t connex_ram = 0x04000000;
54 54  
55 55 cpu = pxa255_init(connex_ram);
56 56  
57   - index = drive_get_index(IF_PFLASH, 0, 0);
58   - if (index == -1) {
  57 + dinfo = drive_get(IF_PFLASH, 0, 0);
  58 + if (!dinfo) {
59 59 fprintf(stderr, "A flash image must be given with the "
60 60 "'pflash' parameter\n");
61 61 exit(1);
62 62 }
63 63  
64 64 if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(connex_rom),
65   - drives_table[index].bdrv, sector_len, connex_rom / sector_len,
  65 + dinfo->bdrv, sector_len, connex_rom / sector_len,
66 66 2, 0, 0, 0, 0)) {
67 67 fprintf(stderr, "qemu: Error registering flash memory.\n");
68 68 exit(1);
... ... @@ -81,22 +81,22 @@ static void verdex_init(ram_addr_t ram_size,
81 81 const char *initrd_filename, const char *cpu_model)
82 82 {
83 83 PXA2xxState *cpu;
84   - int index;
  84 + DriveInfo *dinfo;
85 85  
86 86 uint32_t verdex_rom = 0x02000000;
87 87 uint32_t verdex_ram = 0x10000000;
88 88  
89 89 cpu = pxa270_init(verdex_ram, cpu_model ?: "pxa270-c0");
90 90  
91   - index = drive_get_index(IF_PFLASH, 0, 0);
92   - if (index == -1) {
  91 + dinfo = drive_get(IF_PFLASH, 0, 0);
  92 + if (!dinfo) {
93 93 fprintf(stderr, "A flash image must be given with the "
94 94 "'pflash' parameter\n");
95 95 exit(1);
96 96 }
97 97  
98 98 if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(verdex_rom),
99   - drives_table[index].bdrv, sector_len, verdex_rom / sector_len,
  99 + dinfo->bdrv, sector_len, verdex_rom / sector_len,
100 100 2, 0, 0, 0, 0)) {
101 101 fprintf(stderr, "qemu: Error registering flash memory.\n");
102 102 exit(1);
... ...
hw/mainstone.c
... ... @@ -77,7 +77,8 @@ static void mainstone_common_init(ram_addr_t ram_size,
77 77 target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
78 78 PXA2xxState *cpu;
79 79 qemu_irq *mst_irq;
80   - int i, index;
  80 + DriveInfo *dinfo;
  81 + int i;
81 82  
82 83 if (!cpu_model)
83 84 cpu_model = "pxa270-c5";
... ... @@ -92,8 +93,8 @@ static void mainstone_common_init(ram_addr_t ram_size,
92 93  
93 94 /* There are two 32MiB flash devices on the board */
94 95 for (i = 0; i < 2; i ++) {
95   - index = drive_get_index(IF_PFLASH, 0, i);
96   - if (index == -1) {
  96 + dinfo = drive_get(IF_PFLASH, 0, i);
  97 + if (!dinfo) {
97 98 fprintf(stderr, "Two flash images must be given with the "
98 99 "'pflash' parameter\n");
99 100 exit(1);
... ... @@ -101,7 +102,7 @@ static void mainstone_common_init(ram_addr_t ram_size,
101 102  
102 103 if (!pflash_cfi01_register(mainstone_flash_base[i],
103 104 qemu_ram_alloc(MAINSTONE_FLASH),
104   - drives_table[index].bdrv, sector_len,
  105 + dinfo->bdrv, sector_len,
105 106 MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0)) {
106 107 fprintf(stderr, "qemu: Error registering flash memory.\n");
107 108 exit(1);
... ...
hw/mips_jazz.c
... ... @@ -235,11 +235,8 @@ void mips_jazz_init (ram_addr_t ram_size,
235 235 exit(1);
236 236 }
237 237 for (n = 0; n < MAX_FD; n++) {
238   - int fd = drive_get_index(IF_FLOPPY, 0, n);
239   - if (fd != -1)
240   - fds[n] = drives_table[fd].bdrv;
241   - else
242   - fds[n] = NULL;
  238 + DriveInfo *dinfo = drive_get(IF_FLOPPY, 0, n);
  239 + fds[n] = dinfo ? dinfo->bdrv : NULL;
243 240 }
244 241 fdctrl_init(rc4030[1], 0, 1, 0x80003000, fds);
245 242  
... ...
hw/mips_malta.c
... ... @@ -773,7 +773,7 @@ void mips_malta_init (ram_addr_t ram_size,
773 773 uint8_t *eeprom_buf;
774 774 i2c_bus *smbus;
775 775 int i;
776   - int index;
  776 + DriveInfo *dinfo;
777 777 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
778 778 BlockDriverState *fd[MAX_FD];
779 779 int fl_idx = 0;
... ... @@ -827,8 +827,8 @@ void mips_malta_init (ram_addr_t ram_size,
827 827 env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
828 828 write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry);
829 829 } else {
830   - index = drive_get_index(IF_PFLASH, 0, fl_idx);
831   - if (index != -1) {
  830 + dinfo = drive_get(IF_PFLASH, 0, fl_idx);
  831 + if (dinfo) {
832 832 /* Load firmware from flash. */
833 833 bios_size = 0x400000;
834 834 fl_sectors = bios_size >> 16;
... ... @@ -836,10 +836,10 @@ void mips_malta_init (ram_addr_t ram_size,
836 836 printf("Register parallel flash %d size " TARGET_FMT_lx " at "
837 837 "offset %08lx addr %08llx '%s' %x\n",
838 838 fl_idx, bios_size, bios_offset, 0x1e000000LL,
839   - bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
  839 + bdrv_get_device_name(dinfo->bdrv), fl_sectors);
840 840 #endif
841 841 pflash_cfi01_register(0x1e000000LL, bios_offset,
842   - drives_table[index].bdrv, 65536, fl_sectors,
  842 + dinfo->bdrv, 65536, fl_sectors,
843 843 4, 0x0000, 0x0000, 0x0000, 0x0000);
844 844 fl_idx++;
845 845 } else {
... ... @@ -898,11 +898,8 @@ void mips_malta_init (ram_addr_t ram_size,
898 898 }
899 899  
900 900 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
901   - index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
902   - if (index != -1)
903   - hd[i] = drives_table[index].bdrv;
904   - else
905   - hd[i] = NULL;
  901 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
  902 + hd[i] = dinfo ? dinfo->bdrv : NULL;
906 903 }
907 904  
908 905 piix4_devfn = piix4_init(pci_bus, 80);
... ... @@ -929,11 +926,8 @@ void mips_malta_init (ram_addr_t ram_size,
929 926 if (parallel_hds[0])
930 927 parallel_init(0x378, i8259[7], parallel_hds[0]);
931 928 for(i = 0; i < MAX_FD; i++) {
932   - index = drive_get_index(IF_FLOPPY, 0, i);
933   - if (index != -1)
934   - fd[i] = drives_table[index].bdrv;
935   - else
936   - fd[i] = NULL;
  929 + dinfo = drive_get(IF_FLOPPY, 0, i);
  930 + fd[i] = dinfo ? dinfo->bdrv : NULL;
937 931 }
938 932 floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
939 933  
... ...
hw/mips_r4k.c
... ... @@ -155,8 +155,8 @@ void mips_r4k_init (ram_addr_t ram_size,
155 155 RTCState *rtc_state;
156 156 int i;
157 157 qemu_irq *i8259;
158   - int index;
159 158 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
  159 + DriveInfo *dinfo;
160 160  
161 161 /* init CPUs */
162 162 if (cpu_model == NULL) {
... ... @@ -208,11 +208,11 @@ void mips_r4k_init (ram_addr_t ram_size,
208 208 bios_offset | IO_MEM_ROM);
209 209  
210 210 load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
211   - } else if ((index = drive_get_index(IF_PFLASH, 0, 0)) > -1) {
  211 + } else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
212 212 uint32_t mips_rom = 0x00400000;
213 213 bios_offset = qemu_ram_alloc(mips_rom);
214 214 if (!pflash_cfi01_register(0x1fc00000, bios_offset,
215   - drives_table[index].bdrv, sector_len, mips_rom / sector_len,
  215 + dinfo->bdrv, sector_len, mips_rom / sector_len,
216 216 4, 0, 0, 0, 0)) {
217 217 fprintf(stderr, "qemu: Error registering flash memory.\n");
218 218 }
... ... @@ -267,11 +267,8 @@ void mips_r4k_init (ram_addr_t ram_size,
267 267 }
268 268  
269 269 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
270   - index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
271   - if (index != -1)
272   - hd[i] = drives_table[index].bdrv;
273   - else
274   - hd[i] = NULL;
  270 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
  271 + hd[i] = dinfo ? dinfo->bdrv : NULL;
275 272 }
276 273  
277 274 for(i = 0; i < MAX_IDE_BUS; i++)
... ...
hw/musicpal.c
... ... @@ -1512,8 +1512,8 @@ static void musicpal_init(ram_addr_t ram_size,
1512 1512 qemu_irq pic[32];
1513 1513 DeviceState *dev;
1514 1514 int i;
1515   - int index;
1516 1515 unsigned long flash_size;
  1516 + DriveInfo *dinfo;
1517 1517  
1518 1518 if (!cpu_model)
1519 1519 cpu_model = "arm926";
... ... @@ -1549,9 +1549,9 @@ static void musicpal_init(ram_addr_t ram_size,
1549 1549 serial_hds[1], 1);
1550 1550  
1551 1551 /* Register flash */
1552   - index = drive_get_index(IF_PFLASH, 0, 0);
1553   - if (index != -1) {
1554   - flash_size = bdrv_getlength(drives_table[index].bdrv);
  1552 + dinfo = drive_get(IF_PFLASH, 0, 0);
  1553 + if (dinfo) {
  1554 + flash_size = bdrv_getlength(dinfo->bdrv);
1555 1555 if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 &&
1556 1556 flash_size != 32*1024*1024) {
1557 1557 fprintf(stderr, "Invalid flash image size\n");
... ... @@ -1564,7 +1564,7 @@ static void musicpal_init(ram_addr_t ram_size,
1564 1564 * image is smaller than 32 MB.
1565 1565 */
1566 1566 pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, qemu_ram_alloc(flash_size),
1567   - drives_table[index].bdrv, 0x10000,
  1567 + dinfo->bdrv, 0x10000,
1568 1568 (flash_size + 0xffff) >> 16,
1569 1569 MP_FLASH_SIZE_MAX / flash_size,
1570 1570 2, 0x00BF, 0x236D, 0x0000, 0x0000,
... ...
hw/nand.c
... ... @@ -442,16 +442,16 @@ NANDFlashState *nand_init(int manf_id, int chip_id)
442 442 {
443 443 int pagesize;
444 444 NANDFlashState *s;
445   - int index;
  445 + DriveInfo *dinfo;
446 446  
447 447 if (nand_flash_ids[chip_id].size == 0) {
448 448 hw_error("%s: Unsupported NAND chip ID.\n", __FUNCTION__);
449 449 }
450 450  
451 451 s = (NANDFlashState *) qemu_mallocz(sizeof(NANDFlashState));
452   - index = drive_get_index(IF_MTD, 0, 0);
453   - if (index != -1)
454   - s->bdrv = drives_table[index].bdrv;
  452 + dinfo = drive_get(IF_MTD, 0, 0);
  453 + if (dinfo)
  454 + s->bdrv = dinfo->bdrv;
455 455 s->manf_id = manf_id;
456 456 s->chip_id = chip_id;
457 457 s->size = nand_flash_ids[s->chip_id].size << 20;
... ...
hw/omap1.c
... ... @@ -4628,7 +4628,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4628 4628 ram_addr_t imif_base, emiff_base;
4629 4629 qemu_irq *cpu_irq;
4630 4630 qemu_irq dma_irqs[6];
4631   - int sdindex;
  4631 + DriveInfo *dinfo;
4632 4632  
4633 4633 if (!core)
4634 4634 core = "ti925t";
... ... @@ -4740,12 +4740,12 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4740 4740 omap_dpll_init(&s->dpll[1], 0xfffed000, omap_findclk(s, "dpll2"));
4741 4741 omap_dpll_init(&s->dpll[2], 0xfffed100, omap_findclk(s, "dpll3"));
4742 4742  
4743   - sdindex = drive_get_index(IF_SD, 0, 0);
4744   - if (sdindex == -1) {
  4743 + dinfo = drive_get(IF_SD, 0, 0);
  4744 + if (!dinfo) {
4745 4745 fprintf(stderr, "qemu: missing SecureDigital device\n");
4746 4746 exit(1);
4747 4747 }
4748   - s->mmc = omap_mmc_init(0xfffb7800, drives_table[sdindex].bdrv,
  4748 + s->mmc = omap_mmc_init(0xfffb7800, dinfo->bdrv,
4749 4749 s->irq[1][OMAP_INT_OQN], &s->drq[OMAP_DMA_MMC_TX],
4750 4750 omap_findclk(s, "mmc_ck"));
4751 4751  
... ...
hw/omap2.c
... ... @@ -4496,7 +4496,7 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
4496 4496 qemu_irq *cpu_irq;
4497 4497 qemu_irq dma_irqs[4];
4498 4498 omap_clk gpio_clks[4];
4499   - int sdindex;
  4499 + DriveInfo *dinfo;
4500 4500 int i;
4501 4501  
4502 4502 /* Core */
... ... @@ -4645,12 +4645,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
4645 4645 s->sdrc = omap_sdrc_init(0x68009000);
4646 4646 s->gpmc = omap_gpmc_init(0x6800a000, s->irq[0][OMAP_INT_24XX_GPMC_IRQ]);
4647 4647  
4648   - sdindex = drive_get_index(IF_SD, 0, 0);
4649   - if (sdindex == -1) {
  4648 + dinfo = drive_get(IF_SD, 0, 0);
  4649 + if (!dinfo) {
4650 4650 fprintf(stderr, "qemu: missing SecureDigital device\n");
4651 4651 exit(1);
4652 4652 }
4653   - s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9), drives_table[sdindex].bdrv,
  4653 + s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9), dinfo->bdrv,
4654 4654 s->irq[0][OMAP_INT_24XX_MMC_IRQ],
4655 4655 &s->drq[OMAP24XX_DMA_MMC1_TX],
4656 4656 omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk"));
... ...
hw/omap_sx1.c
... ... @@ -127,7 +127,7 @@ static void sx1_init(ram_addr_t ram_size,
127 127 static uint32_t cs2val = 0x00001139;
128 128 static uint32_t cs3val = 0x00001139;
129 129 ram_addr_t phys_flash;
130   - int index;
  130 + DriveInfo *dinfo;
131 131 int fl_idx;
132 132 uint32_t flash_size = flash0_size;
133 133  
... ... @@ -151,9 +151,9 @@ static void sx1_init(ram_addr_t ram_size,
151 151  
152 152 fl_idx = 0;
153 153  
154   - if ((index = drive_get_index(IF_PFLASH, 0, fl_idx)) > -1) {
  154 + if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
155 155 if (!pflash_cfi01_register(OMAP_CS0_BASE, qemu_ram_alloc(flash_size),
156   - drives_table[index].bdrv, sector_size, flash_size / sector_size,
  156 + dinfo->bdrv, sector_size, flash_size / sector_size,
157 157 4, 0, 0, 0, 0)) {
158 158 fprintf(stderr, "qemu: Error registering flash memory %d.\n",
159 159 fl_idx);
... ... @@ -162,7 +162,7 @@ static void sx1_init(ram_addr_t ram_size,
162 162 }
163 163  
164 164 if ((version == 1) &&
165   - (index = drive_get_index(IF_PFLASH, 0, fl_idx)) > -1) {
  165 + (dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
166 166 cpu_register_physical_memory(OMAP_CS1_BASE, flash1_size,
167 167 (phys_flash = qemu_ram_alloc(flash1_size)) |
168 168 IO_MEM_ROM);
... ... @@ -171,7 +171,7 @@ static void sx1_init(ram_addr_t ram_size,
171 171 OMAP_CS1_SIZE - flash1_size, io);
172 172  
173 173 if (!pflash_cfi01_register(OMAP_CS1_BASE, qemu_ram_alloc(flash1_size),
174   - drives_table[index].bdrv, sector_size, flash1_size / sector_size,
  174 + dinfo->bdrv, sector_size, flash1_size / sector_size,
175 175 4, 0, 0, 0, 0)) {
176 176 fprintf(stderr, "qemu: Error registering flash memory %d.\n",
177 177 fl_idx);
... ...
hw/onenand.c
... ... @@ -618,7 +618,7 @@ static CPUWriteMemoryFunc *onenand_writefn[] = {
618 618 void *onenand_init(uint32_t id, int regshift, qemu_irq irq)
619 619 {
620 620 OneNANDState *s = (OneNANDState *) qemu_mallocz(sizeof(*s));
621   - int bdrv_index = drive_get_index(IF_MTD, 0, 0);
  621 + DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
622 622 uint32_t size = 1 << (24 + ((id >> 12) & 7));
623 623 void *ram;
624 624  
... ... @@ -632,11 +632,11 @@ void *onenand_init(uint32_t id, int regshift, qemu_irq irq)
632 632 s->density_mask = (id & (1 << 11)) ? (1 << (6 + ((id >> 12) & 7))) : 0;
633 633 s->iomemtype = cpu_register_io_memory(onenand_readfn,
634 634 onenand_writefn, s);
635   - if (bdrv_index == -1)
  635 + if (!dinfo)
636 636 s->image = memset(qemu_malloc(size + (size >> 5)),
637 637 0xff, size + (size >> 5));
638 638 else
639   - s->bdrv = drives_table[bdrv_index].bdrv;
  639 + s->bdrv = dinfo->bdrv;
640 640 s->otp = memset(qemu_malloc((64 + 2) << PAGE_SHIFT),
641 641 0xff, (64 + 2) << PAGE_SHIFT);
642 642 s->ram = qemu_ram_alloc(0xc000 << s->shift);
... ...
... ... @@ -1126,7 +1126,7 @@ static void pc_init1(ram_addr_t ram_size,
1126 1126 CPUState *env;
1127 1127 qemu_irq *cpu_irq;
1128 1128 qemu_irq *i8259;
1129   - int index;
  1129 + DriveInfo *dinfo;
1130 1130 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
1131 1131 BlockDriverState *fd[MAX_FD];
1132 1132 int using_vga = cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled;
... ... @@ -1356,11 +1356,8 @@ static void pc_init1(ram_addr_t ram_size,
1356 1356 }
1357 1357  
1358 1358 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
1359   - index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
1360   - if (index != -1)
1361   - hd[i] = drives_table[index].bdrv;
1362   - else
1363   - hd[i] = NULL;
  1359 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
  1360 + hd[i] = dinfo ? dinfo->bdrv : NULL;
1364 1361 }
1365 1362  
1366 1363 if (pci_enabled) {
... ... @@ -1379,11 +1376,8 @@ static void pc_init1(ram_addr_t ram_size,
1379 1376 #endif
1380 1377  
1381 1378 for(i = 0; i < MAX_FD; i++) {
1382   - index = drive_get_index(IF_FLOPPY, 0, i);
1383   - if (index != -1)
1384   - fd[i] = drives_table[index].bdrv;
1385   - else
1386   - fd[i] = NULL;
  1379 + dinfo = drive_get(IF_FLOPPY, 0, i);
  1380 + fd[i] = dinfo ? dinfo->bdrv : NULL;
1387 1381 }
1388 1382 floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
1389 1383  
... ... @@ -1437,12 +1431,11 @@ static void pc_init1(ram_addr_t ram_size,
1437 1431  
1438 1432 /* Add virtio block devices */
1439 1433 if (pci_enabled) {
1440   - int index;
1441 1434 int unit_id = 0;
1442 1435  
1443   - while ((index = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
  1436 + while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
1444 1437 pci_dev = pci_create(virtio_blk_name,
1445   - drives_table[index].devaddr);
  1438 + dinfo->devaddr);
1446 1439 qdev_init(&pci_dev->qdev);
1447 1440 unit_id++;
1448 1441 }
... ...
hw/pci-hotplug.c
... ... @@ -52,9 +52,10 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
52 52 {
53 53 int dom, pci_bus;
54 54 unsigned slot;
55   - int drive_idx, type, bus;
  55 + int type, bus;
56 56 int success = 0;
57 57 PCIDevice *dev;
  58 + DriveInfo *dinfo;
58 59  
59 60 if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) {
60 61 return;
... ... @@ -66,21 +67,21 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
66 67 return;
67 68 }
68 69  
69   - drive_idx = add_init_drive(opts);
70   - if (drive_idx < 0)
  70 + dinfo = add_init_drive(opts);
  71 + if (!dinfo)
71 72 return;
72   - if (drives_table[drive_idx].devaddr) {
  73 + if (dinfo->devaddr) {
73 74 monitor_printf(mon, "Parameter addr not supported\n");
74 75 return;
75 76 }
76   - type = drives_table[drive_idx].type;
  77 + type = dinfo->type;
77 78 bus = drive_get_max_bus (type);
78 79  
79 80 switch (type) {
80 81 case IF_SCSI:
81 82 success = 1;
82   - lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
83   - drives_table[drive_idx].unit);
  83 + lsi_scsi_attach(&dev->qdev, dinfo->bdrv,
  84 + dinfo->unit);
84 85 break;
85 86 default:
86 87 monitor_printf(mon, "Can't hot-add drive to type %d\n", type);
... ... @@ -88,8 +89,8 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
88 89  
89 90 if (success)
90 91 monitor_printf(mon, "OK bus %d, unit %d\n",
91   - drives_table[drive_idx].bus,
92   - drives_table[drive_idx].unit);
  92 + dinfo->bus,
  93 + dinfo->unit);
93 94 return;
94 95 }
95 96  
... ... @@ -98,7 +99,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
98 99 const char *opts)
99 100 {
100 101 PCIDevice *dev;
101   - int type = -1, drive_idx = -1;
  102 + DriveInfo *dinfo;
  103 + int type = -1;
102 104 char buf[128];
103 105  
104 106 if (get_param_value(buf, sizeof(buf), "if", opts)) {
... ... @@ -116,10 +118,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
116 118 }
117 119  
118 120 if (get_param_value(buf, sizeof(buf), "file", opts)) {
119   - drive_idx = add_init_drive(opts);
120   - if (drive_idx < 0)
  121 + dinfo = add_init_drive(opts);
  122 + if (!dinfo)
121 123 return NULL;
122   - if (drives_table[drive_idx].devaddr) {
  124 + if (dinfo->devaddr) {
123 125 monitor_printf(mon, "Parameter addr not supported\n");
124 126 return NULL;
125 127 }
... ...
hw/petalogix_s3adsp1800_mmu.c
... ... @@ -106,6 +106,7 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size,
106 106 DeviceState *dev;
107 107 CPUState *env;
108 108 int kernel_size;
  109 + DriveInfo *dinfo;
109 110 int i;
110 111 target_phys_addr_t ddr_base = 0x90000000;
111 112 ram_addr_t phys_lmb_bram;
... ... @@ -131,9 +132,9 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size,
131 132 cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM);
132 133  
133 134 phys_flash = qemu_ram_alloc(FLASH_SIZE);
134   - i = drive_get_index(IF_PFLASH, 0, 0);
  135 + dinfo = drive_get(IF_PFLASH, 0, 0);
135 136 pflash_cfi02_register(0xa0000000, phys_flash,
136   - i != -1 ? drives_table[i].bdrv : NULL, (64 * 1024),
  137 + dinfo ? dinfo->bdrv : NULL, (64 * 1024),
137 138 FLASH_SIZE >> 16,
138 139 1, 1, 0x0000, 0x0000, 0x0000, 0x0000,
139 140 0x555, 0x2aa);
... ...
hw/ppc405_boards.c
... ... @@ -188,7 +188,7 @@ static void ref405ep_init (ram_addr_t ram_size,
188 188 int linux_boot;
189 189 int fl_idx, fl_sectors, len;
190 190 int ppc_boot_device = boot_device[0];
191   - int index;
  191 + DriveInfo *dinfo;
192 192  
193 193 /* XXX: fix this */
194 194 ram_bases[0] = qemu_ram_alloc(0x08000000);
... ... @@ -215,19 +215,19 @@ static void ref405ep_init (ram_addr_t ram_size,
215 215 #endif
216 216 fl_idx = 0;
217 217 #ifdef USE_FLASH_BIOS
218   - index = drive_get_index(IF_PFLASH, 0, fl_idx);
219   - if (index != -1) {
220   - bios_size = bdrv_getlength(drives_table[index].bdrv);
  218 + dinfo = drive_get(IF_PFLASH, 0, fl_idx);
  219 + if (dinfo) {
  220 + bios_size = bdrv_getlength(dinfo->bdrv);
221 221 bios_offset = qemu_ram_alloc(bios_size);
222 222 fl_sectors = (bios_size + 65535) >> 16;
223 223 #ifdef DEBUG_BOARD_INIT
224 224 printf("Register parallel flash %d size " ADDRX " at offset %08lx "
225 225 " addr " ADDRX " '%s' %d\n",
226 226 fl_idx, bios_size, bios_offset, -bios_size,
227   - bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
  227 + bdrv_get_device_name(dinfo->bdrv), fl_sectors);
228 228 #endif
229 229 pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
230   - drives_table[index].bdrv, 65536, fl_sectors, 1,
  230 + dinfo->bdrv, 65536, fl_sectors, 1,
231 231 2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
232 232 fl_idx++;
233 233 } else
... ... @@ -509,7 +509,7 @@ static void taihu_405ep_init(ram_addr_t ram_size,
509 509 int linux_boot;
510 510 int fl_idx, fl_sectors;
511 511 int ppc_boot_device = boot_device[0];
512   - int index;
  512 + DriveInfo *dinfo;
513 513  
514 514 /* RAM is soldered to the board so the size cannot be changed */
515 515 ram_bases[0] = qemu_ram_alloc(0x04000000);
... ... @@ -528,9 +528,9 @@ static void taihu_405ep_init(ram_addr_t ram_size,
528 528 #endif
529 529 fl_idx = 0;
530 530 #if defined(USE_FLASH_BIOS)
531   - index = drive_get_index(IF_PFLASH, 0, fl_idx);
532   - if (index != -1) {
533   - bios_size = bdrv_getlength(drives_table[index].bdrv);
  531 + dinfo = drive_get(IF_PFLASH, 0, fl_idx);
  532 + if (dinfo) {
  533 + bios_size = bdrv_getlength(dinfo->bdrv);
534 534 /* XXX: should check that size is 2MB */
535 535 // bios_size = 2 * 1024 * 1024;
536 536 fl_sectors = (bios_size + 65535) >> 16;
... ... @@ -539,10 +539,10 @@ static void taihu_405ep_init(ram_addr_t ram_size,
539 539 printf("Register parallel flash %d size " ADDRX " at offset %08lx "
540 540 " addr " ADDRX " '%s' %d\n",
541 541 fl_idx, bios_size, bios_offset, -bios_size,
542   - bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
  542 + bdrv_get_device_name(dinfo->bdrv), fl_sectors);
543 543 #endif
544 544 pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
545   - drives_table[index].bdrv, 65536, fl_sectors, 1,
  545 + dinfo->bdrv, 65536, fl_sectors, 1,
546 546 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
547 547 fl_idx++;
548 548 } else
... ... @@ -570,9 +570,9 @@ static void taihu_405ep_init(ram_addr_t ram_size,
570 570 bios_size, bios_offset | IO_MEM_ROM);
571 571 }
572 572 /* Register Linux flash */
573   - index = drive_get_index(IF_PFLASH, 0, fl_idx);
574   - if (index != -1) {
575   - bios_size = bdrv_getlength(drives_table[index].bdrv);
  573 + dinfo = drive_get(IF_PFLASH, 0, fl_idx);
  574 + if (dinfo) {
  575 + bios_size = bdrv_getlength(dinfo->bdrv);
576 576 /* XXX: should check that size is 32MB */
577 577 bios_size = 32 * 1024 * 1024;
578 578 fl_sectors = (bios_size + 65535) >> 16;
... ... @@ -580,11 +580,11 @@ static void taihu_405ep_init(ram_addr_t ram_size,
580 580 printf("Register parallel flash %d size " ADDRX " at offset %08lx "
581 581 " addr " ADDRX " '%s'\n",
582 582 fl_idx, bios_size, bios_offset, (target_ulong)0xfc000000,
583   - bdrv_get_device_name(drives_table[index].bdrv));
  583 + bdrv_get_device_name(dinfo->bdrv));
584 584 #endif
585 585 bios_offset = qemu_ram_alloc(bios_size);
586 586 pflash_cfi02_register(0xfc000000, bios_offset,
587   - drives_table[index].bdrv, 65536, fl_sectors, 1,
  587 + dinfo->bdrv, 65536, fl_sectors, 1,
588 588 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
589 589 fl_idx++;
590 590 }
... ...
hw/ppc440_bamboo.c
... ... @@ -102,6 +102,7 @@ static void bamboo_init(ram_addr_t ram_size,
102 102 target_ulong dt_base = 0;
103 103 void *fdt;
104 104 int i;
  105 + DriveInfo *dinfo;
105 106  
106 107 /* Setup CPU. */
107 108 env = ppc440ep_init(&ram_size, &pcibus, pci_irq_nrs, 1, cpu_model);
... ... @@ -110,8 +111,8 @@ static void bamboo_init(ram_addr_t ram_size,
110 111 int unit_id = 0;
111 112  
112 113 /* Add virtio block devices. */
113   - while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
114   - pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
  114 + while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
  115 + pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
115 116 qdev_init(&pci_dev->qdev);
116 117 unit_id++;
117 118 }
... ...
hw/ppc_newworld.c
... ... @@ -106,7 +106,7 @@ static void ppc_core99_init (ram_addr_t ram_size,
106 106 qemu_irq *dummy_irq;
107 107 int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index;
108 108 int ppc_boot_device;
109   - int index;
  109 + DriveInfo *dinfo;
110 110 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
111 111 void *fw_cfg;
112 112 void *dbdma;
... ... @@ -315,11 +315,8 @@ static void ppc_core99_init (ram_addr_t ram_size,
315 315 exit(1);
316 316 }
317 317 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
318   - index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
319   - if (index != -1)
320   - hd[i] = drives_table[index].bdrv;
321   - else
322   - hd[i] = NULL;
  318 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
  319 + hd[i] = dinfo ? dinfo->bdrv : NULL;
323 320 }
324 321 dbdma = DBDMA_init(&dbdma_mem_index);
325 322 pci_cmd646_ide_init(pci_bus, hd, 0);
... ...
hw/ppc_oldworld.c
... ... @@ -135,7 +135,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
135 135 int escc_mem_index, ide_mem_index[2];
136 136 uint16_t ppc_boot_device;
137 137 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
138   - int index;
  138 + DriveInfo *dinfo;
139 139 void *fw_cfg;
140 140 void *dbdma;
141 141 uint8_t *vga_bios_ptr;
... ... @@ -328,31 +328,19 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
328 328 }
329 329  
330 330 /* First IDE channel is a MAC IDE on the MacIO bus */
331   - index = drive_get_index(IF_IDE, 0, 0);
332   - if (index == -1)
333   - hd[0] = NULL;
334   - else
335   - hd[0] = drives_table[index].bdrv;
336   - index = drive_get_index(IF_IDE, 0, 1);
337   - if (index == -1)
338   - hd[1] = NULL;
339   - else
340   - hd[1] = drives_table[index].bdrv;
  331 + dinfo = drive_get(IF_IDE, 0, 0);
  332 + hd[0] = dinfo ? dinfo->bdrv : NULL;
  333 + dinfo = drive_get(IF_IDE, 0, 1);
  334 + hd[1] = dinfo ? dinfo->bdrv : NULL;
341 335 dbdma = DBDMA_init(&dbdma_mem_index);
342 336 ide_mem_index[0] = -1;
343 337 ide_mem_index[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]);
344 338  
345 339 /* Second IDE channel is a CMD646 on the PCI bus */
346   - index = drive_get_index(IF_IDE, 1, 0);
347   - if (index == -1)
348   - hd[0] = NULL;
349   - else
350   - hd[0] = drives_table[index].bdrv;
351   - index = drive_get_index(IF_IDE, 1, 1);
352   - if (index == -1)
353   - hd[1] = NULL;
354   - else
355   - hd[1] = drives_table[index].bdrv;
  340 + dinfo = drive_get(IF_IDE, 1, 0);
  341 + hd[0] = dinfo ? dinfo->bdrv : NULL;
  342 + dinfo = drive_get(IF_IDE, 1, 1);
  343 + hd[1] = dinfo ? dinfo->bdrv : NULL;
356 344 hd[3] = hd[2] = NULL;
357 345 pci_cmd646_ide_init(pci_bus, hd, 0);
358 346  
... ...
hw/ppc_prep.c
... ... @@ -550,7 +550,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
550 550 PCIBus *pci_bus;
551 551 qemu_irq *i8259;
552 552 int ppc_boot_device;
553   - int index;
  553 + DriveInfo *dinfo;
554 554 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
555 555 BlockDriverState *fd[MAX_FD];
556 556  
... ... @@ -691,11 +691,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
691 691 }
692 692  
693 693 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
694   - index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
695   - if (index != -1)
696   - hd[i] = drives_table[index].bdrv;
697   - else
698   - hd[i] = NULL;
  694 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
  695 + hd[i] = dinfo ? dinfo->bdrv : NULL;
699 696 }
700 697  
701 698 for(i = 0; i < MAX_IDE_BUS; i++) {
... ... @@ -708,11 +705,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
708 705 // SB16_init();
709 706  
710 707 for(i = 0; i < MAX_FD; i++) {
711   - index = drive_get_index(IF_FLOPPY, 0, i);
712   - if (index != -1)
713   - fd[i] = drives_table[index].bdrv;
714   - else
715   - fd[i] = NULL;
  708 + dinfo = drive_get(IF_FLOPPY, 0, i);
  709 + fd[i] = dinfo ? dinfo->bdrv : NULL;
716 710 }
717 711 fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
718 712  
... ...
hw/ppce500_mpc8544ds.c
... ... @@ -172,6 +172,7 @@ static void mpc8544ds_init(ram_addr_t ram_size,
172 172 unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
173 173 qemu_irq *irqs, *mpic, *pci_irqs;
174 174 SerialState * serial[2];
  175 + DriveInfo *dinfo;
175 176  
176 177 /* Setup CPU */
177 178 env = cpu_ppc_init("e500v2_v30");
... ... @@ -219,8 +220,8 @@ static void mpc8544ds_init(ram_addr_t ram_size,
219 220 int unit_id = 0;
220 221  
221 222 /* Add virtio block devices. */
222   - while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
223   - pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
  223 + while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
  224 + pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
224 225 qdev_init(&pci_dev->qdev);
225 226 unit_id++;
226 227 }
... ...
hw/pxa2xx.c
... ... @@ -2034,7 +2034,7 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
2034 2034 {
2035 2035 PXA2xxState *s;
2036 2036 int iomemtype, i;
2037   - int index;
  2037 + DriveInfo *dinfo;
2038 2038 s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState));
2039 2039  
2040 2040 if (revision && strncmp(revision, "pxa27", 5)) {
... ... @@ -2066,12 +2066,12 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
2066 2066  
2067 2067 s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121);
2068 2068  
2069   - index = drive_get_index(IF_SD, 0, 0);
2070   - if (index == -1) {
  2069 + dinfo = drive_get(IF_SD, 0, 0);
  2070 + if (!dinfo) {
2071 2071 fprintf(stderr, "qemu: missing SecureDigital device\n");
2072 2072 exit(1);
2073 2073 }
2074   - s->mmc = pxa2xx_mmci_init(0x41100000, drives_table[index].bdrv,
  2074 + s->mmc = pxa2xx_mmci_init(0x41100000, dinfo->bdrv,
2075 2075 s->pic[PXA2XX_PIC_MMC], s->dma);
2076 2076  
2077 2077 for (i = 0; pxa270_serial[i].io_base; i ++)
... ... @@ -2153,7 +2153,7 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
2153 2153 {
2154 2154 PXA2xxState *s;
2155 2155 int iomemtype, i;
2156   - int index;
  2156 + DriveInfo *dinfo;
2157 2157  
2158 2158 s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState));
2159 2159  
... ... @@ -2178,12 +2178,12 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
2178 2178  
2179 2179 s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85);
2180 2180  
2181   - index = drive_get_index(IF_SD, 0, 0);
2182   - if (index == -1) {
  2181 + dinfo = drive_get(IF_SD, 0, 0);
  2182 + if (!dinfo) {
2183 2183 fprintf(stderr, "qemu: missing SecureDigital device\n");
2184 2184 exit(1);
2185 2185 }
2186   - s->mmc = pxa2xx_mmci_init(0x41100000, drives_table[index].bdrv,
  2186 + s->mmc = pxa2xx_mmci_init(0x41100000, dinfo->bdrv,
2187 2187 s->pic[PXA2XX_PIC_MMC], s->dma);
2188 2188  
2189 2189 for (i = 0; pxa255_serial[i].io_base; i ++)
... ...
hw/qdev.c
... ... @@ -267,13 +267,10 @@ static int next_block_unit[IF_COUNT];
267 267 BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type)
268 268 {
269 269 int unit = next_block_unit[type]++;
270   - int index;
  270 + DriveInfo *dinfo;
271 271  
272   - index = drive_get_index(type, 0, unit);
273   - if (index == -1) {
274   - return NULL;
275   - }
276   - return drives_table[index].bdrv;
  272 + dinfo = drive_get(type, 0, unit);
  273 + return dinfo ? dinfo->bdrv : NULL;
277 274 }
278 275  
279 276 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
... ... @@ -296,14 +293,14 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach)
296 293 {
297 294 int bus = next_scsi_bus++;
298 295 int unit;
299   - int index;
  296 + DriveInfo *dinfo;
300 297  
301 298 for (unit = 0; unit < MAX_SCSI_DEVS; unit++) {
302   - index = drive_get_index(IF_SCSI, bus, unit);
303   - if (index == -1) {
  299 + dinfo = drive_get(IF_SCSI, bus, unit);
  300 + if (!dinfo) {
304 301 continue;
305 302 }
306   - attach(host, drives_table[index].bdrv, unit);
  303 + attach(host, dinfo->bdrv, unit);
307 304 }
308 305 }
309 306  
... ...
hw/r2d.c
... ... @@ -203,6 +203,7 @@ static void r2d_init(ram_addr_t ram_size,
203 203 ram_addr_t sdram_addr;
204 204 qemu_irq *irq;
205 205 PCIBus *pci;
  206 + DriveInfo *dinfo;
206 207 int i;
207 208  
208 209 if (!cpu_model)
... ... @@ -225,9 +226,9 @@ static void r2d_init(ram_addr_t ram_size,
225 226 sm501_init(0x10000000, SM501_VRAM_SIZE, irq[SM501], serial_hds[2]);
226 227  
227 228 /* onboard CF (True IDE mode, Master only). */
228   - if ((i = drive_get_index(IF_IDE, 0, 0)) != -1)
  229 + if ((dinfo = drive_get(IF_IDE, 0, 0)) != NULL)
229 230 mmio_ide_init(0x14001000, 0x1400080c, irq[CF_IDE], 1,
230   - drives_table[i].bdrv, NULL);
  231 + dinfo->bdrv, NULL);
231 232  
232 233 /* NIC: rtl8139 on-board, and 2 slots. */
233 234 for (i = 0; i < nb_nics; i++)
... ...
hw/spitz.c
... ... @@ -744,13 +744,13 @@ static void spitz_ssp_attach(PXA2xxState *cpu)
744 744 static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
745 745 {
746 746 PCMCIACardState *md;
747   - int index;
748 747 BlockDriverState *bs;
  748 + DriveInfo *dinfo;
749 749  
750   - index = drive_get_index(IF_IDE, 0, 0);
751   - if (index == -1)
  750 + dinfo = drive_get(IF_IDE, 0, 0);
  751 + if (!dinfo)
752 752 return;
753   - bs = drives_table[index].bdrv;
  753 + bs = dinfo->bdrv;
754 754 if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
755 755 md = dscm1xxxx_init(bs);
756 756 pxa2xx_pcmcia_attach(cpu->pcmcia[slot], md);
... ...
hw/sun4m.c
... ... @@ -581,9 +581,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
581 581 qemu_irq *cpu_halt;
582 582 unsigned long kernel_size;
583 583 BlockDriverState *fd[MAX_FD];
584   - int drive_index;
585 584 void *fw_cfg;
586 585 DeviceState *dev;
  586 + DriveInfo *dinfo;
587 587  
588 588 /* init CPUs */
589 589 if (!cpu_model)
... ... @@ -662,9 +662,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
662 662 if (hwdef->fd_base) {
663 663 /* there is zero or one floppy drive */
664 664 memset(fd, 0, sizeof(fd));
665   - drive_index = drive_get_index(IF_FLOPPY, 0, 0);
666   - if (drive_index != -1)
667   - fd[0] = drives_table[drive_index].bdrv;
  665 + dinfo = drive_get(IF_FLOPPY, 0, 0);
  666 + if (dinfo)
  667 + fd[0] = dinfo->bdrv;
668 668  
669 669 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
670 670 &fdc_tc);
... ... @@ -1507,10 +1507,10 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1507 1507 qemu_irq fdc_tc;
1508 1508 unsigned long kernel_size;
1509 1509 BlockDriverState *fd[MAX_FD];
1510   - int drive_index;
1511 1510 void *fw_cfg;
1512 1511 DeviceState *dev;
1513 1512 unsigned int i;
  1513 + DriveInfo *dinfo;
1514 1514  
1515 1515 /* init CPU */
1516 1516 if (!cpu_model)
... ... @@ -1565,9 +1565,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1565 1565 if (hwdef->fd_base != (target_phys_addr_t)-1) {
1566 1566 /* there is zero or one floppy drive */
1567 1567 memset(fd, 0, sizeof(fd));
1568   - drive_index = drive_get_index(IF_FLOPPY, 0, 0);
1569   - if (drive_index != -1)
1570   - fd[0] = drives_table[drive_index].bdrv;
  1568 + dinfo = drive_get(IF_FLOPPY, 0, 0);
  1569 + if (dinfo)
  1570 + fd[0] = dinfo->bdrv;
1571 1571  
1572 1572 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
1573 1573 &fdc_tc);
... ...
hw/sun4u.c
... ... @@ -557,10 +557,10 @@ static void sun4uv_init(ram_addr_t RAM_size,
557 557 long initrd_size, kernel_size;
558 558 PCIBus *pci_bus, *pci_bus2, *pci_bus3;
559 559 qemu_irq *irq;
560   - int drive_index;
561 560 BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
562 561 BlockDriverState *fd[MAX_FD];
563 562 void *fw_cfg;
  563 + DriveInfo *dinfo;
564 564  
565 565 /* init CPUs */
566 566 env = cpu_devinit(cpu_model, hwdef);
... ... @@ -608,12 +608,9 @@ static void sun4uv_init(ram_addr_t RAM_size,
608 608 exit(1);
609 609 }
610 610 for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
611   - drive_index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS,
612   - i % MAX_IDE_DEVS);
613   - if (drive_index != -1)
614   - hd[i] = drives_table[drive_index].bdrv;
615   - else
616   - hd[i] = NULL;
  611 + dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS,
  612 + i % MAX_IDE_DEVS);
  613 + hd[i] = dinfo ? dinfo->bdrv : NULL;
617 614 }
618 615  
619 616 pci_cmd646_ide_init(pci_bus, hd, 1);
... ... @@ -621,11 +618,8 @@ static void sun4uv_init(ram_addr_t RAM_size,
621 618 /* FIXME: wire up interrupts. */
622 619 i8042_init(NULL/*1*/, NULL/*12*/, 0x60);
623 620 for(i = 0; i < MAX_FD; i++) {
624   - drive_index = drive_get_index(IF_FLOPPY, 0, i);
625   - if (drive_index != -1)
626   - fd[i] = drives_table[drive_index].bdrv;
627   - else
628   - fd[i] = NULL;
  621 + dinfo = drive_get(IF_FLOPPY, 0, i);
  622 + fd[i] = dinfo ? dinfo->bdrv : NULL;
629 623 }
630 624 floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd);
631 625 nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59);
... ...
hw/tosa.c
... ... @@ -49,13 +49,13 @@
49 49 static void tosa_microdrive_attach(PXA2xxState *cpu)
50 50 {
51 51 PCMCIACardState *md;
52   - int index;
53 52 BlockDriverState *bs;
  53 + DriveInfo *dinfo;
54 54  
55   - index = drive_get_index(IF_IDE, 0, 0);
56   - if (index == -1)
  55 + dinfo = drive_get(IF_IDE, 0, 0);
  56 + if (!dinfo)
57 57 return;
58   - bs = drives_table[index].bdrv;
  58 + bs = dinfo->bdrv;
59 59 if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
60 60 md = dscm1xxxx_init(bs);
61 61 pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
... ...
hw/xen_disk.c
... ... @@ -107,7 +107,7 @@ struct XenBlkDev {
107 107 int requests_finished;
108 108  
109 109 /* qemu block driver */
110   - int index;
  110 + DriveInfo *dinfo;
111 111 BlockDriverState *bs;
112 112 QEMUBH *bh;
113 113 };
... ... @@ -575,7 +575,7 @@ static void blk_alloc(struct XenDevice *xendev)
575 575 static int blk_init(struct XenDevice *xendev)
576 576 {
577 577 struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
578   - int mode, qflags, have_barriers, info = 0;
  578 + int index, mode, qflags, have_barriers, info = 0;
579 579 char *h;
580 580  
581 581 /* read xenstore entries */
... ... @@ -622,9 +622,9 @@ static int blk_init(struct XenDevice *xendev)
622 622 info |= VDISK_CDROM;
623 623  
624 624 /* init qemu block driver */
625   - blkdev->index = (blkdev->xendev.dev - 202 * 256) / 16;
626   - blkdev->index = drive_get_index(IF_XEN, 0, blkdev->index);
627   - if (blkdev->index == -1) {
  625 + index = (blkdev->xendev.dev - 202 * 256) / 16;
  626 + blkdev->dinfo = drive_get(IF_XEN, 0, index);
  627 + if (!blkdev->dinfo) {
628 628 /* setup via xenbus -> create new block driver instance */
629 629 xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
630 630 blkdev->bs = bdrv_new(blkdev->dev);
... ... @@ -640,7 +640,7 @@ static int blk_init(struct XenDevice *xendev)
640 640 } else {
641 641 /* setup via qemu cmdline -> already setup for us */
642 642 xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n");
643   - blkdev->bs = drives_table[blkdev->index].bdrv;
  643 + blkdev->bs = blkdev->dinfo->bdrv;
644 644 }
645 645 blkdev->file_blk = BLOCK_SIZE;
646 646 blkdev->file_size = bdrv_getlength(blkdev->bs);
... ... @@ -729,7 +729,7 @@ static void blk_disconnect(struct XenDevice *xendev)
729 729 struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
730 730  
731 731 if (blkdev->bs) {
732   - if (blkdev->index == -1) {
  732 + if (!blkdev->dinfo) {
733 733 /* close/delete only if we created it ourself */
734 734 bdrv_close(blkdev->bs);
735 735 bdrv_delete(blkdev->bs);
... ...
hw/xen_machine_pv.c
... ... @@ -40,7 +40,8 @@ static void xen_init_pv(ram_addr_t ram_size,
40 40 const char *cpu_model)
41 41 {
42 42 CPUState *env;
43   - int i, index;
  43 + DriveInfo *dinfo;
  44 + int i;
44 45  
45 46 /* Initialize a dummy CPU */
46 47 if (cpu_model == NULL) {
... ... @@ -90,10 +91,10 @@ static void xen_init_pv(ram_addr_t ram_size,
90 91  
91 92 /* configure disks */
92 93 for (i = 0; i < 16; i++) {
93   - index = drive_get_index(IF_XEN, 0, i);
94   - if (index == -1)
  94 + dinfo = drive_get(IF_XEN, 0, i);
  95 + if (!dinfo)
95 96 continue;
96   - xen_config_dev_blk(drives_table + index);
  97 + xen_config_dev_blk(dinfo);
97 98 }
98 99  
99 100 /* configure nics */
... ...
monitor.c
... ... @@ -253,13 +253,15 @@ static void help_cmd(Monitor *mon, const char *name)
253 253  
254 254 static void do_commit(Monitor *mon, const char *device)
255 255 {
256   - int i, all_devices;
  256 + int all_devices;
  257 + DriveInfo *dinfo;
257 258  
258 259 all_devices = !strcmp(device, "all");
259   - for (i = 0; i < nb_drives; i++) {
260   - if (all_devices ||
261   - !strcmp(bdrv_get_device_name(drives_table[i].bdrv), device))
262   - bdrv_commit(drives_table[i].bdrv);
  260 + TAILQ_FOREACH(dinfo, &drives, next) {
  261 + if (!all_devices)
  262 + if (!strcmp(bdrv_get_device_name(dinfo->bdrv), device))
  263 + continue;
  264 + bdrv_commit(dinfo->bdrv);
263 265 }
264 266 }
265 267  
... ...
qemu-char.c
... ... @@ -350,9 +350,9 @@ static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
350 350 }
351 351 case 's':
352 352 {
353   - int i;
354   - for (i = 0; i < nb_drives; i++) {
355   - bdrv_commit(drives_table[i].bdrv);
  353 + DriveInfo *dinfo;
  354 + TAILQ_FOREACH(dinfo, &drives, next) {
  355 + bdrv_commit(dinfo->bdrv);
356 356 }
357 357 }
358 358 break;
... ...
savevm.c
... ... @@ -1011,12 +1011,12 @@ static int bdrv_has_snapshot(BlockDriverState *bs)
1011 1011 static BlockDriverState *get_bs_snapshots(void)
1012 1012 {
1013 1013 BlockDriverState *bs;
1014   - int i;
  1014 + DriveInfo *dinfo;
1015 1015  
1016 1016 if (bs_snapshots)
1017 1017 return bs_snapshots;
1018   - for(i = 0; i <= nb_drives; i++) {
1019   - bs = drives_table[i].bdrv;
  1018 + TAILQ_FOREACH(dinfo, &drives, next) {
  1019 + bs = dinfo->bdrv;
1020 1020 if (bdrv_can_snapshot(bs))
1021 1021 goto ok;
1022 1022 }
... ... @@ -1050,9 +1050,10 @@ static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
1050 1050  
1051 1051 void do_savevm(Monitor *mon, const char *name)
1052 1052 {
  1053 + DriveInfo *dinfo;
1053 1054 BlockDriverState *bs, *bs1;
1054 1055 QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
1055   - int must_delete, ret, i;
  1056 + int must_delete, ret;
1056 1057 QEMUFile *f;
1057 1058 int saved_vm_running;
1058 1059 uint32_t vm_state_size;
... ... @@ -1118,8 +1119,8 @@ void do_savevm(Monitor *mon, const char *name)
1118 1119  
1119 1120 /* create the snapshots */
1120 1121  
1121   - for(i = 0; i < nb_drives; i++) {
1122   - bs1 = drives_table[i].bdrv;
  1122 + TAILQ_FOREACH(dinfo, &drives, next) {
  1123 + bs1 = dinfo->bdrv;
1123 1124 if (bdrv_has_snapshot(bs1)) {
1124 1125 if (must_delete) {
1125 1126 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
... ... @@ -1146,10 +1147,11 @@ void do_savevm(Monitor *mon, const char *name)
1146 1147  
1147 1148 void do_loadvm(Monitor *mon, const char *name)
1148 1149 {
  1150 + DriveInfo *dinfo;
1149 1151 BlockDriverState *bs, *bs1;
1150 1152 QEMUSnapshotInfo sn;
1151 1153 QEMUFile *f;
1152   - int i, ret;
  1154 + int ret;
1153 1155 int saved_vm_running;
1154 1156  
1155 1157 bs = get_bs_snapshots();
... ... @@ -1164,8 +1166,8 @@ void do_loadvm(Monitor *mon, const char *name)
1164 1166 saved_vm_running = vm_running;
1165 1167 vm_stop(0);
1166 1168  
1167   - for(i = 0; i <= nb_drives; i++) {
1168   - bs1 = drives_table[i].bdrv;
  1169 + TAILQ_FOREACH(dinfo, &drives, next) {
  1170 + bs1 = dinfo->bdrv;
1169 1171 if (bdrv_has_snapshot(bs1)) {
1170 1172 ret = bdrv_snapshot_goto(bs1, name);
1171 1173 if (ret < 0) {
... ... @@ -1217,8 +1219,9 @@ void do_loadvm(Monitor *mon, const char *name)
1217 1219  
1218 1220 void do_delvm(Monitor *mon, const char *name)
1219 1221 {
  1222 + DriveInfo *dinfo;
1220 1223 BlockDriverState *bs, *bs1;
1221   - int i, ret;
  1224 + int ret;
1222 1225  
1223 1226 bs = get_bs_snapshots();
1224 1227 if (!bs) {
... ... @@ -1226,8 +1229,8 @@ void do_delvm(Monitor *mon, const char *name)
1226 1229 return;
1227 1230 }
1228 1231  
1229   - for(i = 0; i <= nb_drives; i++) {
1230   - bs1 = drives_table[i].bdrv;
  1232 + TAILQ_FOREACH(dinfo, &drives, next) {
  1233 + bs1 = dinfo->bdrv;
1231 1234 if (bdrv_has_snapshot(bs1)) {
1232 1235 ret = bdrv_snapshot_delete(bs1, name);
1233 1236 if (ret < 0) {
... ... @@ -1245,6 +1248,7 @@ void do_delvm(Monitor *mon, const char *name)
1245 1248  
1246 1249 void do_info_snapshots(Monitor *mon)
1247 1250 {
  1251 + DriveInfo *dinfo;
1248 1252 BlockDriverState *bs, *bs1;
1249 1253 QEMUSnapshotInfo *sn_tab, *sn;
1250 1254 int nb_sns, i;
... ... @@ -1256,8 +1260,8 @@ void do_info_snapshots(Monitor *mon)
1256 1260 return;
1257 1261 }
1258 1262 monitor_printf(mon, "Snapshot devices:");
1259   - for(i = 0; i <= nb_drives; i++) {
1260   - bs1 = drives_table[i].bdrv;
  1263 + TAILQ_FOREACH(dinfo, &drives, next) {
  1264 + bs1 = dinfo->bdrv;
1261 1265 if (bdrv_has_snapshot(bs1)) {
1262 1266 if (bs == bs1)
1263 1267 monitor_printf(mon, " %s", bdrv_get_device_name(bs1));
... ...
sysemu.h
... ... @@ -3,6 +3,7 @@
3 3 /* Misc. things related to the system emulator. */
4 4  
5 5 #include "qemu-common.h"
  6 +#include "sys-queue.h"
6 7  
7 8 #ifdef _WIN32
8 9 #include <windows.h>
... ... @@ -164,20 +165,19 @@ typedef struct DriveInfo {
164 165 BlockInterfaceType type;
165 166 int bus;
166 167 int unit;
167   - int used;
168 168 int drive_opt_idx;
169 169 BlockInterfaceErrorAction onerror;
170 170 char serial[BLOCK_SERIAL_STRLEN + 1];
  171 + TAILQ_ENTRY(DriveInfo) next;
171 172 } DriveInfo;
172 173  
173 174 #define MAX_IDE_DEVS 2
174 175 #define MAX_SCSI_DEVS 7
175 176 #define MAX_DRIVES 32
176 177  
177   -extern int nb_drives;
178   -extern DriveInfo drives_table[MAX_DRIVES+1];
  178 +extern TAILQ_HEAD(drivelist, DriveInfo) drives;
179 179  
180   -extern int drive_get_index(BlockInterfaceType type, int bus, int unit);
  180 +extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit);
181 181 extern int drive_get_max_bus(BlockInterfaceType type);
182 182 extern void drive_uninit(BlockDriverState *bdrv);
183 183 extern void drive_remove(int index);
... ... @@ -196,7 +196,8 @@ extern struct drive_opt drives_opt[MAX_DRIVES];
196 196 extern int nb_drives_opt;
197 197  
198 198 extern int drive_add(const char *file, const char *fmt, ...);
199   -extern int drive_init(struct drive_opt *arg, int snapshot, void *machine);
  199 +extern DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *machine,
  200 + int *fatal_error);
200 201  
201 202 /* acpi */
202 203 typedef void (*qemu_system_device_hot_add_t)(int pcibus, int slot, int state);
... ... @@ -207,7 +208,7 @@ void qemu_system_device_hot_add(int pcibus, int slot, int state);
207 208  
208 209 typedef int (dev_match_fn)(void *dev_private, void *arg);
209 210  
210   -int add_init_drive(const char *opts);
  211 +DriveInfo *add_init_drive(const char *opts);
211 212 void destroy_nic(dev_match_fn *match_fn, void *arg);
212 213 void destroy_bdrvs(dev_match_fn *match_fn, void *arg);
213 214  
... ...
... ... @@ -180,8 +180,7 @@ static const char *data_dir;
180 180 const char *bios_name = NULL;
181 181 /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
182 182 to store the VM snapshots */
183   -DriveInfo drives_table[MAX_DRIVES+1];
184   -int nb_drives;
  183 +struct drivelist drives = TAILQ_HEAD_INITIALIZER(drives);
185 184 enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
186 185 static DisplayState *display_state;
187 186 DisplayType display_type = DT_DEFAULT;
... ... @@ -1879,19 +1878,6 @@ static int drive_opt_get_free_idx(void)
1879 1878 return -1;
1880 1879 }
1881 1880  
1882   -static int drive_get_free_idx(void)
1883   -{
1884   - int index;
1885   -
1886   - for (index = 0; index < MAX_DRIVES; index++)
1887   - if (!drives_table[index].used) {
1888   - drives_table[index].used = 1;
1889   - return index;
1890   - }
1891   -
1892   - return -1;
1893   -}
1894   -
1895 1881 int drive_add(const char *file, const char *fmt, ...)
1896 1882 {
1897 1883 va_list ap;
... ... @@ -1918,54 +1904,56 @@ void drive_remove(int index)
1918 1904 nb_drives_opt--;
1919 1905 }
1920 1906  
1921   -int drive_get_index(BlockInterfaceType type, int bus, int unit)
  1907 +DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
1922 1908 {
1923   - int index;
  1909 + DriveInfo *dinfo;
1924 1910  
1925 1911 /* seek interface, bus and unit */
1926 1912  
1927   - for (index = 0; index < MAX_DRIVES; index++)
1928   - if (drives_table[index].type == type &&
1929   - drives_table[index].bus == bus &&
1930   - drives_table[index].unit == unit &&
1931   - drives_table[index].used)
1932   - return index;
  1913 + TAILQ_FOREACH(dinfo, &drives, next) {
  1914 + if (dinfo->type == type &&
  1915 + dinfo->bus == bus &&
  1916 + dinfo->unit == unit)
  1917 + return dinfo;
  1918 + }
1933 1919  
1934   - return -1;
  1920 + return NULL;
1935 1921 }
1936 1922  
1937 1923 int drive_get_max_bus(BlockInterfaceType type)
1938 1924 {
1939 1925 int max_bus;
1940   - int index;
  1926 + DriveInfo *dinfo;
1941 1927  
1942 1928 max_bus = -1;
1943   - for (index = 0; index < nb_drives; index++) {
1944   - if(drives_table[index].type == type &&
1945   - drives_table[index].bus > max_bus)
1946   - max_bus = drives_table[index].bus;
  1929 + TAILQ_FOREACH(dinfo, &drives, next) {
  1930 + if(dinfo->type == type &&
  1931 + dinfo->bus > max_bus)
  1932 + max_bus = dinfo->bus;
1947 1933 }
1948 1934 return max_bus;
1949 1935 }
1950 1936  
1951 1937 const char *drive_get_serial(BlockDriverState *bdrv)
1952 1938 {
1953   - int index;
  1939 + DriveInfo *dinfo;
1954 1940  
1955   - for (index = 0; index < nb_drives; index++)
1956   - if (drives_table[index].bdrv == bdrv)
1957   - return drives_table[index].serial;
  1941 + TAILQ_FOREACH(dinfo, &drives, next) {
  1942 + if (dinfo->bdrv == bdrv)
  1943 + return dinfo->serial;
  1944 + }
1958 1945  
1959 1946 return "\0";
1960 1947 }
1961 1948  
1962 1949 BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv)
1963 1950 {
1964   - int index;
  1951 + DriveInfo *dinfo;
1965 1952  
1966   - for (index = 0; index < nb_drives; index++)
1967   - if (drives_table[index].bdrv == bdrv)
1968   - return drives_table[index].onerror;
  1953 + TAILQ_FOREACH(dinfo, &drives, next) {
  1954 + if (dinfo->bdrv == bdrv)
  1955 + return dinfo->onerror;
  1956 + }
1969 1957  
1970 1958 return BLOCK_ERR_STOP_ENOSPC;
1971 1959 }
... ... @@ -1977,19 +1965,20 @@ static void bdrv_format_print(void *opaque, const char *name)
1977 1965  
1978 1966 void drive_uninit(BlockDriverState *bdrv)
1979 1967 {
1980   - int i;
  1968 + DriveInfo *dinfo;
1981 1969  
1982   - for (i = 0; i < MAX_DRIVES; i++)
1983   - if (drives_table[i].bdrv == bdrv) {
1984   - drives_table[i].bdrv = NULL;
1985   - drives_table[i].used = 0;
1986   - drive_remove(drives_table[i].drive_opt_idx);
1987   - nb_drives--;
1988   - break;
1989   - }
  1970 + TAILQ_FOREACH(dinfo, &drives, next) {
  1971 + if (dinfo->bdrv != bdrv)
  1972 + continue;
  1973 + drive_remove(dinfo->drive_opt_idx);
  1974 + TAILQ_REMOVE(&drives, dinfo, next);
  1975 + qemu_free(dinfo);
  1976 + break;
  1977 + }
1990 1978 }
1991 1979  
1992   -int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
  1980 +DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque,
  1981 + int *fatal_error)
1993 1982 {
1994 1983 char buf[128];
1995 1984 char file[1024];
... ... @@ -2008,7 +1997,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2008 1997 int cache;
2009 1998 int bdrv_flags, onerror;
2010 1999 const char *devaddr;
2011   - int drives_table_idx;
  2000 + DriveInfo *dinfo;
2012 2001 char *str = arg->opt;
2013 2002 static const char * const params[] = { "bus", "unit", "if", "index",
2014 2003 "cyls", "heads", "secs", "trans",
... ... @@ -2016,11 +2005,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2016 2005 "cache", "format", "serial",
2017 2006 "werror", "addr",
2018 2007 NULL };
  2008 + *fatal_error = 1;
2019 2009  
2020 2010 if (check_params(buf, sizeof(buf), params, str) < 0) {
2021 2011 fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
2022 2012 buf, str);
2023   - return -1;
  2013 + return NULL;
2024 2014 }
2025 2015  
2026 2016 file[0] = 0;
... ... @@ -2048,7 +2038,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2048 2038 bus_id = strtol(buf, NULL, 0);
2049 2039 if (bus_id < 0) {
2050 2040 fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
2051   - return -1;
  2041 + return NULL;
2052 2042 }
2053 2043 }
2054 2044  
... ... @@ -2056,7 +2046,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2056 2046 unit_id = strtol(buf, NULL, 0);
2057 2047 if (unit_id < 0) {
2058 2048 fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
2059   - return -1;
  2049 + return NULL;
2060 2050 }
2061 2051 }
2062 2052  
... ... @@ -2088,7 +2078,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2088 2078 max_devs = 0;
2089 2079 } else {
2090 2080 fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
2091   - return -1;
  2081 + return NULL;
2092 2082 }
2093 2083 }
2094 2084  
... ... @@ -2096,7 +2086,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2096 2086 index = strtol(buf, NULL, 0);
2097 2087 if (index < 0) {
2098 2088 fprintf(stderr, "qemu: '%s' invalid index\n", str);
2099   - return -1;
  2089 + return NULL;
2100 2090 }
2101 2091 }
2102 2092  
... ... @@ -2115,15 +2105,15 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2115 2105 if (cyls || heads || secs) {
2116 2106 if (cyls < 1 || cyls > 16383) {
2117 2107 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
2118   - return -1;
  2108 + return NULL;
2119 2109 }
2120 2110 if (heads < 1 || heads > 16) {
2121 2111 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
2122   - return -1;
  2112 + return NULL;
2123 2113 }
2124 2114 if (secs < 1 || secs > 63) {
2125 2115 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
2126   - return -1;
  2116 + return NULL;
2127 2117 }
2128 2118 }
2129 2119  
... ... @@ -2132,7 +2122,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2132 2122 fprintf(stderr,
2133 2123 "qemu: '%s' trans must be used with cyls,heads and secs\n",
2134 2124 str);
2135   - return -1;
  2125 + return NULL;
2136 2126 }
2137 2127 if (!strcmp(buf, "none"))
2138 2128 translation = BIOS_ATA_TRANSLATION_NONE;
... ... @@ -2142,7 +2132,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2142 2132 translation = BIOS_ATA_TRANSLATION_AUTO;
2143 2133 else {
2144 2134 fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
2145   - return -1;
  2135 + return NULL;
2146 2136 }
2147 2137 }
2148 2138  
... ... @@ -2153,12 +2143,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2153 2143 if (cyls || secs || heads) {
2154 2144 fprintf(stderr,
2155 2145 "qemu: '%s' invalid physical CHS format\n", str);
2156   - return -1;
  2146 + return NULL;
2157 2147 }
2158 2148 media = MEDIA_CDROM;
2159 2149 } else {
2160 2150 fprintf(stderr, "qemu: '%s' invalid media\n", str);
2161   - return -1;
  2151 + return NULL;
2162 2152 }
2163 2153 }
2164 2154  
... ... @@ -2169,7 +2159,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2169 2159 snapshot = 0;
2170 2160 else {
2171 2161 fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
2172   - return -1;
  2162 + return NULL;
2173 2163 }
2174 2164 }
2175 2165  
... ... @@ -2182,7 +2172,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2182 2172 cache = 2;
2183 2173 else {
2184 2174 fprintf(stderr, "qemu: invalid cache option\n");
2185   - return -1;
  2175 + return NULL;
2186 2176 }
2187 2177 }
2188 2178  
... ... @@ -2191,12 +2181,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2191 2181 fprintf(stderr, "qemu: Supported formats:");
2192 2182 bdrv_iterate_format(bdrv_format_print, NULL);
2193 2183 fprintf(stderr, "\n");
2194   - return -1;
  2184 + return NULL;
2195 2185 }
2196 2186 drv = bdrv_find_format(buf);
2197 2187 if (!drv) {
2198 2188 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
2199   - return -1;
  2189 + return NULL;
2200 2190 }
2201 2191 }
2202 2192  
... ... @@ -2212,7 +2202,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2212 2202 if (get_param_value(buf, sizeof(serial), "werror", str)) {
2213 2203 if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) {
2214 2204 fprintf(stderr, "werror is no supported by this format\n");
2215   - return -1;
  2205 + return NULL;
2216 2206 }
2217 2207 if (!strcmp(buf, "ignore"))
2218 2208 onerror = BLOCK_ERR_IGNORE;
... ... @@ -2224,7 +2214,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2224 2214 onerror = BLOCK_ERR_REPORT;
2225 2215 else {
2226 2216 fprintf(stderr, "qemu: '%s' invalid write error action\n", buf);
2227   - return -1;
  2217 + return NULL;
2228 2218 }
2229 2219 }
2230 2220  
... ... @@ -2232,7 +2222,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2232 2222 if (get_param_value(buf, sizeof(buf), "addr", str)) {
2233 2223 if (type != IF_VIRTIO) {
2234 2224 fprintf(stderr, "addr is not supported by in '%s'\n", str);
2235   - return -1;
  2225 + return NULL;
2236 2226 }
2237 2227 devaddr = strdup(buf);
2238 2228 }
... ... @@ -2243,7 +2233,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2243 2233 if (bus_id != 0 || unit_id != -1) {
2244 2234 fprintf(stderr,
2245 2235 "qemu: '%s' index cannot be used with bus and unit\n", str);
2246   - return -1;
  2236 + return NULL;
2247 2237 }
2248 2238 if (max_devs == 0)
2249 2239 {
... ... @@ -2261,7 +2251,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2261 2251  
2262 2252 if (unit_id == -1) {
2263 2253 unit_id = 0;
2264   - while (drive_get_index(type, bus_id, unit_id) != -1) {
  2254 + while (drive_get(type, bus_id, unit_id) != NULL) {
2265 2255 unit_id++;
2266 2256 if (max_devs && unit_id >= max_devs) {
2267 2257 unit_id -= max_devs;
... ... @@ -2275,15 +2265,17 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2275 2265 if (max_devs && unit_id >= max_devs) {
2276 2266 fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
2277 2267 str, unit_id, max_devs - 1);
2278   - return -1;
  2268 + return NULL;
2279 2269 }
2280 2270  
2281 2271 /*
2282 2272 * ignore multiple definitions
2283 2273 */
2284 2274  
2285   - if (drive_get_index(type, bus_id, unit_id) != -1)
2286   - return -2;
  2275 + if (drive_get(type, bus_id, unit_id) != NULL) {
  2276 + *fatal_error = 0;
  2277 + return NULL;
  2278 + }
2287 2279  
2288 2280 /* init */
2289 2281  
... ... @@ -2296,16 +2288,16 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2296 2288 snprintf(buf, sizeof(buf), "%s%s%i",
2297 2289 devname, mediastr, unit_id);
2298 2290 bdrv = bdrv_new(buf);
2299   - drives_table_idx = drive_get_free_idx();
2300   - drives_table[drives_table_idx].bdrv = bdrv;
2301   - drives_table[drives_table_idx].devaddr = devaddr;
2302   - drives_table[drives_table_idx].type = type;
2303   - drives_table[drives_table_idx].bus = bus_id;
2304   - drives_table[drives_table_idx].unit = unit_id;
2305   - drives_table[drives_table_idx].onerror = onerror;
2306   - drives_table[drives_table_idx].drive_opt_idx = arg - drives_opt;
2307   - strncpy(drives_table[drives_table_idx].serial, serial, sizeof(serial));
2308   - nb_drives++;
  2291 + dinfo = qemu_mallocz(sizeof(*dinfo));
  2292 + dinfo->bdrv = bdrv;
  2293 + dinfo->devaddr = devaddr;
  2294 + dinfo->type = type;
  2295 + dinfo->bus = bus_id;
  2296 + dinfo->unit = unit_id;
  2297 + dinfo->onerror = onerror;
  2298 + dinfo->drive_opt_idx = arg - drives_opt;
  2299 + strncpy(dinfo->serial, serial, sizeof(serial));
  2300 + TAILQ_INSERT_TAIL(&drives, dinfo, next);
2309 2301  
2310 2302 switch(type) {
2311 2303 case IF_IDE:
... ... @@ -2336,8 +2328,10 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2336 2328 case IF_COUNT:
2337 2329 abort();
2338 2330 }
2339   - if (!file[0])
2340   - return -2;
  2331 + if (!file[0]) {
  2332 + *fatal_error = 0;
  2333 + return NULL;
  2334 + }
2341 2335 bdrv_flags = 0;
2342 2336 if (snapshot) {
2343 2337 bdrv_flags |= BDRV_O_SNAPSHOT;
... ... @@ -2350,11 +2344,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
2350 2344 if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) {
2351 2345 fprintf(stderr, "qemu: could not open disk image %s\n",
2352 2346 file);
2353   - return -1;
  2347 + return NULL;
2354 2348 }
2355 2349 if (bdrv_key_required(bdrv))
2356 2350 autostart = 0;
2357   - return drives_table_idx;
  2351 + *fatal_error = 0;
  2352 + return dinfo;
2358 2353 }
2359 2354  
2360 2355 void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
... ... @@ -4981,7 +4976,6 @@ int main(int argc, char **argv, char **envp)
4981 4976 }
4982 4977  
4983 4978 nb_net_clients = 0;
4984   - nb_drives = 0;
4985 4979 nb_drives_opt = 0;
4986 4980 nb_numa_nodes = 0;
4987 4981 hda_index = -1;
... ... @@ -5854,9 +5848,12 @@ int main(int argc, char **argv, char **envp)
5854 5848  
5855 5849 /* open the virtual block devices */
5856 5850  
5857   - for(i = 0; i < nb_drives_opt; i++)
5858   - if (drive_init(&drives_opt[i], snapshot, machine) == -1)
5859   - exit(1);
  5851 + for(i = 0; i < nb_drives_opt; i++) {
  5852 + int fatal_error;
  5853 + if (drive_init(&drives_opt[i], snapshot, machine, &fatal_error) == NULL)
  5854 + if (fatal_error)
  5855 + exit(1);
  5856 + }
5860 5857  
5861 5858 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
5862 5859 register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
... ...