On Sun, Jul 29, 2007 at 09:30:11PM +0200, Robert Millan wrote:
>
> Hi Sven,
>
> I have a pair of questions about the memory issue..
>
> [...]
Ok, after some discussion on IRC, and invaluable help by Sven in documenting
smartfirmware behaviour, I came up with this patch.
Please let me know what you think. If there are no objections I'll check it
in in a few days.
2007-07-30 Robert Millan <[EMAIL PROTECTED]>
* include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): Add
GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION flag.
* kern/powerpc/ieee1275/cmain.c (grub_ieee1275_find_options): Set
GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION flag when running
on an Efika (SmartFirmware).
* kern/powerpc/ieee1275/init.c (grub_claim_heap): Fail gracefuly when
addr > heaplimit.
Use grub_printf instead of grub_error for error reporting, since
grub_error doesn't work at this point of execution.
When GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION was set,
release hardcoded 0x4000:0xffc000 region.
--
Robert Millan
My spam trap is [EMAIL PROTECTED] Note: this address is only intended
for spam harvesters. Writing to it will get you added to my black list.
2007-07-30 Robert Millan <[EMAIL PROTECTED]>
* include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): Add
GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION flag.
* kern/powerpc/ieee1275/cmain.c (grub_ieee1275_find_options): Set
GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION flag when running
on an Efika (SmartFirmware).
* kern/powerpc/ieee1275/init.c (grub_claim_heap): Fail gracefuly when
addr > heaplimit.
Use grub_printf instead of grub_error for error reporting, since
grub_error doesn't work at this point of execution.
When GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION was set,
release hardcoded 0x4000:0xffc000 region.
Index: include/grub/ieee1275/ieee1275.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/ieee1275/ieee1275.h,v
retrieving revision 1.7
diff -u -r1.7 ieee1275.h
--- include/grub/ieee1275/ieee1275.h 22 Jul 2007 09:05:10 -0000 1.7
+++ include/grub/ieee1275/ieee1275.h 30 Jul 2007 19:52:32 -0000
@@ -82,6 +82,10 @@
/* CodeGen firmware does not correctly implement "output-device output" */
GRUB_IEEE1275_FLAG_BROKEN_OUTPUT,
+
+ /* Efika version of CodeGen firmware has an available memory region that
+ is not represented in /memory/available. */
+ GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION,
};
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
Index: kern/powerpc/ieee1275/cmain.c
===================================================================
RCS file: /sources/grub/grub2/kern/powerpc/ieee1275/cmain.c,v
retrieving revision 1.9
diff -u -r1.9 cmain.c
--- kern/powerpc/ieee1275/cmain.c 22 Jul 2007 09:16:51 -0000 1.9
+++ kern/powerpc/ieee1275/cmain.c 30 Jul 2007 19:52:32 -0000
@@ -63,9 +63,14 @@
rc = grub_ieee1275_get_property (openprom, "SmartFirmware-version", 0, 0, 0);
if (rc >= 0)
{
+ char model[32];
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0);
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS);
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT);
+
+ rc = grub_ieee1275_get_property (openprom, "model", &model, sizeof model, 0);
+ if ((rc >= 0) && !grub_strncmp (model, "EFIKA", 5))
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION);
}
}
Index: kern/powerpc/ieee1275/init.c
===================================================================
RCS file: /sources/grub/grub2/kern/powerpc/ieee1275/init.c,v
retrieving revision 1.31
diff -u -r1.31 init.c
--- kern/powerpc/ieee1275/init.c 21 Jul 2007 23:32:27 -0000 1.31
+++ kern/powerpc/ieee1275/init.c 30 Jul 2007 19:52:32 -0000
@@ -121,6 +121,12 @@
len -= 1; /* Required for some firmware. */
/* Don't claim anything above `heaplimit'. */
+ if (addr > heaplimit)
+ {
+ grub_printf ("Cannot claim heap above limit (0x%llx > 0x%lx)\n", addr, heaplimit);
+ return GRUB_ERR_OUT_OF_MEMORY;
+ }
+
if (addr + len > heaplimit)
len = heaplimit - addr;
@@ -128,15 +134,19 @@
{
/* Claim and use it. */
if (grub_claimmap (addr, len) < 0)
- return grub_error (GRUB_ERR_OUT_OF_MEMORY,
- "Failed to claim heap at 0x%llx, len 0x%llx\n",
- addr, len);
+ {
+ grub_printf ("Failed to claim heap at 0x%llx, len 0x%llx\n", addr, len);
+ return GRUB_ERR_OUT_OF_MEMORY;
+ }
grub_mm_init_region ((void *) (grub_addr_t) addr, len);
}
return 0;
}
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_EFIKA_SECRET_AVAILABLE_REGION));
+ grub_ieee1275_release (0x4000, 0xffc000);
+
grub_available_iterate (heap_init);
}
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel