aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2009-07-22 16:42:57 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-27 14:08:23 -0500
commit751c6a17042b5d011013d6963c0505d671cf708e (patch)
tree61a769ed1a1c16ebdfc1397ce9d775222dfa8e57 /hw
parent8a14daa5a1ae22fcfc317f4727a88d6c15c39aae (diff)
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>
Diffstat (limited to 'hw')
-rw-r--r--hw/device-hotplug.c23
-rw-r--r--hw/etraxfs.c5
-rw-r--r--hw/gumstix.c16
-rw-r--r--hw/mainstone.c9
-rw-r--r--hw/mips_jazz.c7
-rw-r--r--hw/mips_malta.c24
-rw-r--r--hw/mips_r4k.c13
-rw-r--r--hw/musicpal.c10
-rw-r--r--hw/nand.c8
-rw-r--r--hw/omap1.c8
-rw-r--r--hw/omap2.c8
-rw-r--r--hw/omap_sx1.c10
-rw-r--r--hw/onenand.c6
-rw-r--r--hw/pc.c21
-rw-r--r--hw/pci-hotplug.c28
-rw-r--r--hw/petalogix_s3adsp1800_mmu.c5
-rw-r--r--hw/ppc405_boards.c34
-rw-r--r--hw/ppc440_bamboo.c5
-rw-r--r--hw/ppc_newworld.c9
-rw-r--r--hw/ppc_oldworld.c30
-rw-r--r--hw/ppc_prep.c16
-rw-r--r--hw/ppce500_mpc8544ds.c5
-rw-r--r--hw/pxa2xx.c16
-rw-r--r--hw/qdev.c17
-rw-r--r--hw/r2d.c5
-rw-r--r--hw/spitz.c8
-rw-r--r--hw/sun4m.c16
-rw-r--r--hw/sun4u.c18
-rw-r--r--hw/tosa.c8
-rw-r--r--hw/xen_disk.c14
-rw-r--r--hw/xen_machine_pv.c9
31 files changed, 186 insertions, 225 deletions
diff --git a/hw/device-hotplug.c b/hw/device-hotplug.c
index e178083419..5257274efd 100644
--- a/hw/device-hotplug.c
+++ b/hw/device-hotplug.c
@@ -28,22 +28,23 @@
#include "block_int.h"
#include "sysemu.h"
-int add_init_drive(const char *opts)
+DriveInfo *add_init_drive(const char *opts)
{
- int drive_opt_idx, drive_idx;
- int ret = -1;
+ int drive_opt_idx;
+ int fatal_error;
+ DriveInfo *dinfo;
drive_opt_idx = drive_add(NULL, "%s", opts);
if (!drive_opt_idx)
- return ret;
+ return NULL;
- drive_idx = drive_init(&drives_opt[drive_opt_idx], 0, current_machine);
- if (drive_idx == -1) {
+ dinfo = drive_init(&drives_opt[drive_opt_idx], 0, current_machine, &fatal_error);
+ if (!dinfo) {
drive_remove(drive_opt_idx);
- return ret;
+ return NULL;
}
- return drive_idx;
+ return dinfo;
}
void destroy_nic(dev_match_fn *match_fn, void *arg)
@@ -64,11 +65,11 @@ void destroy_nic(dev_match_fn *match_fn, void *arg)
void destroy_bdrvs(dev_match_fn *match_fn, void *arg)
{
- int i;
+ DriveInfo *dinfo;
struct BlockDriverState *bs;
- for (i = 0; i <= MAX_DRIVES; i++) {
- bs = drives_table[i].bdrv;
+ TAILQ_FOREACH(dinfo, &drives, next) {
+ bs = dinfo->bdrv;
if (bs) {
if (bs->private && match_fn(bs->private, arg)) {
drive_uninit(bs);
diff --git a/hw/etraxfs.c b/hw/etraxfs.c
index c2eca5275e..ab6a3a302f 100644
--- a/hw/etraxfs.c
+++ b/hw/etraxfs.c
@@ -55,6 +55,7 @@ void bareetraxfs_init (ram_addr_t ram_size,
void *etraxfs_dmac;
struct etraxfs_dma_client *eth[2] = {NULL, NULL};
int kernel_size;
+ DriveInfo *dinfo;
int i;
ram_addr_t phys_ram;
ram_addr_t phys_flash;
@@ -79,9 +80,9 @@ void bareetraxfs_init (ram_addr_t ram_size,
phys_flash = qemu_ram_alloc(FLASH_SIZE);
- i = drive_get_index(IF_PFLASH, 0, 0);
+ dinfo = drive_get(IF_PFLASH, 0, 0);
pflash_cfi02_register(0x0, phys_flash,
- i != -1 ? drives_table[i].bdrv : NULL, (64 * 1024),
+ dinfo ? dinfo->bdrv : NULL, (64 * 1024),
FLASH_SIZE >> 16,
1, 2, 0x0000, 0x0000, 0x0000, 0x0000,
0x555, 0x2aa);
diff --git a/hw/gumstix.c b/hw/gumstix.c
index 85b95eef59..8fbf64c0f3 100644
--- a/hw/gumstix.c
+++ b/hw/gumstix.c
@@ -47,22 +47,22 @@ static void connex_init(ram_addr_t ram_size,
const char *initrd_filename, const char *cpu_model)
{
PXA2xxState *cpu;
- int index;
+ DriveInfo *dinfo;
uint32_t connex_rom = 0x01000000;
uint32_t connex_ram = 0x04000000;
cpu = pxa255_init(connex_ram);
- index = drive_get_index(IF_PFLASH, 0, 0);
- if (index == -1) {
+ dinfo = drive_get(IF_PFLASH, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "A flash image must be given with the "
"'pflash' parameter\n");
exit(1);
}
if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(connex_rom),
- drives_table[index].bdrv, sector_len, connex_rom / sector_len,
+ dinfo->bdrv, sector_len, connex_rom / sector_len,
2, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory.\n");
exit(1);
@@ -81,22 +81,22 @@ static void verdex_init(ram_addr_t ram_size,
const char *initrd_filename, const char *cpu_model)
{
PXA2xxState *cpu;
- int index;
+ DriveInfo *dinfo;
uint32_t verdex_rom = 0x02000000;
uint32_t verdex_ram = 0x10000000;
cpu = pxa270_init(verdex_ram, cpu_model ?: "pxa270-c0");
- index = drive_get_index(IF_PFLASH, 0, 0);
- if (index == -1) {
+ dinfo = drive_get(IF_PFLASH, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "A flash image must be given with the "
"'pflash' parameter\n");
exit(1);
}
if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(verdex_rom),
- drives_table[index].bdrv, sector_len, verdex_rom / sector_len,
+ dinfo->bdrv, sector_len, verdex_rom / sector_len,
2, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory.\n");
exit(1);
diff --git a/hw/mainstone.c b/hw/mainstone.c
index 151ea0e341..3e517f0704 100644
--- a/hw/mainstone.c
+++ b/hw/mainstone.c
@@ -77,7 +77,8 @@ static void mainstone_common_init(ram_addr_t ram_size,
target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
PXA2xxState *cpu;
qemu_irq *mst_irq;
- int i, index;
+ DriveInfo *dinfo;
+ int i;
if (!cpu_model)
cpu_model = "pxa270-c5";
@@ -92,8 +93,8 @@ static void mainstone_common_init(ram_addr_t ram_size,
/* There are two 32MiB flash devices on the board */
for (i = 0; i < 2; i ++) {
- index = drive_get_index(IF_PFLASH, 0, i);
- if (index == -1) {
+ dinfo = drive_get(IF_PFLASH, 0, i);
+ if (!dinfo) {
fprintf(stderr, "Two flash images must be given with the "
"'pflash' parameter\n");
exit(1);
@@ -101,7 +102,7 @@ static void mainstone_common_init(ram_addr_t ram_size,
if (!pflash_cfi01_register(mainstone_flash_base[i],
qemu_ram_alloc(MAINSTONE_FLASH),
- drives_table[index].bdrv, sector_len,
+ dinfo->bdrv, sector_len,
MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory.\n");
exit(1);
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index 82cd385d26..e09a6b22dc 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -235,11 +235,8 @@ void mips_jazz_init (ram_addr_t ram_size,
exit(1);
}
for (n = 0; n < MAX_FD; n++) {
- int fd = drive_get_index(IF_FLOPPY, 0, n);
- if (fd != -1)
- fds[n] = drives_table[fd].bdrv;
- else
- fds[n] = NULL;
+ DriveInfo *dinfo = drive_get(IF_FLOPPY, 0, n);
+ fds[n] = dinfo ? dinfo->bdrv : NULL;
}
fdctrl_init(rc4030[1], 0, 1, 0x80003000, fds);
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 7728e58c5e..4e51c8d146 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -773,7 +773,7 @@ void mips_malta_init (ram_addr_t ram_size,
uint8_t *eeprom_buf;
i2c_bus *smbus;
int i;
- int index;
+ DriveInfo *dinfo;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BlockDriverState *fd[MAX_FD];
int fl_idx = 0;
@@ -827,8 +827,8 @@ void mips_malta_init (ram_addr_t ram_size,
env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry);
} else {
- index = drive_get_index(IF_PFLASH, 0, fl_idx);
- if (index != -1) {
+ dinfo = drive_get(IF_PFLASH, 0, fl_idx);
+ if (dinfo) {
/* Load firmware from flash. */
bios_size = 0x400000;
fl_sectors = bios_size >> 16;
@@ -836,10 +836,10 @@ void mips_malta_init (ram_addr_t ram_size,
printf("Register parallel flash %d size " TARGET_FMT_lx " at "
"offset %08lx addr %08llx '%s' %x\n",
fl_idx, bios_size, bios_offset, 0x1e000000LL,
- bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
+ bdrv_get_device_name(dinfo->bdrv), fl_sectors);
#endif
pflash_cfi01_register(0x1e000000LL, bios_offset,
- drives_table[index].bdrv, 65536, fl_sectors,
+ dinfo->bdrv, 65536, fl_sectors,
4, 0x0000, 0x0000, 0x0000, 0x0000);
fl_idx++;
} else {
@@ -898,11 +898,8 @@ void mips_malta_init (ram_addr_t ram_size,
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
- if (index != -1)
- hd[i] = drives_table[index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
piix4_devfn = piix4_init(pci_bus, 80);
@@ -929,11 +926,8 @@ void mips_malta_init (ram_addr_t ram_size,
if (parallel_hds[0])
parallel_init(0x378, i8259[7], parallel_hds[0]);
for(i = 0; i < MAX_FD; i++) {
- index = drive_get_index(IF_FLOPPY, 0, i);
- if (index != -1)
- fd[i] = drives_table[index].bdrv;
- else
- fd[i] = NULL;
+ dinfo = drive_get(IF_FLOPPY, 0, i);
+ fd[i] = dinfo ? dinfo->bdrv : NULL;
}
floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 7f8af7413a..476612cea5 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -155,8 +155,8 @@ void mips_r4k_init (ram_addr_t ram_size,
RTCState *rtc_state;
int i;
qemu_irq *i8259;
- int index;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+ DriveInfo *dinfo;
/* init CPUs */
if (cpu_model == NULL) {
@@ -208,11 +208,11 @@ void mips_r4k_init (ram_addr_t ram_size,
bios_offset | IO_MEM_ROM);
load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
- } else if ((index = drive_get_index(IF_PFLASH, 0, 0)) > -1) {
+ } else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
uint32_t mips_rom = 0x00400000;
bios_offset = qemu_ram_alloc(mips_rom);
if (!pflash_cfi01_register(0x1fc00000, bios_offset,
- drives_table[index].bdrv, sector_len, mips_rom / sector_len,
+ dinfo->bdrv, sector_len, mips_rom / sector_len,
4, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory.\n");
}
@@ -267,11 +267,8 @@ void mips_r4k_init (ram_addr_t ram_size,
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
- if (index != -1)
- hd[i] = drives_table[index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
for(i = 0; i < MAX_IDE_BUS; i++)
diff --git a/hw/musicpal.c b/hw/musicpal.c
index e6367919fc..2d26b3334d 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -1512,8 +1512,8 @@ static void musicpal_init(ram_addr_t ram_size,
qemu_irq pic[32];
DeviceState *dev;
int i;
- int index;
unsigned long flash_size;
+ DriveInfo *dinfo;
if (!cpu_model)
cpu_model = "arm926";
@@ -1549,9 +1549,9 @@ static void musicpal_init(ram_addr_t ram_size,
serial_hds[1], 1);
/* Register flash */
- index = drive_get_index(IF_PFLASH, 0, 0);
- if (index != -1) {
- flash_size = bdrv_getlength(drives_table[index].bdrv);
+ dinfo = drive_get(IF_PFLASH, 0, 0);
+ if (dinfo) {
+ flash_size = bdrv_getlength(dinfo->bdrv);
if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 &&
flash_size != 32*1024*1024) {
fprintf(stderr, "Invalid flash image size\n");
@@ -1564,7 +1564,7 @@ static void musicpal_init(ram_addr_t ram_size,
* image is smaller than 32 MB.
*/
pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, qemu_ram_alloc(flash_size),
- drives_table[index].bdrv, 0x10000,
+ dinfo->bdrv, 0x10000,
(flash_size + 0xffff) >> 16,
MP_FLASH_SIZE_MAX / flash_size,
2, 0x00BF, 0x236D, 0x0000, 0x0000,
diff --git a/hw/nand.c b/hw/nand.c
index 4ad77ecfc6..37fd5243f3 100644
--- a/hw/nand.c
+++ b/hw/nand.c
@@ -442,16 +442,16 @@ NANDFlashState *nand_init(int manf_id, int chip_id)
{
int pagesize;
NANDFlashState *s;
- int index;
+ DriveInfo *dinfo;
if (nand_flash_ids[chip_id].size == 0) {
hw_error("%s: Unsupported NAND chip ID.\n", __FUNCTION__);
}
s = (NANDFlashState *) qemu_mallocz(sizeof(NANDFlashState));
- index = drive_get_index(IF_MTD, 0, 0);
- if (index != -1)
- s->bdrv = drives_table[index].bdrv;
+ dinfo = drive_get(IF_MTD, 0, 0);
+ if (dinfo)
+ s->bdrv = dinfo->bdrv;
s->manf_id = manf_id;
s->chip_id = chip_id;
s->size = nand_flash_ids[s->chip_id].size << 20;
diff --git a/hw/omap1.c b/hw/omap1.c
index 14d7a829c0..93515ee810 100644
--- a/hw/omap1.c
+++ b/hw/omap1.c
@@ -4628,7 +4628,7 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
ram_addr_t imif_base, emiff_base;
qemu_irq *cpu_irq;
qemu_irq dma_irqs[6];
- int sdindex;
+ DriveInfo *dinfo;
if (!core)
core = "ti925t";
@@ -4740,12 +4740,12 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
omap_dpll_init(&s->dpll[1], 0xfffed000, omap_findclk(s, "dpll2"));
omap_dpll_init(&s->dpll[2], 0xfffed100, omap_findclk(s, "dpll3"));
- sdindex = drive_get_index(IF_SD, 0, 0);
- if (sdindex == -1) {
+ dinfo = drive_get(IF_SD, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "qemu: missing SecureDigital device\n");
exit(1);
}
- s->mmc = omap_mmc_init(0xfffb7800, drives_table[sdindex].bdrv,
+ s->mmc = omap_mmc_init(0xfffb7800, dinfo->bdrv,
s->irq[1][OMAP_INT_OQN], &s->drq[OMAP_DMA_MMC_TX],
omap_findclk(s, "mmc_ck"));
diff --git a/hw/omap2.c b/hw/omap2.c
index 8cbc4b5ea4..e43b4a88b3 100644
--- a/hw/omap2.c
+++ b/hw/omap2.c
@@ -4496,7 +4496,7 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
qemu_irq *cpu_irq;
qemu_irq dma_irqs[4];
omap_clk gpio_clks[4];
- int sdindex;
+ DriveInfo *dinfo;
int i;
/* Core */
@@ -4645,12 +4645,12 @@ struct omap_mpu_state_s *omap2420_mpu_init(unsigned long sdram_size,
s->sdrc = omap_sdrc_init(0x68009000);
s->gpmc = omap_gpmc_init(0x6800a000, s->irq[0][OMAP_INT_24XX_GPMC_IRQ]);
- sdindex = drive_get_index(IF_SD, 0, 0);
- if (sdindex == -1) {
+ dinfo = drive_get(IF_SD, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "qemu: missing SecureDigital device\n");
exit(1);
}
- s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9), drives_table[sdindex].bdrv,
+ s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9), dinfo->bdrv,
s->irq[0][OMAP_INT_24XX_MMC_IRQ],
&s->drq[OMAP24XX_DMA_MMC1_TX],
omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk"));
diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c
index 1ba42f6cd1..22f801b57e 100644
--- a/hw/omap_sx1.c
+++ b/hw/omap_sx1.c
@@ -127,7 +127,7 @@ static void sx1_init(ram_addr_t ram_size,
static uint32_t cs2val = 0x00001139;
static uint32_t cs3val = 0x00001139;
ram_addr_t phys_flash;
- int index;
+ DriveInfo *dinfo;
int fl_idx;
uint32_t flash_size = flash0_size;
@@ -151,9 +151,9 @@ static void sx1_init(ram_addr_t ram_size,
fl_idx = 0;
- if ((index = drive_get_index(IF_PFLASH, 0, fl_idx)) > -1) {
+ if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
if (!pflash_cfi01_register(OMAP_CS0_BASE, qemu_ram_alloc(flash_size),
- drives_table[index].bdrv, sector_size, flash_size / sector_size,
+ dinfo->bdrv, sector_size, flash_size / sector_size,
4, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
fl_idx);
@@ -162,7 +162,7 @@ static void sx1_init(ram_addr_t ram_size,
}
if ((version == 1) &&
- (index = drive_get_index(IF_PFLASH, 0, fl_idx)) > -1) {
+ (dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
cpu_register_physical_memory(OMAP_CS1_BASE, flash1_size,
(phys_flash = qemu_ram_alloc(flash1_size)) |
IO_MEM_ROM);
@@ -171,7 +171,7 @@ static void sx1_init(ram_addr_t ram_size,
OMAP_CS1_SIZE - flash1_size, io);
if (!pflash_cfi01_register(OMAP_CS1_BASE, qemu_ram_alloc(flash1_size),
- drives_table[index].bdrv, sector_size, flash1_size / sector_size,
+ dinfo->bdrv, sector_size, flash1_size / sector_size,
4, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
fl_idx);
diff --git a/hw/onenand.c b/hw/onenand.c
index 870cfd9906..84fdb21431 100644
--- a/hw/onenand.c
+++ b/hw/onenand.c
@@ -618,7 +618,7 @@ static CPUWriteMemoryFunc *onenand_writefn[] = {
void *onenand_init(uint32_t id, int regshift, qemu_irq irq)
{
OneNANDState *s = (OneNANDState *) qemu_mallocz(sizeof(*s));
- int bdrv_index = drive_get_index(IF_MTD, 0, 0);
+ DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
uint32_t size = 1 << (24 + ((id >> 12) & 7));
void *ram;
@@ -632,11 +632,11 @@ void *onenand_init(uint32_t id, int regshift, qemu_irq irq)
s->density_mask = (id & (1 << 11)) ? (1 << (6 + ((id >> 12) & 7))) : 0;
s->iomemtype = cpu_register_io_memory(onenand_readfn,
onenand_writefn, s);
- if (bdrv_index == -1)
+ if (!dinfo)
s->image = memset(qemu_malloc(size + (size >> 5)),
0xff, size + (size >> 5));
else
- s->bdrv = drives_table[bdrv_index].bdrv;
+ s->bdrv = dinfo->bdrv;
s->otp = memset(qemu_malloc((64 + 2) << PAGE_SHIFT),
0xff, (64 + 2) << PAGE_SHIFT);
s->ram = qemu_ram_alloc(0xc000 << s->shift);
diff --git a/hw/pc.c b/hw/pc.c
index c55c303bc1..46ff8cf7ca 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1126,7 +1126,7 @@ static void pc_init1(ram_addr_t ram_size,
CPUState *env;
qemu_irq *cpu_irq;
qemu_irq *i8259;
- int index;
+ DriveInfo *dinfo;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BlockDriverState *fd[MAX_FD];
int using_vga = cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled;
@@ -1356,11 +1356,8 @@ static void pc_init1(ram_addr_t ram_size,
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
- if (index != -1)
- hd[i] = drives_table[index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
if (pci_enabled) {
@@ -1379,11 +1376,8 @@ static void pc_init1(ram_addr_t ram_size,
#endif
for(i = 0; i < MAX_FD; i++) {
- index = drive_get_index(IF_FLOPPY, 0, i);
- if (index != -1)
- fd[i] = drives_table[index].bdrv;
- else
- fd[i] = NULL;
+ dinfo = drive_get(IF_FLOPPY, 0, i);
+ fd[i] = dinfo ? dinfo->bdrv : NULL;
}
floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
@@ -1437,12 +1431,11 @@ static void pc_init1(ram_addr_t ram_size,
/* Add virtio block devices */
if (pci_enabled) {
- int index;
int unit_id = 0;
- while ((index = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
+ while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
pci_dev = pci_create(virtio_blk_name,
- drives_table[index].devaddr);
+ dinfo->devaddr);
qdev_init(&pci_dev->qdev);
unit_id++;
}
diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c
index d0f2911d65..43675e2659 100644
--- a/hw/pci-hotplug.c
+++ b/hw/pci-hotplug.c
@@ -52,9 +52,10 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
{
int dom, pci_bus;
unsigned slot;
- int drive_idx, type, bus;
+ int type, bus;
int success = 0;
PCIDevice *dev;
+ DriveInfo *dinfo;
if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) {
return;
@@ -66,21 +67,21 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
return;
}
- drive_idx = add_init_drive(opts);
- if (drive_idx < 0)
+ dinfo = add_init_drive(opts);
+ if (!dinfo)
return;
- if (drives_table[drive_idx].devaddr) {
+ if (dinfo->devaddr) {
monitor_printf(mon, "Parameter addr not supported\n");
return;
}
- type = drives_table[drive_idx].type;
+ type = dinfo->type;
bus = drive_get_max_bus (type);
switch (type) {
case IF_SCSI:
success = 1;
- lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
- drives_table[drive_idx].unit);
+ lsi_scsi_attach(&dev->qdev, dinfo->bdrv,
+ dinfo->unit);
break;
default:
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)
if (success)
monitor_printf(mon, "OK bus %d, unit %d\n",
- drives_table[drive_idx].bus,
- drives_table[drive_idx].unit);
+ dinfo->bus,
+ dinfo->unit);
return;
}
@@ -98,7 +99,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
const char *opts)
{
PCIDevice *dev;
- int type = -1, drive_idx = -1;
+ DriveInfo *dinfo;
+ int type = -1;
char buf[128];
if (get_param_value(buf, sizeof(buf), "if", opts)) {
@@ -116,10 +118,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
}
if (get_param_value(buf, sizeof(buf), "file", opts)) {
- drive_idx = add_init_drive(opts);
- if (drive_idx < 0)
+ dinfo = add_init_drive(opts);
+ if (!dinfo)
return NULL;
- if (drives_table[drive_idx].devaddr) {
+ if (dinfo->devaddr) {
monitor_printf(mon, "Parameter addr not supported\n");
return NULL;
}
diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c
index c2a196f85d..1a1cc0e371 100644
--- a/hw/petalogix_s3adsp1800_mmu.c
+++ b/hw/petalogix_s3adsp1800_mmu.c
@@ -106,6 +106,7 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size,
DeviceState *dev;
CPUState *env;
int kernel_size;
+ DriveInfo *dinfo;
int i;
target_phys_addr_t ddr_base = 0x90000000;
ram_addr_t phys_lmb_bram;
@@ -131,9 +132,9 @@ petalogix_s3adsp1800_init(ram_addr_t ram_size,
cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM);
phys_flash = qemu_ram_alloc(FLASH_SIZE);
- i = drive_get_index(IF_PFLASH, 0, 0);
+ dinfo = drive_get(IF_PFLASH, 0, 0);
pflash_cfi02_register(0xa0000000, phys_flash,
- i != -1 ? drives_table[i].bdrv : NULL, (64 * 1024),
+ dinfo ? dinfo->bdrv : NULL, (64 * 1024),
FLASH_SIZE >> 16,
1, 1, 0x0000, 0x0000, 0x0000, 0x0000,
0x555, 0x2aa);
diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c
index c9a1986045..f2b4a84191 100644
--- a/hw/ppc405_boards.c
+++ b/hw/ppc405_boards.c
@@ -188,7 +188,7 @@ static void ref405ep_init (ram_addr_t ram_size,
int linux_boot;
int fl_idx, fl_sectors, len;
int ppc_boot_device = boot_device[0];
- int index;
+ DriveInfo *dinfo;
/* XXX: fix this */
ram_bases[0] = qemu_ram_alloc(0x08000000);
@@ -215,19 +215,19 @@ static void ref405ep_init (ram_addr_t ram_size,
#endif
fl_idx = 0;
#ifdef USE_FLASH_BIOS
- index = drive_get_index(IF_PFLASH, 0, fl_idx);
- if (index != -1) {
- bios_size = bdrv_getlength(drives_table[index].bdrv);
+ dinfo = drive_get(IF_PFLASH, 0, fl_idx);
+ if (dinfo) {
+ bios_size = bdrv_getlength(dinfo->bdrv);
bios_offset = qemu_ram_alloc(bios_size);
fl_sectors = (bios_size + 65535) >> 16;
#ifdef DEBUG_BOARD_INIT
printf("Register parallel flash %d size " ADDRX " at offset %08lx "
" addr " ADDRX " '%s' %d\n",
fl_idx, bios_size, bios_offset, -bios_size,
- bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
+ bdrv_get_device_name(dinfo->bdrv), fl_sectors);
#endif
pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
- drives_table[index].bdrv, 65536, fl_sectors, 1,
+ dinfo->bdrv, 65536, fl_sectors, 1,
2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
fl_idx++;
} else
@@ -509,7 +509,7 @@ static void taihu_405ep_init(ram_addr_t ram_size,
int linux_boot;
int fl_idx, fl_sectors;
int ppc_boot_device = boot_device[0];
- int index;
+ DriveInfo *dinfo;
/* RAM is soldered to the board so the size cannot be changed */
ram_bases[0] = qemu_ram_alloc(0x04000000);
@@ -528,9 +528,9 @@ static void taihu_405ep_init(ram_addr_t ram_size,
#endif
fl_idx = 0;
#if defined(USE_FLASH_BIOS)
- index = drive_get_index(IF_PFLASH, 0, fl_idx);
- if (index != -1) {
- bios_size = bdrv_getlength(drives_table[index].bdrv);
+ dinfo = drive_get(IF_PFLASH, 0, fl_idx);
+ if (dinfo) {
+ bios_size = bdrv_getlength(dinfo->bdrv);
/* XXX: should check that size is 2MB */
// bios_size = 2 * 1024 * 1024;
fl_sectors = (bios_size + 65535) >> 16;
@@ -539,10 +539,10 @@ static void taihu_405ep_init(ram_addr_t ram_size,
printf("Register parallel flash %d size " ADDRX " at offset %08lx "
" addr " ADDRX " '%s' %d\n",
fl_idx, bios_size, bios_offset, -bios_size,
- bdrv_get_device_name(drives_table[index].bdrv), fl_sectors);
+ bdrv_get_device_name(dinfo->bdrv), fl_sectors);
#endif
pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
- drives_table[index].bdrv, 65536, fl_sectors, 1,
+ dinfo->bdrv, 65536, fl_sectors, 1,
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
fl_idx++;
} else
@@ -570,9 +570,9 @@ static void taihu_405ep_init(ram_addr_t ram_size,
bios_size, bios_offset | IO_MEM_ROM);
}
/* Register Linux flash */
- index = drive_get_index(IF_PFLASH, 0, fl_idx);
- if (index != -1) {
- bios_size = bdrv_getlength(drives_table[index].bdrv);
+ dinfo = drive_get(IF_PFLASH, 0, fl_idx);
+ if (dinfo) {
+ bios_size = bdrv_getlength(dinfo->bdrv);
/* XXX: should check that size is 32MB */
bios_size = 32 * 1024 * 1024;
fl_sectors = (bios_size + 65535) >> 16;
@@ -580,11 +580,11 @@ static void taihu_405ep_init(ram_addr_t ram_size,
printf("Register parallel flash %d size " ADDRX " at offset %08lx "
" addr " ADDRX " '%s'\n",
fl_idx, bios_size, bios_offset, (target_ulong)0xfc000000,
- bdrv_get_device_name(drives_table[index].bdrv));
+ bdrv_get_device_name(dinfo->bdrv));
#endif
bios_offset = qemu_ram_alloc(bios_size);
pflash_cfi02_register(0xfc000000, bios_offset,
- drives_table[index].bdrv, 65536, fl_sectors, 1,
+ dinfo->bdrv, 65536, fl_sectors, 1,
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA);
fl_idx++;
}
diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
index d9ef3eca82..624e15b117 100644
--- a/hw/ppc440_bamboo.c
+++ b/hw/ppc440_bamboo.c
@@ -102,6 +102,7 @@ static void bamboo_init(ram_addr_t ram_size,
target_ulong dt_base = 0;
void *fdt;
int i;
+ DriveInfo *dinfo;
/* Setup CPU. */
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,
int unit_id = 0;
/* Add virtio block devices. */
- while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
- pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
+ while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
+ pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
qdev_init(&pci_dev->qdev);
unit_id++;
}
diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
index 1c512a2417..2a350eb8c5 100644
--- a/hw/ppc_newworld.c
+++ b/hw/ppc_newworld.c
@@ -106,7 +106,7 @@ static void ppc_core99_init (ram_addr_t ram_size,
qemu_irq *dummy_irq;
int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index;
int ppc_boot_device;
- int index;
+ DriveInfo *dinfo;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
void *fw_cfg;
void *dbdma;
@@ -315,11 +315,8 @@ static void ppc_core99_init (ram_addr_t ram_size,
exit(1);
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
- if (index != -1)
- hd[i] = drives_table[index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
dbdma = DBDMA_init(&dbdma_mem_index);
pci_cmd646_ide_init(pci_bus, hd, 0);
diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
index 56b2876684..7931f44088 100644
--- a/hw/ppc_oldworld.c
+++ b/hw/ppc_oldworld.c
@@ -135,7 +135,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
int escc_mem_index, ide_mem_index[2];
uint16_t ppc_boot_device;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
- int index;
+ DriveInfo *dinfo;
void *fw_cfg;
void *dbdma;
uint8_t *vga_bios_ptr;
@@ -328,31 +328,19 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
}
/* First IDE channel is a MAC IDE on the MacIO bus */
- index = drive_get_index(IF_IDE, 0, 0);
- if (index == -1)
- hd[0] = NULL;
- else
- hd[0] = drives_table[index].bdrv;
- index = drive_get_index(IF_IDE, 0, 1);
- if (index == -1)
- hd[1] = NULL;
- else
- hd[1] = drives_table[index].bdrv;
+ dinfo = drive_get(IF_IDE, 0, 0);
+ hd[0] = dinfo ? dinfo->bdrv : NULL;
+ dinfo = drive_get(IF_IDE, 0, 1);
+ hd[1] = dinfo ? dinfo->bdrv : NULL;
dbdma = DBDMA_init(&dbdma_mem_index);
ide_mem_index[0] = -1;
ide_mem_index[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]);
/* Second IDE channel is a CMD646 on the PCI bus */
- index = drive_get_index(IF_IDE, 1, 0);
- if (index == -1)
- hd[0] = NULL;
- else
- hd[0] = drives_table[index].bdrv;
- index = drive_get_index(IF_IDE, 1, 1);
- if (index == -1)
- hd[1] = NULL;
- else
- hd[1] = drives_table[index].bdrv;
+ dinfo = drive_get(IF_IDE, 1, 0);
+ hd[0] = dinfo ? dinfo->bdrv : NULL;
+ dinfo = drive_get(IF_IDE, 1, 1);
+ hd[1] = dinfo ? dinfo->bdrv : NULL;
hd[3] = hd[2] = NULL;
pci_cmd646_ide_init(pci_bus, hd, 0);
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index 7a219778cf..97190a2b7b 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -550,7 +550,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
PCIBus *pci_bus;
qemu_irq *i8259;
int ppc_boot_device;
- int index;
+ DriveInfo *dinfo;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BlockDriverState *fd[MAX_FD];
@@ -691,11 +691,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
- if (index != -1)
- hd[i] = drives_table[index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
for(i = 0; i < MAX_IDE_BUS; i++) {
@@ -708,11 +705,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
// SB16_init();
for(i = 0; i < MAX_FD; i++) {
- index = drive_get_index(IF_FLOPPY, 0, i);
- if (index != -1)
- fd[i] = drives_table[index].bdrv;
- else
- fd[i] = NULL;
+ dinfo = drive_get(IF_FLOPPY, 0, i);
+ fd[i] = dinfo ? dinfo->bdrv : NULL;
}
fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c
index c0e367de63..04c6acd0d5 100644
--- a/hw/ppce500_mpc8544ds.c
+++ b/hw/ppce500_mpc8544ds.c
@@ -172,6 +172,7 @@ static void mpc8544ds_init(ram_addr_t ram_size,
unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
qemu_irq *irqs, *mpic, *pci_irqs;
SerialState * serial[2];
+ DriveInfo *dinfo;
/* Setup CPU */
env = cpu_ppc_init("e500v2_v30");
@@ -219,8 +220,8 @@ static void mpc8544ds_init(ram_addr_t ram_size,
int unit_id = 0;
/* Add virtio block devices. */
- while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
- pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
+ while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
+ pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
qdev_init(&pci_dev->qdev);
unit_id++;
}
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index f2e98ffc24..28e9610ef2 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -2034,7 +2034,7 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
{
PXA2xxState *s;
int iomemtype, i;
- int index;
+ DriveInfo *dinfo;
s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState));
if (revision && strncmp(revision, "pxa27", 5)) {
@@ -2066,12 +2066,12 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121);
- index = drive_get_index(IF_SD, 0, 0);
- if (index == -1) {
+ dinfo = drive_get(IF_SD, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "qemu: missing SecureDigital device\n");
exit(1);
}
- s->mmc = pxa2xx_mmci_init(0x41100000, drives_table[index].bdrv,
+ s->mmc = pxa2xx_mmci_init(0x41100000, dinfo->bdrv,
s->pic[PXA2XX_PIC_MMC], s->dma);
for (i = 0; pxa270_serial[i].io_base; i ++)
@@ -2153,7 +2153,7 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
{
PXA2xxState *s;
int iomemtype, i;
- int index;
+ DriveInfo *dinfo;
s = (PXA2xxState *) qemu_mallocz(sizeof(PXA2xxState));
@@ -2178,12 +2178,12 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85);
- index = drive_get_index(IF_SD, 0, 0);
- if (index == -1) {
+ dinfo = drive_get(IF_SD, 0, 0);
+ if (!dinfo) {
fprintf(stderr, "qemu: missing SecureDigital device\n");
exit(1);
}
- s->mmc = pxa2xx_mmci_init(0x41100000, drives_table[index].bdrv,
+ s->mmc = pxa2xx_mmci_init(0x41100000, dinfo->bdrv,
s->pic[PXA2XX_PIC_MMC], s->dma);
for (i = 0; pxa255_serial[i].io_base; i ++)
diff --git a/hw/qdev.c b/hw/qdev.c
index 97a9665424..479eb72b67 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -267,13 +267,10 @@ static int next_block_unit[IF_COUNT];
BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type)
{
int unit = next_block_unit[type]++;
- int index;
+ DriveInfo *dinfo;
- index = drive_get_index(type, 0, unit);
- if (index == -1) {
- return NULL;
- }
- return drives_table[index].bdrv;
+ dinfo = drive_get(type, 0, unit);
+ return dinfo ? dinfo->bdrv : NULL;
}
BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
@@ -296,14 +293,14 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach)
{
int bus = next_scsi_bus++;
int unit;
- int index;
+ DriveInfo *dinfo;
for (unit = 0; unit < MAX_SCSI_DEVS; unit++) {
- index = drive_get_index(IF_SCSI, bus, unit);
- if (index == -1) {
+ dinfo = drive_get(IF_SCSI, bus, unit);
+ if (!dinfo) {
continue;
}
- attach(host, drives_table[index].bdrv, unit);
+ attach(host, dinfo->bdrv, unit);
}
}
diff --git a/hw/r2d.c b/hw/r2d.c
index 8ce68325c2..697bcb6a49 100644
--- a/hw/r2d.c
+++ b/hw/r2d.c
@@ -203,6 +203,7 @@ static void r2d_init(ram_addr_t ram_size,
ram_addr_t sdram_addr;
qemu_irq *irq;
PCIBus *pci;
+ DriveInfo *dinfo;
int i;
if (!cpu_model)
@@ -225,9 +226,9 @@ static void r2d_init(ram_addr_t ram_size,
sm501_init(0x10000000, SM501_VRAM_SIZE, irq[SM501], serial_hds[2]);
/* onboard CF (True IDE mode, Master only). */
- if ((i = drive_get_index(IF_IDE, 0, 0)) != -1)
+ if ((dinfo = drive_get(IF_IDE, 0, 0)) != NULL)
mmio_ide_init(0x14001000, 0x1400080c, irq[CF_IDE], 1,
- drives_table[i].bdrv, NULL);
+ dinfo->bdrv, NULL);
/* NIC: rtl8139 on-board, and 2 slots. */
for (i = 0; i < nb_nics; i++)
diff --git a/hw/spitz.c b/hw/spitz.c
index d9ff85eac1..36bf5347eb 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -744,13 +744,13 @@ static void spitz_ssp_attach(PXA2xxState *cpu)
static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
{
PCMCIACardState *md;
- int index;
BlockDriverState *bs;
+ DriveInfo *dinfo;
- index = drive_get_index(IF_IDE, 0, 0);
- if (index == -1)
+ dinfo = drive_get(IF_IDE, 0, 0);
+ if (!dinfo)
return;
- bs = drives_table[index].bdrv;
+ bs = dinfo->bdrv;
if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
md = dscm1xxxx_init(bs);
pxa2xx_pcmcia_attach(cpu->pcmcia[slot], md);
diff --git a/hw/sun4m.c b/hw/sun4m.c
index 1e668fca1f..274ee359ab 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -581,9 +581,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
qemu_irq *cpu_halt;
unsigned long kernel_size;
BlockDriverState *fd[MAX_FD];
- int drive_index;
void *fw_cfg;
DeviceState *dev;
+ DriveInfo *dinfo;
/* init CPUs */
if (!cpu_model)
@@ -662,9 +662,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
if (hwdef->fd_base) {
/* there is zero or one floppy drive */
memset(fd, 0, sizeof(fd));
- drive_index = drive_get_index(IF_FLOPPY, 0, 0);
- if (drive_index != -1)
- fd[0] = drives_table[drive_index].bdrv;
+ dinfo = drive_get(IF_FLOPPY, 0, 0);
+ if (dinfo)
+ fd[0] = dinfo->bdrv;
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
&fdc_tc);
@@ -1507,10 +1507,10 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
qemu_irq fdc_tc;
unsigned long kernel_size;
BlockDriverState *fd[MAX_FD];
- int drive_index;
void *fw_cfg;
DeviceState *dev;
unsigned int i;
+ DriveInfo *dinfo;
/* init CPU */
if (!cpu_model)
@@ -1565,9 +1565,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
if (hwdef->fd_base != (target_phys_addr_t)-1) {
/* there is zero or one floppy drive */
memset(fd, 0, sizeof(fd));
- drive_index = drive_get_index(IF_FLOPPY, 0, 0);
- if (drive_index != -1)
- fd[0] = drives_table[drive_index].bdrv;
+ dinfo = drive_get(IF_FLOPPY, 0, 0);
+ if (dinfo)
+ fd[0] = dinfo->bdrv;
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
&fdc_tc);
diff --git a/hw/sun4u.c b/hw/sun4u.c
index c49e345429..6f3f0c32e5 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -557,10 +557,10 @@ static void sun4uv_init(ram_addr_t RAM_size,
long initrd_size, kernel_size;
PCIBus *pci_bus, *pci_bus2, *pci_bus3;
qemu_irq *irq;
- int drive_index;
BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BlockDriverState *fd[MAX_FD];
void *fw_cfg;
+ DriveInfo *dinfo;
/* init CPUs */
env = cpu_devinit(cpu_model, hwdef);
@@ -608,12 +608,9 @@ static void sun4uv_init(ram_addr_t RAM_size,
exit(1);
}
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
- drive_index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS,
- i % MAX_IDE_DEVS);
- if (drive_index != -1)
- hd[i] = drives_table[drive_index].bdrv;
- else
- hd[i] = NULL;
+ dinfo = drive_get(IF_IDE, i / MAX_IDE_DEVS,
+ i % MAX_IDE_DEVS);
+ hd[i] = dinfo ? dinfo->bdrv : NULL;
}
pci_cmd646_ide_init(pci_bus, hd, 1);
@@ -621,11 +618,8 @@ static void sun4uv_init(ram_addr_t RAM_size,
/* FIXME: wire up interrupts. */
i8042_init(NULL/*1*/, NULL/*12*/, 0x60);
for(i = 0; i < MAX_FD; i++) {
- drive_index = drive_get_index(IF_FLOPPY, 0, i);
- if (drive_index != -1)
- fd[i] = drives_table[drive_index].bdrv;
- else
- fd[i] = NULL;
+ dinfo = drive_get(IF_FLOPPY, 0, i);
+ fd[i] = dinfo ? dinfo->bdrv : NULL;
}
floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd);
nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59);
diff --git a/hw/tosa.c b/hw/tosa.c
index b2d66f39d3..b932efc46c 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -49,13 +49,13 @@
static void tosa_microdrive_attach(PXA2xxState *cpu)
{
PCMCIACardState *md;
- int index;
BlockDriverState *bs;
+ DriveInfo *dinfo;
- index = drive_get_index(IF_IDE, 0, 0);
- if (index == -1)
+ dinfo = drive_get(IF_IDE, 0, 0);
+ if (!dinfo)
return;
- bs = drives_table[index].bdrv;
+ bs = dinfo->bdrv;
if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
md = dscm1xxxx_init(bs);
pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
diff --git a/hw/xen_disk.c b/hw/xen_disk.c
index 7ed6c33aae..100ef8e9bc 100644
--- a/hw/xen_disk.c
+++ b/hw/xen_disk.c
@@ -107,7 +107,7 @@ struct XenBlkDev {
int requests_finished;
/* qemu block driver */
- int index;
+ DriveInfo *dinfo;
BlockDriverState *bs;
QEMUBH *bh;
};
@@ -575,7 +575,7 @@ static void blk_alloc(struct XenDevice *xendev)
static int blk_init(struct XenDevice *xendev)
{
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
- int mode, qflags, have_barriers, info = 0;
+ int index, mode, qflags, have_barriers, info = 0;
char *h;
/* read xenstore entries */
@@ -622,9 +622,9 @@ static int blk_init(struct XenDevice *xendev)
info |= VDISK_CDROM;
/* init qemu block driver */
- blkdev->index = (blkdev->xendev.dev - 202 * 256) / 16;
- blkdev->index = drive_get_index(IF_XEN, 0, blkdev->index);
- if (blkdev->index == -1) {
+ index = (blkdev->xendev.dev - 202 * 256) / 16;
+ blkdev->dinfo = drive_get(IF_XEN, 0, index);
+ if (!blkdev->dinfo) {
/* setup via xenbus -> create new block driver instance */
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
blkdev->bs = bdrv_new(blkdev->dev);
@@ -640,7 +640,7 @@ static int blk_init(struct XenDevice *xendev)
} else {
/* setup via qemu cmdline -> already setup for us */
xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n");
- blkdev->bs = drives_table[blkdev->index].bdrv;
+ blkdev->bs = blkdev->dinfo->bdrv;
}
blkdev->file_blk = BLOCK_SIZE;
blkdev->file_size = bdrv_getlength(blkdev->bs);
@@ -729,7 +729,7 @@ static void blk_disconnect(struct XenDevice *xendev)
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
if (blkdev->bs) {
- if (blkdev->index == -1) {
+ if (!blkdev->dinfo) {
/* close/delete only if we created it ourself */
bdrv_close(blkdev->bs);
bdrv_delete(blkdev->bs);
diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
index 6ae5000900..162f88db33 100644
--- a/hw/xen_machine_pv.c
+++ b/hw/xen_machine_pv.c
@@ -40,7 +40,8 @@ static void xen_init_pv(ram_addr_t ram_size,
const char *cpu_model)
{
CPUState *env;
- int i, index;
+ DriveInfo *dinfo;
+ int i;
/* Initialize a dummy CPU */
if (cpu_model == NULL) {
@@ -90,10 +91,10 @@ static void xen_init_pv(ram_addr_t ram_size,
/* configure disks */
for (i = 0; i < 16; i++) {
- index = drive_get_index(IF_XEN, 0, i);
- if (index == -1)
+ dinfo = drive_get(IF_XEN, 0, i);
+ if (!dinfo)
continue;
- xen_config_dev_blk(drives_table + index);
+ xen_config_dev_blk(dinfo);
}
/* configure nics */