diff options
author | Michael Brown <mcb30@ipxe.org> | 2013-03-08 13:26:22 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2013-03-08 17:42:24 +0000 |
commit | 0d4a760ffc6561ea69cddcba47c34e98147d30f4 (patch) | |
tree | 74bd93bc7a6e56cd9750bff37700dfa705585701 | |
parent | c7694acb51be7a3676d1b30fd1b0ba34bce09f39 (diff) | |
download | ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.zip ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.tar.gz ipxe-0d4a760ffc6561ea69cddcba47c34e98147d30f4.tar.bz2 |
[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>
-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 2f8fc4e..0bd80b0 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: |