From: Gerd Hoffmann Date: Fri, 15 Jun 2018 10:07:34 +0000 (+0200) Subject: pmm: use tmp zone on oom X-Git-Tag: rel-1.11.2~3 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=17b01f42361c12389ef7f24c4547f7db1f4d9faf;p=seabios.git pmm: use tmp zone on oom Signed-off-by: Gerd Hoffmann (cherry picked from commit a638acfa4cc772b42093c8bfe55669829a641293) --- diff --git a/src/pmm.c b/src/pmm.c index 6403414..28b253b 100644 --- a/src/pmm.c +++ b/src/pmm.c @@ -8,6 +8,7 @@ #include "config.h" // CONFIG_* #include "malloc.h" // _malloc #include "output.h" // dprintf +#include "e820map.h" // struct e820entry #include "std/pmm.h" // PMM_SIGNATURE #include "string.h" // checksum #include "util.h" // pmm_init @@ -75,6 +76,18 @@ handle_pmm00(u16 *args) break; case 2: data = malloc_palloc(highzone, size, align); + if (!data && (flags & 8)) { + /* + * We are out of meory. So go allocate from the (big) + * ZoneTmpHigh instead and reserve the block in the e820 + * map so the OS will not override it. That way we can + * handle big permanent allocations without needing a big + * ZoneHigh. + */ + data = malloc_palloc(&ZoneTmpHigh, size, align); + if (data) + e820_add(data, size, E820_RESERVED); + } break; case 3: { data = malloc_palloc(lowzone, size, align);