a5bd9f6
From 00c99f9ffcadba94105b7871744f2a3760b7dd35 Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Fri, 19 Apr 2013 15:27:09 +0200
a5bd9f6
Subject: [PATCH 328/364] 	* grub-core/kern/ieee1275/init.c
a5bd9f6
 (grub_claim_heap): Improve handling 	of GRUB_IEEE1275_FLAG_FORCE_CLAIM. 
a5bd9f6
 * grub-core/loader/powerpc/ieee1275/linux.c 	(grub_linux_claimmap_iterate):
a5bd9f6
 Handle GRUB_IEEE1275_FLAG_FORCE_CLAIM.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog                                 |  7 +++++++
a5bd9f6
 grub-core/kern/ieee1275/init.c            |  5 +++--
a5bd9f6
 grub-core/lib/ieee1275/relocator.c        |  4 ++--
a5bd9f6
 grub-core/loader/powerpc/ieee1275/linux.c | 14 ++++++++++++++
a5bd9f6
 include/grub/ieee1275/ieee1275.h          |  8 ++++++++
a5bd9f6
 5 files changed, 34 insertions(+), 4 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index 488be60..3e606cb 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,5 +1,12 @@
a5bd9f6
 2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
+	* grub-core/kern/ieee1275/init.c (grub_claim_heap): Improve handling
a5bd9f6
+	of GRUB_IEEE1275_FLAG_FORCE_CLAIM.
a5bd9f6
+	* grub-core/loader/powerpc/ieee1275/linux.c
a5bd9f6
+	(grub_linux_claimmap_iterate): Handle GRUB_IEEE1275_FLAG_FORCE_CLAIM.
a5bd9f6
+
a5bd9f6
+2013-04-19  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
 	* grub-core/kern/ieee1275/cmain.c (grub_ieee1275_find_options):
a5bd9f6
 	Look for /boot-rom as well as /rom/boot-rom.
a5bd9f6
 
a5bd9f6
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
a5bd9f6
index 391a734..ce8eadb 100644
a5bd9f6
--- a/grub-core/kern/ieee1275/init.c
a5bd9f6
+++ b/grub-core/kern/ieee1275/init.c
a5bd9f6
@@ -225,8 +225,9 @@ grub_claim_heap (void)
a5bd9f6
 {
a5bd9f6
   unsigned long total = 0;
a5bd9f6
 
a5bd9f6
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
a5bd9f6
-    heap_init (HEAP_MAX_ADDR - HEAP_MIN_SIZE, HEAP_MIN_SIZE, 1, &total);
a5bd9f6
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
a5bd9f6
+    heap_init (GRUB_IEEE1275_STATIC_HEAP_START, GRUB_IEEE1275_STATIC_HEAP_LEN,
a5bd9f6
+	       1, &total);
a5bd9f6
   else
a5bd9f6
     grub_machine_mmap_iterate (heap_init, &total);
a5bd9f6
 }
a5bd9f6
diff --git a/grub-core/lib/ieee1275/relocator.c b/grub-core/lib/ieee1275/relocator.c
a5bd9f6
index f6ecadd..c6dd8fa 100644
a5bd9f6
--- a/grub-core/lib/ieee1275/relocator.c
a5bd9f6
+++ b/grub-core/lib/ieee1275/relocator.c
a5bd9f6
@@ -38,7 +38,7 @@ grub_relocator_firmware_get_max_events (void)
a5bd9f6
 {
a5bd9f6
   int counter = 0;
a5bd9f6
 
a5bd9f6
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
a5bd9f6
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
a5bd9f6
     return 0;
a5bd9f6
   grub_machine_mmap_iterate (count, &counter);
a5bd9f6
   return 2 * counter;
a5bd9f6
@@ -92,7 +92,7 @@ grub_relocator_firmware_fill_events (struct grub_relocator_mmap_event *events)
a5bd9f6
     .counter = 0
a5bd9f6
   };
a5bd9f6
 
a5bd9f6
-  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
a5bd9f6
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
a5bd9f6
     return 0;
a5bd9f6
   grub_machine_mmap_iterate (grub_relocator_firmware_fill_events_iter, &ctx;;
a5bd9f6
   return ctx.counter;
a5bd9f6
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
a5bd9f6
index 3356d51..4a14f66 100644
a5bd9f6
--- a/grub-core/loader/powerpc/ieee1275/linux.c
a5bd9f6
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
a5bd9f6
@@ -111,6 +111,20 @@ grub_linux_claimmap_iterate (grub_addr_t target, grub_size_t size,
a5bd9f6
     .found_addr = (grub_addr_t) -1
a5bd9f6
   };
a5bd9f6
 
a5bd9f6
+  if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
a5bd9f6
+    {
a5bd9f6
+      grub_uint64_t addr = target;
a5bd9f6
+      if (addr < GRUB_IEEE1275_STATIC_HEAP_START
a5bd9f6
+	  + GRUB_IEEE1275_STATIC_HEAP_LEN)
a5bd9f6
+	addr = GRUB_IEEE1275_STATIC_HEAP_START
a5bd9f6
+	  + GRUB_IEEE1275_STATIC_HEAP_LEN;
a5bd9f6
+      addr = ALIGN_UP (addr, align);
a5bd9f6
+      if (grub_claimmap (addr, size) == GRUB_ERR_NONE)
a5bd9f6
+	return addr;
a5bd9f6
+      return (grub_addr_t) -1;
a5bd9f6
+    }
a5bd9f6
+	
a5bd9f6
+
a5bd9f6
   grub_machine_mmap_iterate (alloc_mem, &ctx;;
a5bd9f6
 
a5bd9f6
   return ctx.found_addr;
a5bd9f6
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
a5bd9f6
index 1e8ba6f..1b240d3 100644
a5bd9f6
--- a/include/grub/ieee1275/ieee1275.h
a5bd9f6
+++ b/include/grub/ieee1275/ieee1275.h
a5bd9f6
@@ -78,6 +78,14 @@ extern grub_ieee1275_phandle_t EXPORT_VAR(grub_ieee1275_chosen);
a5bd9f6
 extern grub_ieee1275_ihandle_t EXPORT_VAR(grub_ieee1275_mmu);
a5bd9f6
 extern int (* EXPORT_VAR(grub_ieee1275_entry_fn)) (void *);
a5bd9f6
 
a5bd9f6
+/* Static heap, used only if FORCE_CLAIM is set,
a5bd9f6
+   happens on Open Hack'Ware. Should be in platform-specific
a5bd9f6
+   header but is used only on PPC anyway.
a5bd9f6
+*/
a5bd9f6
+#define GRUB_IEEE1275_STATIC_HEAP_START 0x1000000
a5bd9f6
+#define GRUB_IEEE1275_STATIC_HEAP_LEN   0x1000000
a5bd9f6
+
a5bd9f6
+
a5bd9f6
 enum grub_ieee1275_flag
a5bd9f6
 {
a5bd9f6
   /* Old World Macintosh firmware fails seek when "dev:0" is opened.  */
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6