david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[prefix] Pad .text16 and .data16 segment sizes at build time

Commit c64747d ("[librm] Speed up real-to-protected mode transition
under KVM") rounded down the .text16 segment address calculated in
alloc_basemem() to a multiple of 64 bytes in order to speed up mode
transitions under KVM.

This creates a potential discrepancy between alloc_basemem() and
free_basemem(), meaning that free_basemem() may free less memory than
was allocated by alloc_basemem().

Fix by padding the calculated sizes of both .text16 and .data16 to a
multiple of 64 bytes at build time.

Debugged-by: Yossef Efraim <yossefe@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2016-02-12 13:59:06 +00:00
parent 0588c03772
commit 7ecfe7159f
2 changed files with 7 additions and 10 deletions

View File

@ -558,14 +558,11 @@ alloc_basemem:
shlw $6, %ax
/* Calculate .data16 segment address */
subw $_data16_memsz_pgh, %ax
subw $_data16_memsz_ppgh, %ax
pushw %ax
/* Calculate .text16 segment address. Round down to ensure
* low bits are zero, to speed up mode transitions under KVM.
*/
subw $_text16_memsz_pgh, %ax
andb $~0x03, %al
/* Calculate .text16 segment address */
subw $_text16_memsz_ppgh, %ax
pushw %ax
/* Update FBMS */
@ -616,8 +613,8 @@ free_basemem:
/* OK to free memory */
movw %cs, %ax
addw $_text16_memsz_pgh, %ax
addw $_data16_memsz_pgh, %ax
addw $_text16_memsz_ppgh, %ax
addw $_data16_memsz_ppgh, %ax
shrw $6, %ax
movw %ax, %fs:0x13
xorw %ax, %ax

View File

@ -247,8 +247,8 @@ SECTIONS {
* Values calculated to save code from doing it
*
*/
_text16_memsz_pgh = ( ( _text16_memsz + 15 ) / 16 );
_data16_memsz_pgh = ( ( _data16_memsz + 15 ) / 16 );
_text16_memsz_ppgh = ( ( ( _text16_memsz + 63 ) / 64 ) * 4 );
_data16_memsz_ppgh = ( ( ( _data16_memsz + 63 ) / 64 ) * 4 );
_textdata_memsz_pgh = ( ( _textdata_memsz + 15 ) / 16 );
_textdata_memsz_kb = ( ( _textdata_memsz + 1023 ) / 1024 );
}