aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Martínez <xose@google.com>2023-06-13 11:01:34 -0400
committerKevin O'Connor <kevin@koconnor.net>2023-06-13 11:01:34 -0400
commit4db444b9a78abf9f6dc981f0e79db749765dc6e8 (patch)
tree12345770c63bb1b86fe295a315fe3f04e5a86a5a
parentbe7e899350caa7b74d8271a34264c3b4aef25ab0 (diff)
downloadseabios-4db444b9a78abf9f6dc981f0e79db749765dc6e8.tar.gz
Fix high memory zone initialization in CSM mode
malloc_high() cannot allocate any memory in CSM mode due to an empty ZoneHigh. SeaBIOS cannot find any disk to boot from because device initialization fails. The bug was introduced in 1.16.1 (commit dc88f9b) when the meaning of BUILD_MAX_HIGHTABLE changed but CSM code was not updated. This patch reverts to the previous behavior by using BUILD_MIN_HIGHTABLE in CSM methods. Signed-off-by: José Martínez <xose@google.com>
-rw-r--r--src/fw/csm.c4
-rw-r--r--src/malloc.c6
2 files changed, 5 insertions, 5 deletions
diff --git a/src/fw/csm.c b/src/fw/csm.c
index bc14a925..579debdc 100644
--- a/src/fw/csm.c
+++ b/src/fw/csm.c
@@ -150,9 +150,9 @@ handle_csm_0002(struct bregs *regs)
for (i=0; i < csm_compat_table.E820Length / sizeof(struct e820entry); i++)
e820_add(p[i].start, p[i].size, p[i].type);
- if (csm_init_table->HiPmmMemorySizeInBytes > BUILD_MAX_HIGHTABLE) {
+ if (csm_init_table->HiPmmMemorySizeInBytes > BUILD_MIN_HIGHTABLE) {
u32 hi_pmm_end = csm_init_table->HiPmmMemory + csm_init_table->HiPmmMemorySizeInBytes;
- e820_add(hi_pmm_end - BUILD_MAX_HIGHTABLE, BUILD_MAX_HIGHTABLE, E820_RESERVED);
+ e820_add(hi_pmm_end - BUILD_MIN_HIGHTABLE, BUILD_MIN_HIGHTABLE, E820_RESERVED);
}
// For PCIBIOS 1ab10e
diff --git a/src/malloc.c b/src/malloc.c
index da840980..30b2c92c 100644
--- a/src/malloc.c
+++ b/src/malloc.c
@@ -460,10 +460,10 @@ malloc_csm_preinit(u32 low_pmm, u32 low_pmm_size, u32 hi_pmm, u32 hi_pmm_size)
{
ASSERT32FLAT();
- if (hi_pmm_size > BUILD_MAX_HIGHTABLE) {
+ if (hi_pmm_size > BUILD_MIN_HIGHTABLE) {
u32 hi_pmm_end = hi_pmm + hi_pmm_size;
- alloc_add(&ZoneTmpHigh, hi_pmm, hi_pmm_end - BUILD_MAX_HIGHTABLE);
- alloc_add(&ZoneHigh, hi_pmm_end - BUILD_MAX_HIGHTABLE, hi_pmm_end);
+ alloc_add(&ZoneTmpHigh, hi_pmm, hi_pmm_end - BUILD_MIN_HIGHTABLE);
+ alloc_add(&ZoneHigh, hi_pmm_end - BUILD_MIN_HIGHTABLE, hi_pmm_end);
} else {
alloc_add(&ZoneTmpHigh, hi_pmm, hi_pmm + hi_pmm_size);
}