> On 14 Jun 2019, at 7:43, Gerd Hoffmann <[email protected]> wrote: > > Hi, > >> Can there be a guest that will fail the MBR in such a way? Yes. >> Look at the following MBR partition table of a Windows XP guest in our >> production >> environment: >> >> Disk size in sectors: 16777216 >> >> Binary (only one partition 16 bytes): 80 01 01 00 07 fe ff ff 3f 00 00 00 d5 >> ea ff 00 >> Start: (0, 1, 1, 63) >> End: (1023, 254, 63, 16771859) >> >> As can be easily seen, any MBR guessing algorithm should guess: >> >> 255 heads (since a value of 254 appears), 63 spt (since a value of 63 >> appears) >> >> Turns out that this image does not work with 255, 63 but actually requires >> >> 16 heads, 63 spt >> >> to boot. >> >> So relying on MBR partitions alone is not always enough and sometimes manual >> intervention >> is required. > > Ok, given that seabios has no setup any manual configuration needs to be done > via qemu. > > But why do we need a new interface for that? IDE can pass the geometry > to the guest. virtio-blk has support too (VIRTIO_BLK_F_GEOMETRY). > Likewise scsi (MODE_PAGE_HD_GEOMETRY). So this should be doable without > any qemu changes.
This was indeed considered (all 3 methods) but it has the following issues: Physical geometries of devices must now also be logical geometries with translation=none. When the OS will query these devices - It will now see different physical geometries, adapted to be logical geometries. I’m not sure even how to implement this without breaking existing compatibility - since we don’t want to affect logical geometries of currently used guests. MODE_PAGE_HD_GEOMETRY does not contain the spts, only cylinders (as 3 byte number) and heads (as 1 byte number) and computes the spts using: number_of_total_sectors / (heads * cylinders), this means that qemu now must report number_of_total_sectors as heads * cylinders * spt for SeaBIOS to correctly receive the number of spts - this is not optimal since number_of_total_sectors can not reflect the real amount of sectors in the disk which should be reported from CDB_CMD_READ_CAPACITY. Moving a scsi-hd/virtio-blk with 255 physical heads to ide-hd, we will still need to report 255 heads - this is possible since a whole byte can be used in the “ide identify” command, but goes against the spec of a maximum of 16 heads for IDE. Overall this approach is much more complicated. Sam > > cheers, > Gerd >
