Commit 751c6a17042b5d011013d6963c0505d671cf708e
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>
Showing
36 changed files
with
308 additions
and
343 deletions
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); | ... | ... |
hw/pc.c
| ... | ... | @@ -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 | ... | ... |
vl.c
| ... | ... | @@ -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); | ... | ... |