Instead of duplicating the logic for the if_ide (bus,unit) mappings, rely on the blockdev layer for managing those mappings for us, and use the drive_get_by_index call instead.
This allows ide_drive_get to work for AHCI HBAs as well, and can be used in the Q35 initialization. Signed-off-by: John Snow <js...@redhat.com> --- hw/ide/core.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 6fba056..1e43d50 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -2551,13 +2551,15 @@ const VMStateDescription vmstate_ide_bus = { void ide_drive_get(DriveInfo **hd, int max_bus) { int i; + int max_devs = if_get_max_devs(IF_IDE) * max_bus; + int buses = drive_get_max_bus(IF_IDE) + 1; - if (drive_get_max_bus(IF_IDE) >= max_bus) { - fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus); - exit(1); + if (buses > max_bus) { + fprintf(stderr, "Warning: Too many IDE buses defined (%d > %d)\n", + buses, max_bus); } - for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) { - hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS); + for (i = 0; i < max_devs; i++) { + hd[i] = drive_get_by_index(IF_IDE, i); } } -- 1.9.3