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,22 +28,23 @@ | ||
| 28 | #include "block_int.h" | 28 | #include "block_int.h" |
| 29 | #include "sysemu.h" | 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 | drive_opt_idx = drive_add(NULL, "%s", opts); | 37 | drive_opt_idx = drive_add(NULL, "%s", opts); |
| 37 | if (!drive_opt_idx) | 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 | drive_remove(drive_opt_idx); | 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 | void destroy_nic(dev_match_fn *match_fn, void *arg) | 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,11 +65,11 @@ void destroy_nic(dev_match_fn *match_fn, void *arg) | ||
| 64 | 65 | ||
| 65 | void destroy_bdrvs(dev_match_fn *match_fn, void *arg) | 66 | void destroy_bdrvs(dev_match_fn *match_fn, void *arg) |
| 66 | { | 67 | { |
| 67 | - int i; | 68 | + DriveInfo *dinfo; |
| 68 | struct BlockDriverState *bs; | 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 | if (bs) { | 73 | if (bs) { |
| 73 | if (bs->private && match_fn(bs->private, arg)) { | 74 | if (bs->private && match_fn(bs->private, arg)) { |
| 74 | drive_uninit(bs); | 75 | drive_uninit(bs); |
hw/etraxfs.c
| @@ -55,6 +55,7 @@ void bareetraxfs_init (ram_addr_t ram_size, | @@ -55,6 +55,7 @@ void bareetraxfs_init (ram_addr_t ram_size, | ||
| 55 | void *etraxfs_dmac; | 55 | void *etraxfs_dmac; |
| 56 | struct etraxfs_dma_client *eth[2] = {NULL, NULL}; | 56 | struct etraxfs_dma_client *eth[2] = {NULL, NULL}; |
| 57 | int kernel_size; | 57 | int kernel_size; |
| 58 | + DriveInfo *dinfo; | ||
| 58 | int i; | 59 | int i; |
| 59 | ram_addr_t phys_ram; | 60 | ram_addr_t phys_ram; |
| 60 | ram_addr_t phys_flash; | 61 | ram_addr_t phys_flash; |
| @@ -79,9 +80,9 @@ void bareetraxfs_init (ram_addr_t ram_size, | @@ -79,9 +80,9 @@ void bareetraxfs_init (ram_addr_t ram_size, | ||
| 79 | 80 | ||
| 80 | 81 | ||
| 81 | phys_flash = qemu_ram_alloc(FLASH_SIZE); | 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 | pflash_cfi02_register(0x0, phys_flash, | 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 | FLASH_SIZE >> 16, | 86 | FLASH_SIZE >> 16, |
| 86 | 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, | 87 | 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, |
| 87 | 0x555, 0x2aa); | 88 | 0x555, 0x2aa); |
hw/gumstix.c
| @@ -47,22 +47,22 @@ static void connex_init(ram_addr_t ram_size, | @@ -47,22 +47,22 @@ static void connex_init(ram_addr_t ram_size, | ||
| 47 | const char *initrd_filename, const char *cpu_model) | 47 | const char *initrd_filename, const char *cpu_model) |
| 48 | { | 48 | { |
| 49 | PXA2xxState *cpu; | 49 | PXA2xxState *cpu; |
| 50 | - int index; | 50 | + DriveInfo *dinfo; |
| 51 | 51 | ||
| 52 | uint32_t connex_rom = 0x01000000; | 52 | uint32_t connex_rom = 0x01000000; |
| 53 | uint32_t connex_ram = 0x04000000; | 53 | uint32_t connex_ram = 0x04000000; |
| 54 | 54 | ||
| 55 | cpu = pxa255_init(connex_ram); | 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 | fprintf(stderr, "A flash image must be given with the " | 59 | fprintf(stderr, "A flash image must be given with the " |
| 60 | "'pflash' parameter\n"); | 60 | "'pflash' parameter\n"); |
| 61 | exit(1); | 61 | exit(1); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(connex_rom), | 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 | 2, 0, 0, 0, 0)) { | 66 | 2, 0, 0, 0, 0)) { |
| 67 | fprintf(stderr, "qemu: Error registering flash memory.\n"); | 67 | fprintf(stderr, "qemu: Error registering flash memory.\n"); |
| 68 | exit(1); | 68 | exit(1); |
| @@ -81,22 +81,22 @@ static void verdex_init(ram_addr_t ram_size, | @@ -81,22 +81,22 @@ static void verdex_init(ram_addr_t ram_size, | ||
| 81 | const char *initrd_filename, const char *cpu_model) | 81 | const char *initrd_filename, const char *cpu_model) |
| 82 | { | 82 | { |
| 83 | PXA2xxState *cpu; | 83 | PXA2xxState *cpu; |
| 84 | - int index; | 84 | + DriveInfo *dinfo; |
| 85 | 85 | ||
| 86 | uint32_t verdex_rom = 0x02000000; | 86 | uint32_t verdex_rom = 0x02000000; |
| 87 | uint32_t verdex_ram = 0x10000000; | 87 | uint32_t verdex_ram = 0x10000000; |
| 88 | 88 | ||
| 89 | cpu = pxa270_init(verdex_ram, cpu_model ?: "pxa270-c0"); | 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 | fprintf(stderr, "A flash image must be given with the " | 93 | fprintf(stderr, "A flash image must be given with the " |
| 94 | "'pflash' parameter\n"); | 94 | "'pflash' parameter\n"); |
| 95 | exit(1); | 95 | exit(1); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(verdex_rom), | 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 | 2, 0, 0, 0, 0)) { | 100 | 2, 0, 0, 0, 0)) { |
| 101 | fprintf(stderr, "qemu: Error registering flash memory.\n"); | 101 | fprintf(stderr, "qemu: Error registering flash memory.\n"); |
| 102 | exit(1); | 102 | exit(1); |
hw/mainstone.c
| @@ -77,7 +77,8 @@ static void mainstone_common_init(ram_addr_t ram_size, | @@ -77,7 +77,8 @@ static void mainstone_common_init(ram_addr_t ram_size, | ||
| 77 | target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 }; | 77 | target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 }; |
| 78 | PXA2xxState *cpu; | 78 | PXA2xxState *cpu; |
| 79 | qemu_irq *mst_irq; | 79 | qemu_irq *mst_irq; |
| 80 | - int i, index; | 80 | + DriveInfo *dinfo; |
| 81 | + int i; | ||
| 81 | 82 | ||
| 82 | if (!cpu_model) | 83 | if (!cpu_model) |
| 83 | cpu_model = "pxa270-c5"; | 84 | cpu_model = "pxa270-c5"; |
| @@ -92,8 +93,8 @@ static void mainstone_common_init(ram_addr_t ram_size, | @@ -92,8 +93,8 @@ static void mainstone_common_init(ram_addr_t ram_size, | ||
| 92 | 93 | ||
| 93 | /* There are two 32MiB flash devices on the board */ | 94 | /* There are two 32MiB flash devices on the board */ |
| 94 | for (i = 0; i < 2; i ++) { | 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 | fprintf(stderr, "Two flash images must be given with the " | 98 | fprintf(stderr, "Two flash images must be given with the " |
| 98 | "'pflash' parameter\n"); | 99 | "'pflash' parameter\n"); |
| 99 | exit(1); | 100 | exit(1); |
| @@ -101,7 +102,7 @@ static void mainstone_common_init(ram_addr_t ram_size, | @@ -101,7 +102,7 @@ static void mainstone_common_init(ram_addr_t ram_size, | ||
| 101 | 102 | ||
| 102 | if (!pflash_cfi01_register(mainstone_flash_base[i], | 103 | if (!pflash_cfi01_register(mainstone_flash_base[i], |
| 103 | qemu_ram_alloc(MAINSTONE_FLASH), | 104 | qemu_ram_alloc(MAINSTONE_FLASH), |
| 104 | - drives_table[index].bdrv, sector_len, | 105 | + dinfo->bdrv, sector_len, |
| 105 | MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0)) { | 106 | MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0)) { |
| 106 | fprintf(stderr, "qemu: Error registering flash memory.\n"); | 107 | fprintf(stderr, "qemu: Error registering flash memory.\n"); |
| 107 | exit(1); | 108 | exit(1); |
hw/mips_jazz.c
| @@ -235,11 +235,8 @@ void mips_jazz_init (ram_addr_t ram_size, | @@ -235,11 +235,8 @@ void mips_jazz_init (ram_addr_t ram_size, | ||
| 235 | exit(1); | 235 | exit(1); |
| 236 | } | 236 | } |
| 237 | for (n = 0; n < MAX_FD; n++) { | 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 | fdctrl_init(rc4030[1], 0, 1, 0x80003000, fds); | 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,7 +773,7 @@ void mips_malta_init (ram_addr_t ram_size, | ||
| 773 | uint8_t *eeprom_buf; | 773 | uint8_t *eeprom_buf; |
| 774 | i2c_bus *smbus; | 774 | i2c_bus *smbus; |
| 775 | int i; | 775 | int i; |
| 776 | - int index; | 776 | + DriveInfo *dinfo; |
| 777 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 777 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 778 | BlockDriverState *fd[MAX_FD]; | 778 | BlockDriverState *fd[MAX_FD]; |
| 779 | int fl_idx = 0; | 779 | int fl_idx = 0; |
| @@ -827,8 +827,8 @@ void mips_malta_init (ram_addr_t ram_size, | @@ -827,8 +827,8 @@ void mips_malta_init (ram_addr_t ram_size, | ||
| 827 | env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL)); | 827 | env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL)); |
| 828 | write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry); | 828 | write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry); |
| 829 | } else { | 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 | /* Load firmware from flash. */ | 832 | /* Load firmware from flash. */ |
| 833 | bios_size = 0x400000; | 833 | bios_size = 0x400000; |
| 834 | fl_sectors = bios_size >> 16; | 834 | fl_sectors = bios_size >> 16; |
| @@ -836,10 +836,10 @@ void mips_malta_init (ram_addr_t ram_size, | @@ -836,10 +836,10 @@ void mips_malta_init (ram_addr_t ram_size, | ||
| 836 | printf("Register parallel flash %d size " TARGET_FMT_lx " at " | 836 | printf("Register parallel flash %d size " TARGET_FMT_lx " at " |
| 837 | "offset %08lx addr %08llx '%s' %x\n", | 837 | "offset %08lx addr %08llx '%s' %x\n", |
| 838 | fl_idx, bios_size, bios_offset, 0x1e000000LL, | 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 | #endif | 840 | #endif |
| 841 | pflash_cfi01_register(0x1e000000LL, bios_offset, | 841 | pflash_cfi01_register(0x1e000000LL, bios_offset, |
| 842 | - drives_table[index].bdrv, 65536, fl_sectors, | 842 | + dinfo->bdrv, 65536, fl_sectors, |
| 843 | 4, 0x0000, 0x0000, 0x0000, 0x0000); | 843 | 4, 0x0000, 0x0000, 0x0000, 0x0000); |
| 844 | fl_idx++; | 844 | fl_idx++; |
| 845 | } else { | 845 | } else { |
| @@ -898,11 +898,8 @@ void mips_malta_init (ram_addr_t ram_size, | @@ -898,11 +898,8 @@ void mips_malta_init (ram_addr_t ram_size, | ||
| 898 | } | 898 | } |
| 899 | 899 | ||
| 900 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | piix4_devfn = piix4_init(pci_bus, 80); | 905 | piix4_devfn = piix4_init(pci_bus, 80); |
| @@ -929,11 +926,8 @@ void mips_malta_init (ram_addr_t ram_size, | @@ -929,11 +926,8 @@ void mips_malta_init (ram_addr_t ram_size, | ||
| 929 | if (parallel_hds[0]) | 926 | if (parallel_hds[0]) |
| 930 | parallel_init(0x378, i8259[7], parallel_hds[0]); | 927 | parallel_init(0x378, i8259[7], parallel_hds[0]); |
| 931 | for(i = 0; i < MAX_FD; i++) { | 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 | floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd); | 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,8 +155,8 @@ void mips_r4k_init (ram_addr_t ram_size, | ||
| 155 | RTCState *rtc_state; | 155 | RTCState *rtc_state; |
| 156 | int i; | 156 | int i; |
| 157 | qemu_irq *i8259; | 157 | qemu_irq *i8259; |
| 158 | - int index; | ||
| 159 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 158 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 159 | + DriveInfo *dinfo; | ||
| 160 | 160 | ||
| 161 | /* init CPUs */ | 161 | /* init CPUs */ |
| 162 | if (cpu_model == NULL) { | 162 | if (cpu_model == NULL) { |
| @@ -208,11 +208,11 @@ void mips_r4k_init (ram_addr_t ram_size, | @@ -208,11 +208,11 @@ void mips_r4k_init (ram_addr_t ram_size, | ||
| 208 | bios_offset | IO_MEM_ROM); | 208 | bios_offset | IO_MEM_ROM); |
| 209 | 209 | ||
| 210 | load_image_targphys(filename, 0x1fc00000, BIOS_SIZE); | 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 | uint32_t mips_rom = 0x00400000; | 212 | uint32_t mips_rom = 0x00400000; |
| 213 | bios_offset = qemu_ram_alloc(mips_rom); | 213 | bios_offset = qemu_ram_alloc(mips_rom); |
| 214 | if (!pflash_cfi01_register(0x1fc00000, bios_offset, | 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 | 4, 0, 0, 0, 0)) { | 216 | 4, 0, 0, 0, 0)) { |
| 217 | fprintf(stderr, "qemu: Error registering flash memory.\n"); | 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,11 +267,8 @@ void mips_r4k_init (ram_addr_t ram_size, | ||
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | for(i = 0; i < MAX_IDE_BUS; i++) | 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,8 +1512,8 @@ static void musicpal_init(ram_addr_t ram_size, | ||
| 1512 | qemu_irq pic[32]; | 1512 | qemu_irq pic[32]; |
| 1513 | DeviceState *dev; | 1513 | DeviceState *dev; |
| 1514 | int i; | 1514 | int i; |
| 1515 | - int index; | ||
| 1516 | unsigned long flash_size; | 1515 | unsigned long flash_size; |
| 1516 | + DriveInfo *dinfo; | ||
| 1517 | 1517 | ||
| 1518 | if (!cpu_model) | 1518 | if (!cpu_model) |
| 1519 | cpu_model = "arm926"; | 1519 | cpu_model = "arm926"; |
| @@ -1549,9 +1549,9 @@ static void musicpal_init(ram_addr_t ram_size, | @@ -1549,9 +1549,9 @@ static void musicpal_init(ram_addr_t ram_size, | ||
| 1549 | serial_hds[1], 1); | 1549 | serial_hds[1], 1); |
| 1550 | 1550 | ||
| 1551 | /* Register flash */ | 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 | if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 && | 1555 | if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 && |
| 1556 | flash_size != 32*1024*1024) { | 1556 | flash_size != 32*1024*1024) { |
| 1557 | fprintf(stderr, "Invalid flash image size\n"); | 1557 | fprintf(stderr, "Invalid flash image size\n"); |
| @@ -1564,7 +1564,7 @@ static void musicpal_init(ram_addr_t ram_size, | @@ -1564,7 +1564,7 @@ static void musicpal_init(ram_addr_t ram_size, | ||
| 1564 | * image is smaller than 32 MB. | 1564 | * image is smaller than 32 MB. |
| 1565 | */ | 1565 | */ |
| 1566 | pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, qemu_ram_alloc(flash_size), | 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 | (flash_size + 0xffff) >> 16, | 1568 | (flash_size + 0xffff) >> 16, |
| 1569 | MP_FLASH_SIZE_MAX / flash_size, | 1569 | MP_FLASH_SIZE_MAX / flash_size, |
| 1570 | 2, 0x00BF, 0x236D, 0x0000, 0x0000, | 1570 | 2, 0x00BF, 0x236D, 0x0000, 0x0000, |
hw/nand.c
| @@ -442,16 +442,16 @@ NANDFlashState *nand_init(int manf_id, int chip_id) | @@ -442,16 +442,16 @@ NANDFlashState *nand_init(int manf_id, int chip_id) | ||
| 442 | { | 442 | { |
| 443 | int pagesize; | 443 | int pagesize; |
| 444 | NANDFlashState *s; | 444 | NANDFlashState *s; |
| 445 | - int index; | 445 | + DriveInfo *dinfo; |
| 446 | 446 | ||
| 447 | if (nand_flash_ids[chip_id].size == 0) { | 447 | if (nand_flash_ids[chip_id].size == 0) { |
| 448 | hw_error("%s: Unsupported NAND chip ID.\n", __FUNCTION__); | 448 | hw_error("%s: Unsupported NAND chip ID.\n", __FUNCTION__); |
| 449 | } | 449 | } |
| 450 | 450 | ||
| 451 | s = (NANDFlashState *) qemu_mallocz(sizeof(NANDFlashState)); | 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 | s->manf_id = manf_id; | 455 | s->manf_id = manf_id; |
| 456 | s->chip_id = chip_id; | 456 | s->chip_id = chip_id; |
| 457 | s->size = nand_flash_ids[s->chip_id].size << 20; | 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,7 +4628,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, | ||
| 4628 | ram_addr_t imif_base, emiff_base; | 4628 | ram_addr_t imif_base, emiff_base; |
| 4629 | qemu_irq *cpu_irq; | 4629 | qemu_irq *cpu_irq; |
| 4630 | qemu_irq dma_irqs[6]; | 4630 | qemu_irq dma_irqs[6]; |
| 4631 | - int sdindex; | 4631 | + DriveInfo *dinfo; |
| 4632 | 4632 | ||
| 4633 | if (!core) | 4633 | if (!core) |
| 4634 | core = "ti925t"; | 4634 | core = "ti925t"; |
| @@ -4740,12 +4740,12 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, | @@ -4740,12 +4740,12 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size, | ||
| 4740 | omap_dpll_init(&s->dpll[1], 0xfffed000, omap_findclk(s, "dpll2")); | 4740 | omap_dpll_init(&s->dpll[1], 0xfffed000, omap_findclk(s, "dpll2")); |
| 4741 | omap_dpll_init(&s->dpll[2], 0xfffed100, omap_findclk(s, "dpll3")); | 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 | fprintf(stderr, "qemu: missing SecureDigital device\n"); | 4745 | fprintf(stderr, "qemu: missing SecureDigital device\n"); |
| 4746 | exit(1); | 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 | s->irq[1][OMAP_INT_OQN], &s->drq[OMAP_DMA_MMC_TX], | 4749 | s->irq[1][OMAP_INT_OQN], &s->drq[OMAP_DMA_MMC_TX], |
| 4750 | omap_findclk(s, "mmc_ck")); | 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,7 +4496,7 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size, | ||
| 4496 | qemu_irq *cpu_irq; | 4496 | qemu_irq *cpu_irq; |
| 4497 | qemu_irq dma_irqs[4]; | 4497 | qemu_irq dma_irqs[4]; |
| 4498 | omap_clk gpio_clks[4]; | 4498 | omap_clk gpio_clks[4]; |
| 4499 | - int sdindex; | 4499 | + DriveInfo *dinfo; |
| 4500 | int i; | 4500 | int i; |
| 4501 | 4501 | ||
| 4502 | /* Core */ | 4502 | /* Core */ |
| @@ -4645,12 +4645,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size, | @@ -4645,12 +4645,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size, | ||
| 4645 | s->sdrc = omap_sdrc_init(0x68009000); | 4645 | s->sdrc = omap_sdrc_init(0x68009000); |
| 4646 | s->gpmc = omap_gpmc_init(0x6800a000, s->irq[0][OMAP_INT_24XX_GPMC_IRQ]); | 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 | fprintf(stderr, "qemu: missing SecureDigital device\n"); | 4650 | fprintf(stderr, "qemu: missing SecureDigital device\n"); |
| 4651 | exit(1); | 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 | s->irq[0][OMAP_INT_24XX_MMC_IRQ], | 4654 | s->irq[0][OMAP_INT_24XX_MMC_IRQ], |
| 4655 | &s->drq[OMAP24XX_DMA_MMC1_TX], | 4655 | &s->drq[OMAP24XX_DMA_MMC1_TX], |
| 4656 | omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk")); | 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,7 +127,7 @@ static void sx1_init(ram_addr_t ram_size, | ||
| 127 | static uint32_t cs2val = 0x00001139; | 127 | static uint32_t cs2val = 0x00001139; |
| 128 | static uint32_t cs3val = 0x00001139; | 128 | static uint32_t cs3val = 0x00001139; |
| 129 | ram_addr_t phys_flash; | 129 | ram_addr_t phys_flash; |
| 130 | - int index; | 130 | + DriveInfo *dinfo; |
| 131 | int fl_idx; | 131 | int fl_idx; |
| 132 | uint32_t flash_size = flash0_size; | 132 | uint32_t flash_size = flash0_size; |
| 133 | 133 | ||
| @@ -151,9 +151,9 @@ static void sx1_init(ram_addr_t ram_size, | @@ -151,9 +151,9 @@ static void sx1_init(ram_addr_t ram_size, | ||
| 151 | 151 | ||
| 152 | fl_idx = 0; | 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 | if (!pflash_cfi01_register(OMAP_CS0_BASE, qemu_ram_alloc(flash_size), | 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 | 4, 0, 0, 0, 0)) { | 157 | 4, 0, 0, 0, 0)) { |
| 158 | fprintf(stderr, "qemu: Error registering flash memory %d.\n", | 158 | fprintf(stderr, "qemu: Error registering flash memory %d.\n", |
| 159 | fl_idx); | 159 | fl_idx); |
| @@ -162,7 +162,7 @@ static void sx1_init(ram_addr_t ram_size, | @@ -162,7 +162,7 @@ static void sx1_init(ram_addr_t ram_size, | ||
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | if ((version == 1) && | 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 | cpu_register_physical_memory(OMAP_CS1_BASE, flash1_size, | 166 | cpu_register_physical_memory(OMAP_CS1_BASE, flash1_size, |
| 167 | (phys_flash = qemu_ram_alloc(flash1_size)) | | 167 | (phys_flash = qemu_ram_alloc(flash1_size)) | |
| 168 | IO_MEM_ROM); | 168 | IO_MEM_ROM); |
| @@ -171,7 +171,7 @@ static void sx1_init(ram_addr_t ram_size, | @@ -171,7 +171,7 @@ static void sx1_init(ram_addr_t ram_size, | ||
| 171 | OMAP_CS1_SIZE - flash1_size, io); | 171 | OMAP_CS1_SIZE - flash1_size, io); |
| 172 | 172 | ||
| 173 | if (!pflash_cfi01_register(OMAP_CS1_BASE, qemu_ram_alloc(flash1_size), | 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 | 4, 0, 0, 0, 0)) { | 175 | 4, 0, 0, 0, 0)) { |
| 176 | fprintf(stderr, "qemu: Error registering flash memory %d.\n", | 176 | fprintf(stderr, "qemu: Error registering flash memory %d.\n", |
| 177 | fl_idx); | 177 | fl_idx); |
hw/onenand.c
| @@ -618,7 +618,7 @@ static CPUWriteMemoryFunc *onenand_writefn[] = { | @@ -618,7 +618,7 @@ static CPUWriteMemoryFunc *onenand_writefn[] = { | ||
| 618 | void *onenand_init(uint32_t id, int regshift, qemu_irq irq) | 618 | void *onenand_init(uint32_t id, int regshift, qemu_irq irq) |
| 619 | { | 619 | { |
| 620 | OneNANDState *s = (OneNANDState *) qemu_mallocz(sizeof(*s)); | 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 | uint32_t size = 1 << (24 + ((id >> 12) & 7)); | 622 | uint32_t size = 1 << (24 + ((id >> 12) & 7)); |
| 623 | void *ram; | 623 | void *ram; |
| 624 | 624 | ||
| @@ -632,11 +632,11 @@ void *onenand_init(uint32_t id, int regshift, qemu_irq irq) | @@ -632,11 +632,11 @@ void *onenand_init(uint32_t id, int regshift, qemu_irq irq) | ||
| 632 | s->density_mask = (id & (1 << 11)) ? (1 << (6 + ((id >> 12) & 7))) : 0; | 632 | s->density_mask = (id & (1 << 11)) ? (1 << (6 + ((id >> 12) & 7))) : 0; |
| 633 | s->iomemtype = cpu_register_io_memory(onenand_readfn, | 633 | s->iomemtype = cpu_register_io_memory(onenand_readfn, |
| 634 | onenand_writefn, s); | 634 | onenand_writefn, s); |
| 635 | - if (bdrv_index == -1) | 635 | + if (!dinfo) |
| 636 | s->image = memset(qemu_malloc(size + (size >> 5)), | 636 | s->image = memset(qemu_malloc(size + (size >> 5)), |
| 637 | 0xff, size + (size >> 5)); | 637 | 0xff, size + (size >> 5)); |
| 638 | else | 638 | else |
| 639 | - s->bdrv = drives_table[bdrv_index].bdrv; | 639 | + s->bdrv = dinfo->bdrv; |
| 640 | s->otp = memset(qemu_malloc((64 + 2) << PAGE_SHIFT), | 640 | s->otp = memset(qemu_malloc((64 + 2) << PAGE_SHIFT), |
| 641 | 0xff, (64 + 2) << PAGE_SHIFT); | 641 | 0xff, (64 + 2) << PAGE_SHIFT); |
| 642 | s->ram = qemu_ram_alloc(0xc000 << s->shift); | 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,7 +1126,7 @@ static void pc_init1(ram_addr_t ram_size, | ||
| 1126 | CPUState *env; | 1126 | CPUState *env; |
| 1127 | qemu_irq *cpu_irq; | 1127 | qemu_irq *cpu_irq; |
| 1128 | qemu_irq *i8259; | 1128 | qemu_irq *i8259; |
| 1129 | - int index; | 1129 | + DriveInfo *dinfo; |
| 1130 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 1130 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 1131 | BlockDriverState *fd[MAX_FD]; | 1131 | BlockDriverState *fd[MAX_FD]; |
| 1132 | int using_vga = cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled; | 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,11 +1356,8 @@ static void pc_init1(ram_addr_t ram_size, | ||
| 1356 | } | 1356 | } |
| 1357 | 1357 | ||
| 1358 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | if (pci_enabled) { | 1363 | if (pci_enabled) { |
| @@ -1379,11 +1376,8 @@ static void pc_init1(ram_addr_t ram_size, | @@ -1379,11 +1376,8 @@ static void pc_init1(ram_addr_t ram_size, | ||
| 1379 | #endif | 1376 | #endif |
| 1380 | 1377 | ||
| 1381 | for(i = 0; i < MAX_FD; i++) { | 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 | floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd); | 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,12 +1431,11 @@ static void pc_init1(ram_addr_t ram_size, | ||
| 1437 | 1431 | ||
| 1438 | /* Add virtio block devices */ | 1432 | /* Add virtio block devices */ |
| 1439 | if (pci_enabled) { | 1433 | if (pci_enabled) { |
| 1440 | - int index; | ||
| 1441 | int unit_id = 0; | 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 | pci_dev = pci_create(virtio_blk_name, | 1437 | pci_dev = pci_create(virtio_blk_name, |
| 1445 | - drives_table[index].devaddr); | 1438 | + dinfo->devaddr); |
| 1446 | qdev_init(&pci_dev->qdev); | 1439 | qdev_init(&pci_dev->qdev); |
| 1447 | unit_id++; | 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,9 +52,10 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | ||
| 52 | { | 52 | { |
| 53 | int dom, pci_bus; | 53 | int dom, pci_bus; |
| 54 | unsigned slot; | 54 | unsigned slot; |
| 55 | - int drive_idx, type, bus; | 55 | + int type, bus; |
| 56 | int success = 0; | 56 | int success = 0; |
| 57 | PCIDevice *dev; | 57 | PCIDevice *dev; |
| 58 | + DriveInfo *dinfo; | ||
| 58 | 59 | ||
| 59 | if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) { | 60 | if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) { |
| 60 | return; | 61 | return; |
| @@ -66,21 +67,21 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | @@ -66,21 +67,21 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | ||
| 66 | return; | 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 | return; | 72 | return; |
| 72 | - if (drives_table[drive_idx].devaddr) { | 73 | + if (dinfo->devaddr) { |
| 73 | monitor_printf(mon, "Parameter addr not supported\n"); | 74 | monitor_printf(mon, "Parameter addr not supported\n"); |
| 74 | return; | 75 | return; |
| 75 | } | 76 | } |
| 76 | - type = drives_table[drive_idx].type; | 77 | + type = dinfo->type; |
| 77 | bus = drive_get_max_bus (type); | 78 | bus = drive_get_max_bus (type); |
| 78 | 79 | ||
| 79 | switch (type) { | 80 | switch (type) { |
| 80 | case IF_SCSI: | 81 | case IF_SCSI: |
| 81 | success = 1; | 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 | break; | 85 | break; |
| 85 | default: | 86 | default: |
| 86 | monitor_printf(mon, "Can't hot-add drive to type %d\n", type); | 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,8 +89,8 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | ||
| 88 | 89 | ||
| 89 | if (success) | 90 | if (success) |
| 90 | monitor_printf(mon, "OK bus %d, unit %d\n", | 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 | return; | 94 | return; |
| 94 | } | 95 | } |
| 95 | 96 | ||
| @@ -98,7 +99,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, | @@ -98,7 +99,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, | ||
| 98 | const char *opts) | 99 | const char *opts) |
| 99 | { | 100 | { |
| 100 | PCIDevice *dev; | 101 | PCIDevice *dev; |
| 101 | - int type = -1, drive_idx = -1; | 102 | + DriveInfo *dinfo; |
| 103 | + int type = -1; | ||
| 102 | char buf[128]; | 104 | char buf[128]; |
| 103 | 105 | ||
| 104 | if (get_param_value(buf, sizeof(buf), "if", opts)) { | 106 | if (get_param_value(buf, sizeof(buf), "if", opts)) { |
| @@ -116,10 +118,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, | @@ -116,10 +118,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, | ||
| 116 | } | 118 | } |
| 117 | 119 | ||
| 118 | if (get_param_value(buf, sizeof(buf), "file", opts)) { | 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 | return NULL; | 123 | return NULL; |
| 122 | - if (drives_table[drive_idx].devaddr) { | 124 | + if (dinfo->devaddr) { |
| 123 | monitor_printf(mon, "Parameter addr not supported\n"); | 125 | monitor_printf(mon, "Parameter addr not supported\n"); |
| 124 | return NULL; | 126 | return NULL; |
| 125 | } | 127 | } |
hw/petalogix_s3adsp1800_mmu.c
| @@ -106,6 +106,7 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size, | @@ -106,6 +106,7 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size, | ||
| 106 | DeviceState *dev; | 106 | DeviceState *dev; |
| 107 | CPUState *env; | 107 | CPUState *env; |
| 108 | int kernel_size; | 108 | int kernel_size; |
| 109 | + DriveInfo *dinfo; | ||
| 109 | int i; | 110 | int i; |
| 110 | target_phys_addr_t ddr_base = 0x90000000; | 111 | target_phys_addr_t ddr_base = 0x90000000; |
| 111 | ram_addr_t phys_lmb_bram; | 112 | ram_addr_t phys_lmb_bram; |
| @@ -131,9 +132,9 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size, | @@ -131,9 +132,9 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size, | ||
| 131 | cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM); | 132 | cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM); |
| 132 | 133 | ||
| 133 | phys_flash = qemu_ram_alloc(FLASH_SIZE); | 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 | pflash_cfi02_register(0xa0000000, phys_flash, | 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 | FLASH_SIZE >> 16, | 138 | FLASH_SIZE >> 16, |
| 138 | 1, 1, 0x0000, 0x0000, 0x0000, 0x0000, | 139 | 1, 1, 0x0000, 0x0000, 0x0000, 0x0000, |
| 139 | 0x555, 0x2aa); | 140 | 0x555, 0x2aa); |
hw/ppc405_boards.c
| @@ -188,7 +188,7 @@ static void ref405ep_init (ram_addr_t ram_size, | @@ -188,7 +188,7 @@ static void ref405ep_init (ram_addr_t ram_size, | ||
| 188 | int linux_boot; | 188 | int linux_boot; |
| 189 | int fl_idx, fl_sectors, len; | 189 | int fl_idx, fl_sectors, len; |
| 190 | int ppc_boot_device = boot_device[0]; | 190 | int ppc_boot_device = boot_device[0]; |
| 191 | - int index; | 191 | + DriveInfo *dinfo; |
| 192 | 192 | ||
| 193 | /* XXX: fix this */ | 193 | /* XXX: fix this */ |
| 194 | ram_bases[0] = qemu_ram_alloc(0x08000000); | 194 | ram_bases[0] = qemu_ram_alloc(0x08000000); |
| @@ -215,19 +215,19 @@ static void ref405ep_init (ram_addr_t ram_size, | @@ -215,19 +215,19 @@ static void ref405ep_init (ram_addr_t ram_size, | ||
| 215 | #endif | 215 | #endif |
| 216 | fl_idx = 0; | 216 | fl_idx = 0; |
| 217 | #ifdef USE_FLASH_BIOS | 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 | bios_offset = qemu_ram_alloc(bios_size); | 221 | bios_offset = qemu_ram_alloc(bios_size); |
| 222 | fl_sectors = (bios_size + 65535) >> 16; | 222 | fl_sectors = (bios_size + 65535) >> 16; |
| 223 | #ifdef DEBUG_BOARD_INIT | 223 | #ifdef DEBUG_BOARD_INIT |
| 224 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " | 224 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " |
| 225 | " addr " ADDRX " '%s' %d\n", | 225 | " addr " ADDRX " '%s' %d\n", |
| 226 | fl_idx, bios_size, bios_offset, -bios_size, | 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 | #endif | 228 | #endif |
| 229 | pflash_cfi02_register((uint32_t)(-bios_size), bios_offset, | 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 | 2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); | 231 | 2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); |
| 232 | fl_idx++; | 232 | fl_idx++; |
| 233 | } else | 233 | } else |
| @@ -509,7 +509,7 @@ static void taihu_405ep_init(ram_addr_t ram_size, | @@ -509,7 +509,7 @@ static void taihu_405ep_init(ram_addr_t ram_size, | ||
| 509 | int linux_boot; | 509 | int linux_boot; |
| 510 | int fl_idx, fl_sectors; | 510 | int fl_idx, fl_sectors; |
| 511 | int ppc_boot_device = boot_device[0]; | 511 | int ppc_boot_device = boot_device[0]; |
| 512 | - int index; | 512 | + DriveInfo *dinfo; |
| 513 | 513 | ||
| 514 | /* RAM is soldered to the board so the size cannot be changed */ | 514 | /* RAM is soldered to the board so the size cannot be changed */ |
| 515 | ram_bases[0] = qemu_ram_alloc(0x04000000); | 515 | ram_bases[0] = qemu_ram_alloc(0x04000000); |
| @@ -528,9 +528,9 @@ static void taihu_405ep_init(ram_addr_t ram_size, | @@ -528,9 +528,9 @@ static void taihu_405ep_init(ram_addr_t ram_size, | ||
| 528 | #endif | 528 | #endif |
| 529 | fl_idx = 0; | 529 | fl_idx = 0; |
| 530 | #if defined(USE_FLASH_BIOS) | 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 | /* XXX: should check that size is 2MB */ | 534 | /* XXX: should check that size is 2MB */ |
| 535 | // bios_size = 2 * 1024 * 1024; | 535 | // bios_size = 2 * 1024 * 1024; |
| 536 | fl_sectors = (bios_size + 65535) >> 16; | 536 | fl_sectors = (bios_size + 65535) >> 16; |
| @@ -539,10 +539,10 @@ static void taihu_405ep_init(ram_addr_t ram_size, | @@ -539,10 +539,10 @@ static void taihu_405ep_init(ram_addr_t ram_size, | ||
| 539 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " | 539 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " |
| 540 | " addr " ADDRX " '%s' %d\n", | 540 | " addr " ADDRX " '%s' %d\n", |
| 541 | fl_idx, bios_size, bios_offset, -bios_size, | 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 | #endif | 543 | #endif |
| 544 | pflash_cfi02_register((uint32_t)(-bios_size), bios_offset, | 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 | 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); | 546 | 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); |
| 547 | fl_idx++; | 547 | fl_idx++; |
| 548 | } else | 548 | } else |
| @@ -570,9 +570,9 @@ static void taihu_405ep_init(ram_addr_t ram_size, | @@ -570,9 +570,9 @@ static void taihu_405ep_init(ram_addr_t ram_size, | ||
| 570 | bios_size, bios_offset | IO_MEM_ROM); | 570 | bios_size, bios_offset | IO_MEM_ROM); |
| 571 | } | 571 | } |
| 572 | /* Register Linux flash */ | 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 | /* XXX: should check that size is 32MB */ | 576 | /* XXX: should check that size is 32MB */ |
| 577 | bios_size = 32 * 1024 * 1024; | 577 | bios_size = 32 * 1024 * 1024; |
| 578 | fl_sectors = (bios_size + 65535) >> 16; | 578 | fl_sectors = (bios_size + 65535) >> 16; |
| @@ -580,11 +580,11 @@ static void taihu_405ep_init(ram_addr_t ram_size, | @@ -580,11 +580,11 @@ static void taihu_405ep_init(ram_addr_t ram_size, | ||
| 580 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " | 580 | printf("Register parallel flash %d size " ADDRX " at offset %08lx " |
| 581 | " addr " ADDRX " '%s'\n", | 581 | " addr " ADDRX " '%s'\n", |
| 582 | fl_idx, bios_size, bios_offset, (target_ulong)0xfc000000, | 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 | #endif | 584 | #endif |
| 585 | bios_offset = qemu_ram_alloc(bios_size); | 585 | bios_offset = qemu_ram_alloc(bios_size); |
| 586 | pflash_cfi02_register(0xfc000000, bios_offset, | 586 | pflash_cfi02_register(0xfc000000, bios_offset, |
| 587 | - drives_table[index].bdrv, 65536, fl_sectors, 1, | 587 | + dinfo->bdrv, 65536, fl_sectors, 1, |
| 588 | 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); | 588 | 4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA); |
| 589 | fl_idx++; | 589 | fl_idx++; |
| 590 | } | 590 | } |
hw/ppc440_bamboo.c
| @@ -102,6 +102,7 @@ static void bamboo_init(ram_addr_t ram_size, | @@ -102,6 +102,7 @@ static void bamboo_init(ram_addr_t ram_size, | ||
| 102 | target_ulong dt_base = 0; | 102 | target_ulong dt_base = 0; |
| 103 | void *fdt; | 103 | void *fdt; |
| 104 | int i; | 104 | int i; |
| 105 | + DriveInfo *dinfo; | ||
| 105 | 106 | ||
| 106 | /* Setup CPU. */ | 107 | /* Setup CPU. */ |
| 107 | env = ppc440ep_init(&ram_size, &pcibus, pci_irq_nrs, 1, cpu_model); | 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,8 +111,8 @@ static void bamboo_init(ram_addr_t ram_size, | ||
| 110 | int unit_id = 0; | 111 | int unit_id = 0; |
| 111 | 112 | ||
| 112 | /* Add virtio block devices. */ | 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 | qdev_init(&pci_dev->qdev); | 116 | qdev_init(&pci_dev->qdev); |
| 116 | unit_id++; | 117 | unit_id++; |
| 117 | } | 118 | } |
hw/ppc_newworld.c
| @@ -106,7 +106,7 @@ static void ppc_core99_init (ram_addr_t ram_size, | @@ -106,7 +106,7 @@ static void ppc_core99_init (ram_addr_t ram_size, | ||
| 106 | qemu_irq *dummy_irq; | 106 | qemu_irq *dummy_irq; |
| 107 | int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index; | 107 | int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index; |
| 108 | int ppc_boot_device; | 108 | int ppc_boot_device; |
| 109 | - int index; | 109 | + DriveInfo *dinfo; |
| 110 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 110 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 111 | void *fw_cfg; | 111 | void *fw_cfg; |
| 112 | void *dbdma; | 112 | void *dbdma; |
| @@ -315,11 +315,8 @@ static void ppc_core99_init (ram_addr_t ram_size, | @@ -315,11 +315,8 @@ static void ppc_core99_init (ram_addr_t ram_size, | ||
| 315 | exit(1); | 315 | exit(1); |
| 316 | } | 316 | } |
| 317 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | dbdma = DBDMA_init(&dbdma_mem_index); | 321 | dbdma = DBDMA_init(&dbdma_mem_index); |
| 325 | pci_cmd646_ide_init(pci_bus, hd, 0); | 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,7 +135,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, | ||
| 135 | int escc_mem_index, ide_mem_index[2]; | 135 | int escc_mem_index, ide_mem_index[2]; |
| 136 | uint16_t ppc_boot_device; | 136 | uint16_t ppc_boot_device; |
| 137 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 137 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 138 | - int index; | 138 | + DriveInfo *dinfo; |
| 139 | void *fw_cfg; | 139 | void *fw_cfg; |
| 140 | void *dbdma; | 140 | void *dbdma; |
| 141 | uint8_t *vga_bios_ptr; | 141 | uint8_t *vga_bios_ptr; |
| @@ -328,31 +328,19 @@ static void ppc_heathrow_init (ram_addr_t ram_size, | @@ -328,31 +328,19 @@ static void ppc_heathrow_init (ram_addr_t ram_size, | ||
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | /* First IDE channel is a MAC IDE on the MacIO bus */ | 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 | dbdma = DBDMA_init(&dbdma_mem_index); | 335 | dbdma = DBDMA_init(&dbdma_mem_index); |
| 342 | ide_mem_index[0] = -1; | 336 | ide_mem_index[0] = -1; |
| 343 | ide_mem_index[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]); | 337 | ide_mem_index[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]); |
| 344 | 338 | ||
| 345 | /* Second IDE channel is a CMD646 on the PCI bus */ | 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 | hd[3] = hd[2] = NULL; | 344 | hd[3] = hd[2] = NULL; |
| 357 | pci_cmd646_ide_init(pci_bus, hd, 0); | 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,7 +550,7 @@ static void ppc_prep_init (ram_addr_t ram_size, | ||
| 550 | PCIBus *pci_bus; | 550 | PCIBus *pci_bus; |
| 551 | qemu_irq *i8259; | 551 | qemu_irq *i8259; |
| 552 | int ppc_boot_device; | 552 | int ppc_boot_device; |
| 553 | - int index; | 553 | + DriveInfo *dinfo; |
| 554 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 554 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 555 | BlockDriverState *fd[MAX_FD]; | 555 | BlockDriverState *fd[MAX_FD]; |
| 556 | 556 | ||
| @@ -691,11 +691,8 @@ static void ppc_prep_init (ram_addr_t ram_size, | @@ -691,11 +691,8 @@ static void ppc_prep_init (ram_addr_t ram_size, | ||
| 691 | } | 691 | } |
| 692 | 692 | ||
| 693 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | for(i = 0; i < MAX_IDE_BUS; i++) { | 698 | for(i = 0; i < MAX_IDE_BUS; i++) { |
| @@ -708,11 +705,8 @@ static void ppc_prep_init (ram_addr_t ram_size, | @@ -708,11 +705,8 @@ static void ppc_prep_init (ram_addr_t ram_size, | ||
| 708 | // SB16_init(); | 705 | // SB16_init(); |
| 709 | 706 | ||
| 710 | for(i = 0; i < MAX_FD; i++) { | 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 | fdctrl_init(i8259[6], 2, 0, 0x3f0, fd); | 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,6 +172,7 @@ static void mpc8544ds_init(ram_addr_t ram_size, | ||
| 172 | unsigned int pci_irq_nrs[4] = {1, 2, 3, 4}; | 172 | unsigned int pci_irq_nrs[4] = {1, 2, 3, 4}; |
| 173 | qemu_irq *irqs, *mpic, *pci_irqs; | 173 | qemu_irq *irqs, *mpic, *pci_irqs; |
| 174 | SerialState * serial[2]; | 174 | SerialState * serial[2]; |
| 175 | + DriveInfo *dinfo; | ||
| 175 | 176 | ||
| 176 | /* Setup CPU */ | 177 | /* Setup CPU */ |
| 177 | env = cpu_ppc_init("e500v2_v30"); | 178 | env = cpu_ppc_init("e500v2_v30"); |
| @@ -219,8 +220,8 @@ static void mpc8544ds_init(ram_addr_t ram_size, | @@ -219,8 +220,8 @@ static void mpc8544ds_init(ram_addr_t ram_size, | ||
| 219 | int unit_id = 0; | 220 | int unit_id = 0; |
| 220 | 221 | ||
| 221 | /* Add virtio block devices. */ | 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 | qdev_init(&pci_dev->qdev); | 225 | qdev_init(&pci_dev->qdev); |
| 225 | unit_id++; | 226 | unit_id++; |
| 226 | } | 227 | } |
hw/pxa2xx.c
| @@ -2034,7 +2034,7 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision) | @@ -2034,7 +2034,7 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision) | ||
| 2034 | { | 2034 | { |
| 2035 | PXA2xxState *s; | 2035 | PXA2xxState *s; |
| 2036 | int iomemtype, i; | 2036 | int iomemtype, i; |
| 2037 | - int index; | 2037 | + DriveInfo *dinfo; |
| 2038 | s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState)); | 2038 | s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState)); |
| 2039 | 2039 | ||
| 2040 | if (revision && strncmp(revision, "pxa27", 5)) { | 2040 | if (revision && strncmp(revision, "pxa27", 5)) { |
| @@ -2066,12 +2066,12 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision) | @@ -2066,12 +2066,12 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision) | ||
| 2066 | 2066 | ||
| 2067 | s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121); | 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 | fprintf(stderr, "qemu: missing SecureDigital device\n"); | 2071 | fprintf(stderr, "qemu: missing SecureDigital device\n"); |
| 2072 | exit(1); | 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 | s->pic[PXA2XX_PIC_MMC], s->dma); | 2075 | s->pic[PXA2XX_PIC_MMC], s->dma); |
| 2076 | 2076 | ||
| 2077 | for (i = 0; pxa270_serial[i].io_base; i ++) | 2077 | for (i = 0; pxa270_serial[i].io_base; i ++) |
| @@ -2153,7 +2153,7 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) | @@ -2153,7 +2153,7 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) | ||
| 2153 | { | 2153 | { |
| 2154 | PXA2xxState *s; | 2154 | PXA2xxState *s; |
| 2155 | int iomemtype, i; | 2155 | int iomemtype, i; |
| 2156 | - int index; | 2156 | + DriveInfo *dinfo; |
| 2157 | 2157 | ||
| 2158 | s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState)); | 2158 | s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState)); |
| 2159 | 2159 | ||
| @@ -2178,12 +2178,12 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) | @@ -2178,12 +2178,12 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) | ||
| 2178 | 2178 | ||
| 2179 | s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85); | 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 | fprintf(stderr, "qemu: missing SecureDigital device\n"); | 2183 | fprintf(stderr, "qemu: missing SecureDigital device\n"); |
| 2184 | exit(1); | 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 | s->pic[PXA2XX_PIC_MMC], s->dma); | 2187 | s->pic[PXA2XX_PIC_MMC], s->dma); |
| 2188 | 2188 | ||
| 2189 | for (i = 0; pxa255_serial[i].io_base; i ++) | 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,13 +267,10 @@ static int next_block_unit[IF_COUNT]; | ||
| 267 | BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type) | 267 | BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type) |
| 268 | { | 268 | { |
| 269 | int unit = next_block_unit[type]++; | 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 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name) | 276 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name) |
| @@ -296,14 +293,14 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach) | @@ -296,14 +293,14 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach) | ||
| 296 | { | 293 | { |
| 297 | int bus = next_scsi_bus++; | 294 | int bus = next_scsi_bus++; |
| 298 | int unit; | 295 | int unit; |
| 299 | - int index; | 296 | + DriveInfo *dinfo; |
| 300 | 297 | ||
| 301 | for (unit = 0; unit < MAX_SCSI_DEVS; unit++) { | 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 | continue; | 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,6 +203,7 @@ static void r2d_init(ram_addr_t ram_size, | ||
| 203 | ram_addr_t sdram_addr; | 203 | ram_addr_t sdram_addr; |
| 204 | qemu_irq *irq; | 204 | qemu_irq *irq; |
| 205 | PCIBus *pci; | 205 | PCIBus *pci; |
| 206 | + DriveInfo *dinfo; | ||
| 206 | int i; | 207 | int i; |
| 207 | 208 | ||
| 208 | if (!cpu_model) | 209 | if (!cpu_model) |
| @@ -225,9 +226,9 @@ static void r2d_init(ram_addr_t ram_size, | @@ -225,9 +226,9 @@ static void r2d_init(ram_addr_t ram_size, | ||
| 225 | sm501_init(0x10000000, SM501_VRAM_SIZE, irq[SM501], serial_hds[2]); | 226 | sm501_init(0x10000000, SM501_VRAM_SIZE, irq[SM501], serial_hds[2]); |
| 226 | 227 | ||
| 227 | /* onboard CF (True IDE mode, Master only). */ | 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 | mmio_ide_init(0x14001000, 0x1400080c, irq[CF_IDE], 1, | 230 | mmio_ide_init(0x14001000, 0x1400080c, irq[CF_IDE], 1, |
| 230 | - drives_table[i].bdrv, NULL); | 231 | + dinfo->bdrv, NULL); |
| 231 | 232 | ||
| 232 | /* NIC: rtl8139 on-board, and 2 slots. */ | 233 | /* NIC: rtl8139 on-board, and 2 slots. */ |
| 233 | for (i = 0; i < nb_nics; i++) | 234 | for (i = 0; i < nb_nics; i++) |
hw/spitz.c
| @@ -744,13 +744,13 @@ static void spitz_ssp_attach(PXA2xxState *cpu) | @@ -744,13 +744,13 @@ static void spitz_ssp_attach(PXA2xxState *cpu) | ||
| 744 | static void spitz_microdrive_attach(PXA2xxState *cpu, int slot) | 744 | static void spitz_microdrive_attach(PXA2xxState *cpu, int slot) |
| 745 | { | 745 | { |
| 746 | PCMCIACardState *md; | 746 | PCMCIACardState *md; |
| 747 | - int index; | ||
| 748 | BlockDriverState *bs; | 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 | return; | 752 | return; |
| 753 | - bs = drives_table[index].bdrv; | 753 | + bs = dinfo->bdrv; |
| 754 | if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) { | 754 | if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) { |
| 755 | md = dscm1xxxx_init(bs); | 755 | md = dscm1xxxx_init(bs); |
| 756 | pxa2xx_pcmcia_attach(cpu->pcmcia[slot], md); | 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,9 +581,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 581 | qemu_irq *cpu_halt; | 581 | qemu_irq *cpu_halt; |
| 582 | unsigned long kernel_size; | 582 | unsigned long kernel_size; |
| 583 | BlockDriverState *fd[MAX_FD]; | 583 | BlockDriverState *fd[MAX_FD]; |
| 584 | - int drive_index; | ||
| 585 | void *fw_cfg; | 584 | void *fw_cfg; |
| 586 | DeviceState *dev; | 585 | DeviceState *dev; |
| 586 | + DriveInfo *dinfo; | ||
| 587 | 587 | ||
| 588 | /* init CPUs */ | 588 | /* init CPUs */ |
| 589 | if (!cpu_model) | 589 | if (!cpu_model) |
| @@ -662,9 +662,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -662,9 +662,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 662 | if (hwdef->fd_base) { | 662 | if (hwdef->fd_base) { |
| 663 | /* there is zero or one floppy drive */ | 663 | /* there is zero or one floppy drive */ |
| 664 | memset(fd, 0, sizeof(fd)); | 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 | sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, | 669 | sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
| 670 | &fdc_tc); | 670 | &fdc_tc); |
| @@ -1507,10 +1507,10 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1507,10 +1507,10 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1507 | qemu_irq fdc_tc; | 1507 | qemu_irq fdc_tc; |
| 1508 | unsigned long kernel_size; | 1508 | unsigned long kernel_size; |
| 1509 | BlockDriverState *fd[MAX_FD]; | 1509 | BlockDriverState *fd[MAX_FD]; |
| 1510 | - int drive_index; | ||
| 1511 | void *fw_cfg; | 1510 | void *fw_cfg; |
| 1512 | DeviceState *dev; | 1511 | DeviceState *dev; |
| 1513 | unsigned int i; | 1512 | unsigned int i; |
| 1513 | + DriveInfo *dinfo; | ||
| 1514 | 1514 | ||
| 1515 | /* init CPU */ | 1515 | /* init CPU */ |
| 1516 | if (!cpu_model) | 1516 | if (!cpu_model) |
| @@ -1565,9 +1565,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1565,9 +1565,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1565 | if (hwdef->fd_base != (target_phys_addr_t)-1) { | 1565 | if (hwdef->fd_base != (target_phys_addr_t)-1) { |
| 1566 | /* there is zero or one floppy drive */ | 1566 | /* there is zero or one floppy drive */ |
| 1567 | memset(fd, 0, sizeof(fd)); | 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 | sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, | 1572 | sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
| 1573 | &fdc_tc); | 1573 | &fdc_tc); |
hw/sun4u.c
| @@ -557,10 +557,10 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -557,10 +557,10 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 557 | long initrd_size, kernel_size; | 557 | long initrd_size, kernel_size; |
| 558 | PCIBus *pci_bus, *pci_bus2, *pci_bus3; | 558 | PCIBus *pci_bus, *pci_bus2, *pci_bus3; |
| 559 | qemu_irq *irq; | 559 | qemu_irq *irq; |
| 560 | - int drive_index; | ||
| 561 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; | 560 | BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; |
| 562 | BlockDriverState *fd[MAX_FD]; | 561 | BlockDriverState *fd[MAX_FD]; |
| 563 | void *fw_cfg; | 562 | void *fw_cfg; |
| 563 | + DriveInfo *dinfo; | ||
| 564 | 564 | ||
| 565 | /* init CPUs */ | 565 | /* init CPUs */ |
| 566 | env = cpu_devinit(cpu_model, hwdef); | 566 | env = cpu_devinit(cpu_model, hwdef); |
| @@ -608,12 +608,9 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -608,12 +608,9 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 608 | exit(1); | 608 | exit(1); |
| 609 | } | 609 | } |
| 610 | for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) { | 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 | pci_cmd646_ide_init(pci_bus, hd, 1); | 616 | pci_cmd646_ide_init(pci_bus, hd, 1); |
| @@ -621,11 +618,8 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -621,11 +618,8 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 621 | /* FIXME: wire up interrupts. */ | 618 | /* FIXME: wire up interrupts. */ |
| 622 | i8042_init(NULL/*1*/, NULL/*12*/, 0x60); | 619 | i8042_init(NULL/*1*/, NULL/*12*/, 0x60); |
| 623 | for(i = 0; i < MAX_FD; i++) { | 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 | floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd); | 624 | floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd); |
| 631 | nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59); | 625 | nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59); |
hw/tosa.c
| @@ -49,13 +49,13 @@ | @@ -49,13 +49,13 @@ | ||
| 49 | static void tosa_microdrive_attach(PXA2xxState *cpu) | 49 | static void tosa_microdrive_attach(PXA2xxState *cpu) |
| 50 | { | 50 | { |
| 51 | PCMCIACardState *md; | 51 | PCMCIACardState *md; |
| 52 | - int index; | ||
| 53 | BlockDriverState *bs; | 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 | return; | 57 | return; |
| 58 | - bs = drives_table[index].bdrv; | 58 | + bs = dinfo->bdrv; |
| 59 | if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) { | 59 | if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) { |
| 60 | md = dscm1xxxx_init(bs); | 60 | md = dscm1xxxx_init(bs); |
| 61 | pxa2xx_pcmcia_attach(cpu->pcmcia[0], md); | 61 | pxa2xx_pcmcia_attach(cpu->pcmcia[0], md); |
hw/xen_disk.c
| @@ -107,7 +107,7 @@ struct XenBlkDev { | @@ -107,7 +107,7 @@ struct XenBlkDev { | ||
| 107 | int requests_finished; | 107 | int requests_finished; |
| 108 | 108 | ||
| 109 | /* qemu block driver */ | 109 | /* qemu block driver */ |
| 110 | - int index; | 110 | + DriveInfo *dinfo; |
| 111 | BlockDriverState *bs; | 111 | BlockDriverState *bs; |
| 112 | QEMUBH *bh; | 112 | QEMUBH *bh; |
| 113 | }; | 113 | }; |
| @@ -575,7 +575,7 @@ static void blk_alloc(struct XenDevice *xendev) | @@ -575,7 +575,7 @@ static void blk_alloc(struct XenDevice *xendev) | ||
| 575 | static int blk_init(struct XenDevice *xendev) | 575 | static int blk_init(struct XenDevice *xendev) |
| 576 | { | 576 | { |
| 577 | struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); | 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 | char *h; | 579 | char *h; |
| 580 | 580 | ||
| 581 | /* read xenstore entries */ | 581 | /* read xenstore entries */ |
| @@ -622,9 +622,9 @@ static int blk_init(struct XenDevice *xendev) | @@ -622,9 +622,9 @@ static int blk_init(struct XenDevice *xendev) | ||
| 622 | info |= VDISK_CDROM; | 622 | info |= VDISK_CDROM; |
| 623 | 623 | ||
| 624 | /* init qemu block driver */ | 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 | /* setup via xenbus -> create new block driver instance */ | 628 | /* setup via xenbus -> create new block driver instance */ |
| 629 | xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n"); | 629 | xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n"); |
| 630 | blkdev->bs = bdrv_new(blkdev->dev); | 630 | blkdev->bs = bdrv_new(blkdev->dev); |
| @@ -640,7 +640,7 @@ static int blk_init(struct XenDevice *xendev) | @@ -640,7 +640,7 @@ static int blk_init(struct XenDevice *xendev) | ||
| 640 | } else { | 640 | } else { |
| 641 | /* setup via qemu cmdline -> already setup for us */ | 641 | /* setup via qemu cmdline -> already setup for us */ |
| 642 | xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n"); | 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 | blkdev->file_blk = BLOCK_SIZE; | 645 | blkdev->file_blk = BLOCK_SIZE; |
| 646 | blkdev->file_size = bdrv_getlength(blkdev->bs); | 646 | blkdev->file_size = bdrv_getlength(blkdev->bs); |
| @@ -729,7 +729,7 @@ static void blk_disconnect(struct XenDevice *xendev) | @@ -729,7 +729,7 @@ static void blk_disconnect(struct XenDevice *xendev) | ||
| 729 | struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); | 729 | struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); |
| 730 | 730 | ||
| 731 | if (blkdev->bs) { | 731 | if (blkdev->bs) { |
| 732 | - if (blkdev->index == -1) { | 732 | + if (!blkdev->dinfo) { |
| 733 | /* close/delete only if we created it ourself */ | 733 | /* close/delete only if we created it ourself */ |
| 734 | bdrv_close(blkdev->bs); | 734 | bdrv_close(blkdev->bs); |
| 735 | bdrv_delete(blkdev->bs); | 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,7 +40,8 @@ static void xen_init_pv(ram_addr_t ram_size, | ||
| 40 | const char *cpu_model) | 40 | const char *cpu_model) |
| 41 | { | 41 | { |
| 42 | CPUState *env; | 42 | CPUState *env; |
| 43 | - int i, index; | 43 | + DriveInfo *dinfo; |
| 44 | + int i; | ||
| 44 | 45 | ||
| 45 | /* Initialize a dummy CPU */ | 46 | /* Initialize a dummy CPU */ |
| 46 | if (cpu_model == NULL) { | 47 | if (cpu_model == NULL) { |
| @@ -90,10 +91,10 @@ static void xen_init_pv(ram_addr_t ram_size, | @@ -90,10 +91,10 @@ static void xen_init_pv(ram_addr_t ram_size, | ||
| 90 | 91 | ||
| 91 | /* configure disks */ | 92 | /* configure disks */ |
| 92 | for (i = 0; i < 16; i++) { | 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 | continue; | 96 | continue; |
| 96 | - xen_config_dev_blk(drives_table + index); | 97 | + xen_config_dev_blk(dinfo); |
| 97 | } | 98 | } |
| 98 | 99 | ||
| 99 | /* configure nics */ | 100 | /* configure nics */ |
monitor.c
| @@ -253,13 +253,15 @@ static void help_cmd(Monitor *mon, const char *name) | @@ -253,13 +253,15 @@ static void help_cmd(Monitor *mon, const char *name) | ||
| 253 | 253 | ||
| 254 | static void do_commit(Monitor *mon, const char *device) | 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 | all_devices = !strcmp(device, "all"); | 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,9 +350,9 @@ static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch) | ||
| 350 | } | 350 | } |
| 351 | case 's': | 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 | break; | 358 | break; |
savevm.c
| @@ -1011,12 +1011,12 @@ static int bdrv_has_snapshot(BlockDriverState *bs) | @@ -1011,12 +1011,12 @@ static int bdrv_has_snapshot(BlockDriverState *bs) | ||
| 1011 | static BlockDriverState *get_bs_snapshots(void) | 1011 | static BlockDriverState *get_bs_snapshots(void) |
| 1012 | { | 1012 | { |
| 1013 | BlockDriverState *bs; | 1013 | BlockDriverState *bs; |
| 1014 | - int i; | 1014 | + DriveInfo *dinfo; |
| 1015 | 1015 | ||
| 1016 | if (bs_snapshots) | 1016 | if (bs_snapshots) |
| 1017 | return bs_snapshots; | 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 | if (bdrv_can_snapshot(bs)) | 1020 | if (bdrv_can_snapshot(bs)) |
| 1021 | goto ok; | 1021 | goto ok; |
| 1022 | } | 1022 | } |
| @@ -1050,9 +1050,10 @@ static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, | @@ -1050,9 +1050,10 @@ static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, | ||
| 1050 | 1050 | ||
| 1051 | void do_savevm(Monitor *mon, const char *name) | 1051 | void do_savevm(Monitor *mon, const char *name) |
| 1052 | { | 1052 | { |
| 1053 | + DriveInfo *dinfo; | ||
| 1053 | BlockDriverState *bs, *bs1; | 1054 | BlockDriverState *bs, *bs1; |
| 1054 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; | 1055 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; |
| 1055 | - int must_delete, ret, i; | 1056 | + int must_delete, ret; |
| 1056 | QEMUFile *f; | 1057 | QEMUFile *f; |
| 1057 | int saved_vm_running; | 1058 | int saved_vm_running; |
| 1058 | uint32_t vm_state_size; | 1059 | uint32_t vm_state_size; |
| @@ -1118,8 +1119,8 @@ void do_savevm(Monitor *mon, const char *name) | @@ -1118,8 +1119,8 @@ void do_savevm(Monitor *mon, const char *name) | ||
| 1118 | 1119 | ||
| 1119 | /* create the snapshots */ | 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 | if (bdrv_has_snapshot(bs1)) { | 1124 | if (bdrv_has_snapshot(bs1)) { |
| 1124 | if (must_delete) { | 1125 | if (must_delete) { |
| 1125 | ret = bdrv_snapshot_delete(bs1, old_sn->id_str); | 1126 | ret = bdrv_snapshot_delete(bs1, old_sn->id_str); |
| @@ -1146,10 +1147,11 @@ void do_savevm(Monitor *mon, const char *name) | @@ -1146,10 +1147,11 @@ void do_savevm(Monitor *mon, const char *name) | ||
| 1146 | 1147 | ||
| 1147 | void do_loadvm(Monitor *mon, const char *name) | 1148 | void do_loadvm(Monitor *mon, const char *name) |
| 1148 | { | 1149 | { |
| 1150 | + DriveInfo *dinfo; | ||
| 1149 | BlockDriverState *bs, *bs1; | 1151 | BlockDriverState *bs, *bs1; |
| 1150 | QEMUSnapshotInfo sn; | 1152 | QEMUSnapshotInfo sn; |
| 1151 | QEMUFile *f; | 1153 | QEMUFile *f; |
| 1152 | - int i, ret; | 1154 | + int ret; |
| 1153 | int saved_vm_running; | 1155 | int saved_vm_running; |
| 1154 | 1156 | ||
| 1155 | bs = get_bs_snapshots(); | 1157 | bs = get_bs_snapshots(); |
| @@ -1164,8 +1166,8 @@ void do_loadvm(Monitor *mon, const char *name) | @@ -1164,8 +1166,8 @@ void do_loadvm(Monitor *mon, const char *name) | ||
| 1164 | saved_vm_running = vm_running; | 1166 | saved_vm_running = vm_running; |
| 1165 | vm_stop(0); | 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 | if (bdrv_has_snapshot(bs1)) { | 1171 | if (bdrv_has_snapshot(bs1)) { |
| 1170 | ret = bdrv_snapshot_goto(bs1, name); | 1172 | ret = bdrv_snapshot_goto(bs1, name); |
| 1171 | if (ret < 0) { | 1173 | if (ret < 0) { |
| @@ -1217,8 +1219,9 @@ void do_loadvm(Monitor *mon, const char *name) | @@ -1217,8 +1219,9 @@ void do_loadvm(Monitor *mon, const char *name) | ||
| 1217 | 1219 | ||
| 1218 | void do_delvm(Monitor *mon, const char *name) | 1220 | void do_delvm(Monitor *mon, const char *name) |
| 1219 | { | 1221 | { |
| 1222 | + DriveInfo *dinfo; | ||
| 1220 | BlockDriverState *bs, *bs1; | 1223 | BlockDriverState *bs, *bs1; |
| 1221 | - int i, ret; | 1224 | + int ret; |
| 1222 | 1225 | ||
| 1223 | bs = get_bs_snapshots(); | 1226 | bs = get_bs_snapshots(); |
| 1224 | if (!bs) { | 1227 | if (!bs) { |
| @@ -1226,8 +1229,8 @@ void do_delvm(Monitor *mon, const char *name) | @@ -1226,8 +1229,8 @@ void do_delvm(Monitor *mon, const char *name) | ||
| 1226 | return; | 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 | if (bdrv_has_snapshot(bs1)) { | 1234 | if (bdrv_has_snapshot(bs1)) { |
| 1232 | ret = bdrv_snapshot_delete(bs1, name); | 1235 | ret = bdrv_snapshot_delete(bs1, name); |
| 1233 | if (ret < 0) { | 1236 | if (ret < 0) { |
| @@ -1245,6 +1248,7 @@ void do_delvm(Monitor *mon, const char *name) | @@ -1245,6 +1248,7 @@ void do_delvm(Monitor *mon, const char *name) | ||
| 1245 | 1248 | ||
| 1246 | void do_info_snapshots(Monitor *mon) | 1249 | void do_info_snapshots(Monitor *mon) |
| 1247 | { | 1250 | { |
| 1251 | + DriveInfo *dinfo; | ||
| 1248 | BlockDriverState *bs, *bs1; | 1252 | BlockDriverState *bs, *bs1; |
| 1249 | QEMUSnapshotInfo *sn_tab, *sn; | 1253 | QEMUSnapshotInfo *sn_tab, *sn; |
| 1250 | int nb_sns, i; | 1254 | int nb_sns, i; |
| @@ -1256,8 +1260,8 @@ void do_info_snapshots(Monitor *mon) | @@ -1256,8 +1260,8 @@ void do_info_snapshots(Monitor *mon) | ||
| 1256 | return; | 1260 | return; |
| 1257 | } | 1261 | } |
| 1258 | monitor_printf(mon, "Snapshot devices:"); | 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 | if (bdrv_has_snapshot(bs1)) { | 1265 | if (bdrv_has_snapshot(bs1)) { |
| 1262 | if (bs == bs1) | 1266 | if (bs == bs1) |
| 1263 | monitor_printf(mon, " %s", bdrv_get_device_name(bs1)); | 1267 | monitor_printf(mon, " %s", bdrv_get_device_name(bs1)); |
sysemu.h
| @@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
| 3 | /* Misc. things related to the system emulator. */ | 3 | /* Misc. things related to the system emulator. */ |
| 4 | 4 | ||
| 5 | #include "qemu-common.h" | 5 | #include "qemu-common.h" |
| 6 | +#include "sys-queue.h" | ||
| 6 | 7 | ||
| 7 | #ifdef _WIN32 | 8 | #ifdef _WIN32 |
| 8 | #include <windows.h> | 9 | #include <windows.h> |
| @@ -164,20 +165,19 @@ typedef struct DriveInfo { | @@ -164,20 +165,19 @@ typedef struct DriveInfo { | ||
| 164 | BlockInterfaceType type; | 165 | BlockInterfaceType type; |
| 165 | int bus; | 166 | int bus; |
| 166 | int unit; | 167 | int unit; |
| 167 | - int used; | ||
| 168 | int drive_opt_idx; | 168 | int drive_opt_idx; |
| 169 | BlockInterfaceErrorAction onerror; | 169 | BlockInterfaceErrorAction onerror; |
| 170 | char serial[BLOCK_SERIAL_STRLEN + 1]; | 170 | char serial[BLOCK_SERIAL_STRLEN + 1]; |
| 171 | + TAILQ_ENTRY(DriveInfo) next; | ||
| 171 | } DriveInfo; | 172 | } DriveInfo; |
| 172 | 173 | ||
| 173 | #define MAX_IDE_DEVS 2 | 174 | #define MAX_IDE_DEVS 2 |
| 174 | #define MAX_SCSI_DEVS 7 | 175 | #define MAX_SCSI_DEVS 7 |
| 175 | #define MAX_DRIVES 32 | 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 | extern int drive_get_max_bus(BlockInterfaceType type); | 181 | extern int drive_get_max_bus(BlockInterfaceType type); |
| 182 | extern void drive_uninit(BlockDriverState *bdrv); | 182 | extern void drive_uninit(BlockDriverState *bdrv); |
| 183 | extern void drive_remove(int index); | 183 | extern void drive_remove(int index); |
| @@ -196,7 +196,8 @@ extern struct drive_opt drives_opt[MAX_DRIVES]; | @@ -196,7 +196,8 @@ extern struct drive_opt drives_opt[MAX_DRIVES]; | ||
| 196 | extern int nb_drives_opt; | 196 | extern int nb_drives_opt; |
| 197 | 197 | ||
| 198 | extern int drive_add(const char *file, const char *fmt, ...); | 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 | /* acpi */ | 202 | /* acpi */ |
| 202 | typedef void (*qemu_system_device_hot_add_t)(int pcibus, int slot, int state); | 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,7 +208,7 @@ void qemu_system_device_hot_add(int pcibus, int slot, int state); | ||
| 207 | 208 | ||
| 208 | typedef int (dev_match_fn)(void *dev_private, void *arg); | 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 | void destroy_nic(dev_match_fn *match_fn, void *arg); | 212 | void destroy_nic(dev_match_fn *match_fn, void *arg); |
| 212 | void destroy_bdrvs(dev_match_fn *match_fn, void *arg); | 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,8 +180,7 @@ static const char *data_dir; | ||
| 180 | const char *bios_name = NULL; | 180 | const char *bios_name = NULL; |
| 181 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available | 181 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available |
| 182 | to store the VM snapshots */ | 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 | enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; | 184 | enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; |
| 186 | static DisplayState *display_state; | 185 | static DisplayState *display_state; |
| 187 | DisplayType display_type = DT_DEFAULT; | 186 | DisplayType display_type = DT_DEFAULT; |
| @@ -1879,19 +1878,6 @@ static int drive_opt_get_free_idx(void) | @@ -1879,19 +1878,6 @@ static int drive_opt_get_free_idx(void) | ||
| 1879 | return -1; | 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 | int drive_add(const char *file, const char *fmt, ...) | 1881 | int drive_add(const char *file, const char *fmt, ...) |
| 1896 | { | 1882 | { |
| 1897 | va_list ap; | 1883 | va_list ap; |
| @@ -1918,54 +1904,56 @@ void drive_remove(int index) | @@ -1918,54 +1904,56 @@ void drive_remove(int index) | ||
| 1918 | nb_drives_opt--; | 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 | /* seek interface, bus and unit */ | 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 | int drive_get_max_bus(BlockInterfaceType type) | 1923 | int drive_get_max_bus(BlockInterfaceType type) |
| 1938 | { | 1924 | { |
| 1939 | int max_bus; | 1925 | int max_bus; |
| 1940 | - int index; | 1926 | + DriveInfo *dinfo; |
| 1941 | 1927 | ||
| 1942 | max_bus = -1; | 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 | return max_bus; | 1934 | return max_bus; |
| 1949 | } | 1935 | } |
| 1950 | 1936 | ||
| 1951 | const char *drive_get_serial(BlockDriverState *bdrv) | 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 | return "\0"; | 1946 | return "\0"; |
| 1960 | } | 1947 | } |
| 1961 | 1948 | ||
| 1962 | BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv) | 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 | return BLOCK_ERR_STOP_ENOSPC; | 1958 | return BLOCK_ERR_STOP_ENOSPC; |
| 1971 | } | 1959 | } |
| @@ -1977,19 +1965,20 @@ static void bdrv_format_print(void *opaque, const char *name) | @@ -1977,19 +1965,20 @@ static void bdrv_format_print(void *opaque, const char *name) | ||
| 1977 | 1965 | ||
| 1978 | void drive_uninit(BlockDriverState *bdrv) | 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 | char buf[128]; | 1983 | char buf[128]; |
| 1995 | char file[1024]; | 1984 | char file[1024]; |
| @@ -2008,7 +1997,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2008,7 +1997,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2008 | int cache; | 1997 | int cache; |
| 2009 | int bdrv_flags, onerror; | 1998 | int bdrv_flags, onerror; |
| 2010 | const char *devaddr; | 1999 | const char *devaddr; |
| 2011 | - int drives_table_idx; | 2000 | + DriveInfo *dinfo; |
| 2012 | char *str = arg->opt; | 2001 | char *str = arg->opt; |
| 2013 | static const char * const params[] = { "bus", "unit", "if", "index", | 2002 | static const char * const params[] = { "bus", "unit", "if", "index", |
| 2014 | "cyls", "heads", "secs", "trans", | 2003 | "cyls", "heads", "secs", "trans", |
| @@ -2016,11 +2005,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2016,11 +2005,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2016 | "cache", "format", "serial", | 2005 | "cache", "format", "serial", |
| 2017 | "werror", "addr", | 2006 | "werror", "addr", |
| 2018 | NULL }; | 2007 | NULL }; |
| 2008 | + *fatal_error = 1; | ||
| 2019 | 2009 | ||
| 2020 | if (check_params(buf, sizeof(buf), params, str) < 0) { | 2010 | if (check_params(buf, sizeof(buf), params, str) < 0) { |
| 2021 | fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", | 2011 | fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", |
| 2022 | buf, str); | 2012 | buf, str); |
| 2023 | - return -1; | 2013 | + return NULL; |
| 2024 | } | 2014 | } |
| 2025 | 2015 | ||
| 2026 | file[0] = 0; | 2016 | file[0] = 0; |
| @@ -2048,7 +2038,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2048,7 +2038,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2048 | bus_id = strtol(buf, NULL, 0); | 2038 | bus_id = strtol(buf, NULL, 0); |
| 2049 | if (bus_id < 0) { | 2039 | if (bus_id < 0) { |
| 2050 | fprintf(stderr, "qemu: '%s' invalid bus id\n", str); | 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,7 +2046,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2056 | unit_id = strtol(buf, NULL, 0); | 2046 | unit_id = strtol(buf, NULL, 0); |
| 2057 | if (unit_id < 0) { | 2047 | if (unit_id < 0) { |
| 2058 | fprintf(stderr, "qemu: '%s' invalid unit id\n", str); | 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,7 +2078,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2088 | max_devs = 0; | 2078 | max_devs = 0; |
| 2089 | } else { | 2079 | } else { |
| 2090 | fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf); | 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,7 +2086,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2096 | index = strtol(buf, NULL, 0); | 2086 | index = strtol(buf, NULL, 0); |
| 2097 | if (index < 0) { | 2087 | if (index < 0) { |
| 2098 | fprintf(stderr, "qemu: '%s' invalid index\n", str); | 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,15 +2105,15 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2115 | if (cyls || heads || secs) { | 2105 | if (cyls || heads || secs) { |
| 2116 | if (cyls < 1 || cyls > 16383) { | 2106 | if (cyls < 1 || cyls > 16383) { |
| 2117 | fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str); | 2107 | fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str); |
| 2118 | - return -1; | 2108 | + return NULL; |
| 2119 | } | 2109 | } |
| 2120 | if (heads < 1 || heads > 16) { | 2110 | if (heads < 1 || heads > 16) { |
| 2121 | fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str); | 2111 | fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str); |
| 2122 | - return -1; | 2112 | + return NULL; |
| 2123 | } | 2113 | } |
| 2124 | if (secs < 1 || secs > 63) { | 2114 | if (secs < 1 || secs > 63) { |
| 2125 | fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str); | 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,7 +2122,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2132 | fprintf(stderr, | 2122 | fprintf(stderr, |
| 2133 | "qemu: '%s' trans must be used with cyls,heads and secs\n", | 2123 | "qemu: '%s' trans must be used with cyls,heads and secs\n", |
| 2134 | str); | 2124 | str); |
| 2135 | - return -1; | 2125 | + return NULL; |
| 2136 | } | 2126 | } |
| 2137 | if (!strcmp(buf, "none")) | 2127 | if (!strcmp(buf, "none")) |
| 2138 | translation = BIOS_ATA_TRANSLATION_NONE; | 2128 | translation = BIOS_ATA_TRANSLATION_NONE; |
| @@ -2142,7 +2132,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2142,7 +2132,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2142 | translation = BIOS_ATA_TRANSLATION_AUTO; | 2132 | translation = BIOS_ATA_TRANSLATION_AUTO; |
| 2143 | else { | 2133 | else { |
| 2144 | fprintf(stderr, "qemu: '%s' invalid translation type\n", str); | 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,12 +2143,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2153 | if (cyls || secs || heads) { | 2143 | if (cyls || secs || heads) { |
| 2154 | fprintf(stderr, | 2144 | fprintf(stderr, |
| 2155 | "qemu: '%s' invalid physical CHS format\n", str); | 2145 | "qemu: '%s' invalid physical CHS format\n", str); |
| 2156 | - return -1; | 2146 | + return NULL; |
| 2157 | } | 2147 | } |
| 2158 | media = MEDIA_CDROM; | 2148 | media = MEDIA_CDROM; |
| 2159 | } else { | 2149 | } else { |
| 2160 | fprintf(stderr, "qemu: '%s' invalid media\n", str); | 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,7 +2159,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2169 | snapshot = 0; | 2159 | snapshot = 0; |
| 2170 | else { | 2160 | else { |
| 2171 | fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str); | 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,7 +2172,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2182 | cache = 2; | 2172 | cache = 2; |
| 2183 | else { | 2173 | else { |
| 2184 | fprintf(stderr, "qemu: invalid cache option\n"); | 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,12 +2181,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2191 | fprintf(stderr, "qemu: Supported formats:"); | 2181 | fprintf(stderr, "qemu: Supported formats:"); |
| 2192 | bdrv_iterate_format(bdrv_format_print, NULL); | 2182 | bdrv_iterate_format(bdrv_format_print, NULL); |
| 2193 | fprintf(stderr, "\n"); | 2183 | fprintf(stderr, "\n"); |
| 2194 | - return -1; | 2184 | + return NULL; |
| 2195 | } | 2185 | } |
| 2196 | drv = bdrv_find_format(buf); | 2186 | drv = bdrv_find_format(buf); |
| 2197 | if (!drv) { | 2187 | if (!drv) { |
| 2198 | fprintf(stderr, "qemu: '%s' invalid format\n", buf); | 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,7 +2202,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2212 | if (get_param_value(buf, sizeof(serial), "werror", str)) { | 2202 | if (get_param_value(buf, sizeof(serial), "werror", str)) { |
| 2213 | if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) { | 2203 | if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) { |
| 2214 | fprintf(stderr, "werror is no supported by this format\n"); | 2204 | fprintf(stderr, "werror is no supported by this format\n"); |
| 2215 | - return -1; | 2205 | + return NULL; |
| 2216 | } | 2206 | } |
| 2217 | if (!strcmp(buf, "ignore")) | 2207 | if (!strcmp(buf, "ignore")) |
| 2218 | onerror = BLOCK_ERR_IGNORE; | 2208 | onerror = BLOCK_ERR_IGNORE; |
| @@ -2224,7 +2214,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2224,7 +2214,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2224 | onerror = BLOCK_ERR_REPORT; | 2214 | onerror = BLOCK_ERR_REPORT; |
| 2225 | else { | 2215 | else { |
| 2226 | fprintf(stderr, "qemu: '%s' invalid write error action\n", buf); | 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,7 +2222,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2232 | if (get_param_value(buf, sizeof(buf), "addr", str)) { | 2222 | if (get_param_value(buf, sizeof(buf), "addr", str)) { |
| 2233 | if (type != IF_VIRTIO) { | 2223 | if (type != IF_VIRTIO) { |
| 2234 | fprintf(stderr, "addr is not supported by in '%s'\n", str); | 2224 | fprintf(stderr, "addr is not supported by in '%s'\n", str); |
| 2235 | - return -1; | 2225 | + return NULL; |
| 2236 | } | 2226 | } |
| 2237 | devaddr = strdup(buf); | 2227 | devaddr = strdup(buf); |
| 2238 | } | 2228 | } |
| @@ -2243,7 +2233,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2243,7 +2233,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2243 | if (bus_id != 0 || unit_id != -1) { | 2233 | if (bus_id != 0 || unit_id != -1) { |
| 2244 | fprintf(stderr, | 2234 | fprintf(stderr, |
| 2245 | "qemu: '%s' index cannot be used with bus and unit\n", str); | 2235 | "qemu: '%s' index cannot be used with bus and unit\n", str); |
| 2246 | - return -1; | 2236 | + return NULL; |
| 2247 | } | 2237 | } |
| 2248 | if (max_devs == 0) | 2238 | if (max_devs == 0) |
| 2249 | { | 2239 | { |
| @@ -2261,7 +2251,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2261,7 +2251,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2261 | 2251 | ||
| 2262 | if (unit_id == -1) { | 2252 | if (unit_id == -1) { |
| 2263 | unit_id = 0; | 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 | unit_id++; | 2255 | unit_id++; |
| 2266 | if (max_devs && unit_id >= max_devs) { | 2256 | if (max_devs && unit_id >= max_devs) { |
| 2267 | unit_id -= max_devs; | 2257 | unit_id -= max_devs; |
| @@ -2275,15 +2265,17 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2275,15 +2265,17 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2275 | if (max_devs && unit_id >= max_devs) { | 2265 | if (max_devs && unit_id >= max_devs) { |
| 2276 | fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n", | 2266 | fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n", |
| 2277 | str, unit_id, max_devs - 1); | 2267 | str, unit_id, max_devs - 1); |
| 2278 | - return -1; | 2268 | + return NULL; |
| 2279 | } | 2269 | } |
| 2280 | 2270 | ||
| 2281 | /* | 2271 | /* |
| 2282 | * ignore multiple definitions | 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 | /* init */ | 2280 | /* init */ |
| 2289 | 2281 | ||
| @@ -2296,16 +2288,16 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2296,16 +2288,16 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2296 | snprintf(buf, sizeof(buf), "%s%s%i", | 2288 | snprintf(buf, sizeof(buf), "%s%s%i", |
| 2297 | devname, mediastr, unit_id); | 2289 | devname, mediastr, unit_id); |
| 2298 | bdrv = bdrv_new(buf); | 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 | switch(type) { | 2302 | switch(type) { |
| 2311 | case IF_IDE: | 2303 | case IF_IDE: |
| @@ -2336,8 +2328,10 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2336,8 +2328,10 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2336 | case IF_COUNT: | 2328 | case IF_COUNT: |
| 2337 | abort(); | 2329 | abort(); |
| 2338 | } | 2330 | } |
| 2339 | - if (!file[0]) | ||
| 2340 | - return -2; | 2331 | + if (!file[0]) { |
| 2332 | + *fatal_error = 0; | ||
| 2333 | + return NULL; | ||
| 2334 | + } | ||
| 2341 | bdrv_flags = 0; | 2335 | bdrv_flags = 0; |
| 2342 | if (snapshot) { | 2336 | if (snapshot) { |
| 2343 | bdrv_flags |= BDRV_O_SNAPSHOT; | 2337 | bdrv_flags |= BDRV_O_SNAPSHOT; |
| @@ -2350,11 +2344,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2350,11 +2344,12 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
| 2350 | if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) { | 2344 | if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) { |
| 2351 | fprintf(stderr, "qemu: could not open disk image %s\n", | 2345 | fprintf(stderr, "qemu: could not open disk image %s\n", |
| 2352 | file); | 2346 | file); |
| 2353 | - return -1; | 2347 | + return NULL; |
| 2354 | } | 2348 | } |
| 2355 | if (bdrv_key_required(bdrv)) | 2349 | if (bdrv_key_required(bdrv)) |
| 2356 | autostart = 0; | 2350 | autostart = 0; |
| 2357 | - return drives_table_idx; | 2351 | + *fatal_error = 0; |
| 2352 | + return dinfo; | ||
| 2358 | } | 2353 | } |
| 2359 | 2354 | ||
| 2360 | void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque) | 2355 | void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque) |
| @@ -4981,7 +4976,6 @@ int main(int argc, char **argv, char **envp) | @@ -4981,7 +4976,6 @@ int main(int argc, char **argv, char **envp) | ||
| 4981 | } | 4976 | } |
| 4982 | 4977 | ||
| 4983 | nb_net_clients = 0; | 4978 | nb_net_clients = 0; |
| 4984 | - nb_drives = 0; | ||
| 4985 | nb_drives_opt = 0; | 4979 | nb_drives_opt = 0; |
| 4986 | nb_numa_nodes = 0; | 4980 | nb_numa_nodes = 0; |
| 4987 | hda_index = -1; | 4981 | hda_index = -1; |
| @@ -5854,9 +5848,12 @@ int main(int argc, char **argv, char **envp) | @@ -5854,9 +5848,12 @@ int main(int argc, char **argv, char **envp) | ||
| 5854 | 5848 | ||
| 5855 | /* open the virtual block devices */ | 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 | register_savevm("timer", 0, 2, timer_save, timer_load, NULL); | 5858 | register_savevm("timer", 0, 2, timer_save, timer_load, NULL); |
| 5862 | register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL); | 5859 | register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL); |