diff options
| author | Michael Brown | 2013-03-08 14:26:22 +0100 |
|---|---|---|
| committer | Michael Brown | 2013-03-08 18:42:24 +0100 |
| commit | 0d4a760ffc6561ea69cddcba47c34e98147d30f4 (patch) | |
| tree | 74bd93bc7a6e56cd9750bff37700dfa705585701 /src/arch/i386/prefix | |
| parent | [nbiprefix] Set up real-mode stack before jumping to .text16 (diff) | |
| download | ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.tar.gz ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.tar.xz ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.zip | |
[prefix] Use %cs as implicit parameter to uninstall()
romprefix.S currently calls uninstall() with an invalid value in %ax.
Consequently, base memory is not freed after a ROM boot attempt (or
after entering iPXE during POST).
The uninstall() function is physically present in .text16, and so can
use %cs to determine the .text16 segment address. The .data16 segment
address is not required, since uninstall() is called only by code
paths which set up .data16 to immediately follow .text16.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/i386/prefix')
| -rw-r--r-- | src/arch/i386/prefix/libprefix.S | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/arch/i386/prefix/libprefix.S b/src/arch/i386/prefix/libprefix.S index 2f8fc4e1a..0bd80b0ab 100644 --- a/src/arch/i386/prefix/libprefix.S +++ b/src/arch/i386/prefix/libprefix.S @@ -545,8 +545,7 @@ alloc_basemem: * Free space allocated with alloc_basemem. * * Parameters: - * %ax : .text16 segment address - * %bx : .data16 segment address + * none (.text16 segment address is implicit in %cs) * Returns: * %ax : 0 if successfully freed * Corrupts: @@ -559,14 +558,14 @@ alloc_basemem: free_basemem: /* Preserve registers */ pushw %fs + pushw %ax /* Check FBMS counter */ - pushw %ax + movw %cs, %ax shrw $6, %ax pushw $0x40 popw %fs cmpw %ax, %fs:0x13 - popw %ax jne 1f /* Check hooked interrupt count */ @@ -574,6 +573,7 @@ free_basemem: jne 1f /* OK to free memory */ + movw %cs, %ax addw $_text16_memsz_pgh, %ax addw $_data16_memsz_pgh, %ax shrw $6, %ax @@ -581,6 +581,7 @@ free_basemem: xorw %ax, %ax 1: /* Restore registers and return */ + popw %ax popw %fs ret .size free_basemem, . - free_basemem @@ -872,8 +873,7 @@ close_payload: * Uninstall all text and data segments. * * Parameters: - * %ax : .text16 segment address - * %bx : .data16 segment address + * none (.text16 segment address is implicit in %cs) * Returns: * none * Corrupts: |
