]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/kern/ieee1275/init.c (grub_claim_heap): Improve handling
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 19 Apr 2013 13:27:09 +0000 (15:27 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 19 Apr 2013 13:27:09 +0000 (15:27 +0200)
of GRUB_IEEE1275_FLAG_FORCE_CLAIM.
* grub-core/loader/powerpc/ieee1275/linux.c
(grub_linux_claimmap_iterate): Handle GRUB_IEEE1275_FLAG_FORCE_CLAIM.

ChangeLog
grub-core/kern/ieee1275/init.c
grub-core/lib/ieee1275/relocator.c
grub-core/loader/powerpc/ieee1275/linux.c
include/grub/ieee1275/ieee1275.h

index 488be607bbdeb795d89698e573d8eb02b976a205..3e606cba9e7b2dbf14e2700ee7b7a38e1cdd4c71 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/kern/ieee1275/init.c (grub_claim_heap): Improve handling
+       of GRUB_IEEE1275_FLAG_FORCE_CLAIM.
+       * grub-core/loader/powerpc/ieee1275/linux.c
+       (grub_linux_claimmap_iterate): Handle GRUB_IEEE1275_FLAG_FORCE_CLAIM.
+
 2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/kern/ieee1275/cmain.c (grub_ieee1275_find_options):
index 391a734d4b494127df6447a0e700c05d0c55d46e..ce8eadbd3ae31059937d8b7971372a18fbb7bb4e 100644 (file)
@@ -225,8 +225,9 @@ grub_claim_heap (void)
 {
   unsigned long total = 0;
 
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
-    heap_init (HEAP_MAX_ADDR - HEAP_MIN_SIZE, HEAP_MIN_SIZE, 1, &total);
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
+    heap_init (GRUB_IEEE1275_STATIC_HEAP_START, GRUB_IEEE1275_STATIC_HEAP_LEN,
+              1, &total);
   else
     grub_machine_mmap_iterate (heap_init, &total);
 }
index f6ecaddc76d0fa263d7fc3ccbde70c6f00f903d2..c6dd8facb02ac77f5b3392399fb46413b8e3ff95 100644 (file)
@@ -38,7 +38,7 @@ grub_relocator_firmware_get_max_events (void)
 {
   int counter = 0;
 
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
     return 0;
   grub_machine_mmap_iterate (count, &counter);
   return 2 * counter;
@@ -92,7 +92,7 @@ grub_relocator_firmware_fill_events (struct grub_relocator_mmap_event *events)
     .counter = 0
   };
 
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
     return 0;
   grub_machine_mmap_iterate (grub_relocator_firmware_fill_events_iter, &ctx);
   return ctx.counter;
index 3356d51ac9ea57114303bf1d44d5bd89f96f0d0c..4a14f66dee52ed081b0801899727ac627eea30fd 100644 (file)
@@ -111,6 +111,20 @@ grub_linux_claimmap_iterate (grub_addr_t target, grub_size_t size,
     .found_addr = (grub_addr_t) -1
   };
 
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
+    {
+      grub_uint64_t addr = target;
+      if (addr < GRUB_IEEE1275_STATIC_HEAP_START
+         + GRUB_IEEE1275_STATIC_HEAP_LEN)
+       addr = GRUB_IEEE1275_STATIC_HEAP_START
+         + GRUB_IEEE1275_STATIC_HEAP_LEN;
+      addr = ALIGN_UP (addr, align);
+      if (grub_claimmap (addr, size) == GRUB_ERR_NONE)
+       return addr;
+      return (grub_addr_t) -1;
+    }
+       
+
   grub_machine_mmap_iterate (alloc_mem, &ctx);
 
   return ctx.found_addr;
index 1e8ba6f847ad1c96f98b5836868214b2e8e7ce4e..1b240d3df5e3ec3e8dcc0ab83de09c9dc1a8c5ed 100644 (file)
@@ -78,6 +78,14 @@ extern grub_ieee1275_phandle_t EXPORT_VAR(grub_ieee1275_chosen);
 extern grub_ieee1275_ihandle_t EXPORT_VAR(grub_ieee1275_mmu);
 extern int (* EXPORT_VAR(grub_ieee1275_entry_fn)) (void *);
 
+/* Static heap, used only if FORCE_CLAIM is set,
+   happens on Open Hack'Ware. Should be in platform-specific
+   header but is used only on PPC anyway.
+*/
+#define GRUB_IEEE1275_STATIC_HEAP_START 0x1000000
+#define GRUB_IEEE1275_STATIC_HEAP_LEN   0x1000000
+
+
 enum grub_ieee1275_flag
 {
   /* Old World Macintosh firmware fails seek when "dev:0" is opened.  */