diff options
author | Michael Brown | 2016-02-12 14:59:06 +0100 |
---|---|---|
committer | Michael Brown | 2016-02-12 15:04:51 +0100 |
commit | 7ecfe7159f94193a666200a17057d4cd5981b850 (patch) | |
tree | 79231c567dccb649c55bd28d7ebc0679d5c8531f /src | |
parent | [intel] Add INTEL_NO_PHY_RST for another I218-LM variant (diff) | |
download | ipxe-7ecfe7159f94193a666200a17057d4cd5981b850.tar.gz ipxe-7ecfe7159f94193a666200a17057d4cd5981b850.tar.xz ipxe-7ecfe7159f94193a666200a17057d4cd5981b850.zip |
[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>
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/i386/prefix/libprefix.S | 13 | ||||
-rw-r--r-- | src/arch/i386/scripts/i386.lds | 4 |
2 files changed, 7 insertions, 10 deletions
diff --git a/src/arch/i386/prefix/libprefix.S b/src/arch/i386/prefix/libprefix.S index 7d5c1ed5..3cdb6ec9 100644 --- a/src/arch/i386/prefix/libprefix.S +++ b/src/arch/i386/prefix/libprefix.S @@ -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 diff --git a/src/arch/i386/scripts/i386.lds b/src/arch/i386/scripts/i386.lds index 38c89e14..865591ae 100644 --- a/src/arch/i386/scripts/i386.lds +++ b/src/arch/i386/scripts/i386.lds @@ -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 ); } |