]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
pmm: use tmp zone on oom
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 15 Jun 2018 10:07:34 +0000 (12:07 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Fri, 22 Jun 2018 05:44:07 +0000 (07:44 +0200)
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
src/pmm.c

index 6403414724867a733a2dea61d9dca3ee9d3067cf..28b253b2d33cba8981a2ff1b150a39555ed10ee1 100644 (file)
--- 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);