aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2013-03-08 13:26:22 +0000
committerMichael Brown <mcb30@ipxe.org>2013-03-08 17:42:24 +0000
commit0d4a760ffc6561ea69cddcba47c34e98147d30f4 (patch)
tree74bd93bc7a6e56cd9750bff37700dfa705585701 /src/arch
parentc7694acb51be7a3676d1b30fd1b0ba34bce09f39 (diff)
downloadipxe-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>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/i386/prefix/libprefix.S12
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: