[romprefix] Use smaller PMM allocations if possible
authorMichael Brown <mcb30@etherboot.org>
Tue, 11 Nov 2008 20:00:13 +0000 (20:00 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 11 Nov 2008 20:00:13 +0000 (20:00 +0000)
commit2ca2607b1b29d7c567df7aeb5b769e85ec176fc7
treec9ee1c9d4d97f0709d28a8f0c8555db21f19186d
parent125c6d66a8e49cb45f2be13b2ec8329107338b53
[romprefix] Use smaller PMM allocations if possible

The only way that PMM allows us to request a block in a region with
A20=0 is to ask for a block with an alignment of 2MB.  Due to the PMM
API design, the only way we can do this is to ask for a block with a
size of 2MB.

Unfortunately, some BIOSes will hit problems if we allocate a 2MB
block.  In particular, it may not be possible to enter the BIOS setup
screen; the BIOS setup code attempts a PMM allocation, fails, and
hangs the machine.

We now try allocating only as much as we need via PMM.  If the
allocated block has A20=1, we free the allocated block, double the
allocation size, and try again.  Repeat until either we obtain a block
with A20=0 or allocation fails.  (This is guaranteed to terminate by
the time we reach an allocation size of 2MB.)
src/arch/i386/prefix/romprefix.S