[int13] Pairwise swap drive numbers, instead of shifting all drive numbers
authorMichael Brown <mcb30@etherboot.org>
Tue, 15 Jul 2008 22:19:59 +0000 (23:19 +0100)
committerMichael Brown <mcb30@etherboot.org>
Tue, 15 Jul 2008 22:19:59 +0000 (23:19 +0100)
commitbb41ec385ce4fa74bc3036a47fc5fa709ce05d9c
treee997d6f572f66aa1a364e640517dac8e22519863
parent21e9e801e268302cf2705d9b0e658f9896963fe0
[int13] Pairwise swap drive numbers, instead of shifting all drive numbers

Shifting all INT13 drive numbers causes problems on systems that use a
sparse drive number space (e.g. qemu BIOS, which uses 0xe0 for the CD-ROM
drive).

The strategy now is:

  Each drive is assigned a "natural" drive number, being the next
  available drive number in the system (based on the BIOS drive count).

  Each drive is accessed using its specified drive number.  If the
  specified drive number is -1, the natural drive number will be used.

  Accesses to the specified drive number will be delivered to the
  emulated drive, masking out any preexisting drive using this number.

  Accesses to the natural drive number, if different, will be remapped to
  the masked-out drive.

The overall upshot is that, for examples:

  System has no drives.  Emulated INT13 drive gets natural number 0x80
  and specified number 0x80.  Accesses to drive 0x80 go to the emulated
  drive, and there is no remapping.

  System has one drive.  Emulated INT13 drive gets natural number 0x81
  and specified number 0x80.  Accesses to drive 0x80 go to the emulated
  drive.  Accesses to drive 0x81 get remapped to the original drive 0x80.
src/arch/i386/include/int13.h
src/arch/i386/interface/pcbios/int13.c