* include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): New value

GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM.
	* kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set
	GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM on qemu.
	* kern/ieee1275/init.c (grub_claim_heap): Don0t allocate below
	1.5MiB if GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM is set.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-05-05 18:52:13 +02:00
parent a7fc080b56
commit 7e720a9bc1
4 changed files with 33 additions and 0 deletions

View file

@ -1,3 +1,12 @@
2010-05-05 Vladimir Serbinenko <phcoder@gmail.com>
* include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): New value
GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM.
* kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set
GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM on qemu.
* kern/ieee1275/init.c (grub_claim_heap): Don0t allocate below
1.5MiB if GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM is set.
2010-05-05 Vladimir Serbinenko <phcoder@gmail.com> 2010-05-05 Vladimir Serbinenko <phcoder@gmail.com>
* term/ieee1275/ofconsole.c (grub_ofconsole_getkey): Fix off-by-one * term/ieee1275/ofconsole.c (grub_ofconsole_getkey): Fix off-by-one

View file

@ -100,6 +100,9 @@ enum grub_ieee1275_flag
/* Open Hack'Ware don't support the ANSI sequence. */ /* Open Hack'Ware don't support the ANSI sequence. */
GRUB_IEEE1275_FLAG_NO_ANSI, GRUB_IEEE1275_FLAG_NO_ANSI,
/* OpenFirmware hangs on qemu if one requests any memory below 1.5 MiB. */
GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM,
}; };
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag); extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);

View file

@ -59,6 +59,7 @@ grub_ieee1275_find_options (void)
char tmp[32]; char tmp[32];
int is_smartfirmware = 0; int is_smartfirmware = 0;
int is_olpc = 0; int is_olpc = 0;
int is_qemu = 0;
grub_ieee1275_finddevice ("/", &root); grub_ieee1275_finddevice ("/", &root);
grub_ieee1275_finddevice ("/options", &options); grub_ieee1275_finddevice ("/options", &options);
@ -79,6 +80,11 @@ grub_ieee1275_find_options (void)
if (rc >= 0 && !grub_strcmp (tmp, "OLPC")) if (rc >= 0 && !grub_strcmp (tmp, "OLPC"))
is_olpc = 1; is_olpc = 1;
rc = grub_ieee1275_get_property (root, "model",
tmp, sizeof (tmp), 0);
if (rc >= 0 && !grub_strcmp (tmp, "Emulated PC"))
is_qemu = 1;
if (is_smartfirmware) if (is_smartfirmware)
{ {
/* Broken in all versions */ /* Broken in all versions */
@ -135,6 +141,10 @@ grub_ieee1275_find_options (void)
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_OFDISK_SDCARD_ONLY); grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_OFDISK_SDCARD_ONLY);
} }
if (is_qemu)
/* OpenFirmware hangs on qemu if one requests any memory below 1.5 MiB. */
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM);
if (! grub_ieee1275_finddevice ("/rom/boot-rom", &bootrom)) if (! grub_ieee1275_finddevice ("/rom/boot-rom", &bootrom))
{ {
rc = grub_ieee1275_get_property (bootrom, "model", tmp, sizeof (tmp), 0); rc = grub_ieee1275_get_property (bootrom, "model", tmp, sizeof (tmp), 0);

View file

@ -133,6 +133,17 @@ static void grub_claim_heap (void)
if (type != 1) if (type != 1)
return 0; return 0;
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM))
{
if (addr + len <= 0x180000)
return 0;
if (addr < 0x180000)
{
len = addr + len - 0x180000;
addr = 0x180000;
}
}
len -= 1; /* Required for some firmware. */ len -= 1; /* Required for some firmware. */
/* Never exceed HEAP_MAX_SIZE */ /* Never exceed HEAP_MAX_SIZE */