]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[prefix] Use %cs as implicit parameter to uninstall()
authorMichael Brown <mcb30@ipxe.org>
Fri, 8 Mar 2013 13:26:22 +0000 (13:26 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 8 Mar 2013 17:42:24 +0000 (17:42 +0000)
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>
src/arch/i386/prefix/libprefix.S

index 2f8fc4e1ab76850e3b805d355cdb233ca0cdf148..0bd80b0abad93d5a037c7109737a81b430a023c9 100644 (file)
@@ -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: