[librm] Reduce real-mode stack consumption in virt_call()
authorMichael Brown <mcb30@ipxe.org>
Fri, 29 Apr 2016 10:33:13 +0000 (11:33 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 29 Apr 2016 10:48:39 +0000 (11:48 +0100)
commit2d42d3cff6e941c4e04d15dc29ea670f2fdb7b0c
treebdc51e654ac4a6ba1ab7536ca40442d2f4181bf6
parentb696a5063e80aa68cb064a8ac0098edd31632555
[librm] Reduce real-mode stack consumption in virt_call()

Some PXE NBPs are known to make PXE API calls with very little space
available on the real-mode stack.  For example, the Rembo-ia32 NBP
from some versions of IBM's Tivoli Provisioning Manager for Operating
System Deployment (TPMfOSD) will issue calls with the real-mode stack
placed at 0000:03d2; this is at the end of the interrupt vector table
and leaves only 498 bytes of stack space available before overwriting
the hardware IRQ vectors.  This limits the amount of state that we can
preserve before transitioning to protected mode.

Work around these challenging conditions by preserving everything
other than the initial register dump in a temporary static buffer
within our real-mode data segment, and copying the contents of this
buffer to the protected-mode stack.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/transitions/librm.S