I only recently saw this email. On Thu, Jun 06, 2013 at 06:10:12PM +0300, Gleb Natapov wrote: > On Thu, Jun 06, 2013 at 05:06:32PM +0200, Gerd Hoffmann wrote: > > For seabios itself this isn't a big issue, see pci_{readl,writel} in > > src/pci.c. When called in 16bit mode it goes into 32bit mode > > temporarily, just for accessing the mmio register. ahci driver uses it, > > xhci driver (wip atm) will use that too, and virtio-{blk,scsi} drivers > > in seabios can do the same. > > > Isn't this approach broken? How can SeaBIOS be sure it restores real > mode registers to exactly same state they were before entering 32bit > mode? You are correct - SeaBIOS can't fully restore the "hidden" segment registers. So, in a way it is broken. In practice, it seems to work on modern bootloaders (eg, ntldr, grub, lilo). It definitely doesn't work with EMM386 (old DOS stuff), but does seem to work okay with FreeDOS as long as one doesn't run EMM386. The AHCI code uses this 32bit/16bit trampoline because it would not be possible to support AHCI otherwise. I haven't seen any complaints of failures with the AHCI code - probably because people using AHCI are using modern guests. I explored this a bit some time back and the only way I could think of to reliably restore the 16bit registers would be via SMM. Unfortunately, using SMM introduces a whole host of complexity and problems. -Kevin _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization