On Wed, Jun 18, 2008 at 1:39 AM, Robert Millan <[EMAIL PROTECTED]> wrote:
> On Tue, Jun 17, 2008 at 11:44:36PM +0800, Bean wrote:
>> + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
>> + {
>> + grub_addr_t addr;
>> + grub_uint32_t len;
>> +
>> + addr = HEAP_MAX_ADDR - HEAP_MIN_SIZE;
>> + len = HEAP_MIN_SIZE;
>> +
>> + 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_mm_init_region ((void *) addr, len);
>> + }
>> + else
>> + grub_available_iterate (heap_init);
>> }
>
> This skips all the checks in heap_init(), which were intended for situations
> that could also apply to Open Hackware. Would be better if you call
> heap_init() with the desired parameters instead.
Hi,
You're right, this is the new patch.
btw, I also include the previous elf header patch. It's working in
linuxbios, olpc and ppc, I guess it should be all right.
--
Bean
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
index 5c06025..e73c516 100644
--- a/include/grub/ieee1275/ieee1275.h
+++ b/include/grub/ieee1275/ieee1275.h
@@ -89,6 +89,15 @@ enum grub_ieee1275_flag
/* Open Hack'Ware stops when trying to set colors */
GRUB_IEEE1275_FLAG_CANNOT_SET_COLORS,
+
+ /* Open Hack'Ware stops when grub_ieee1275_interpret is used. */
+ GRUB_IEEE1275_FLAG_CANNOT_INTERPRET,
+
+ /* Open Hack'Ware has no memory map, just claim what we need. */
+ GRUB_IEEE1275_FLAG_FORCE_CLAIM,
+
+ /* Open Hack'Ware don't support the ANSI sequence. */
+ GRUB_IEEE1275_FLAG_NO_ANSI,
};
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
diff --git a/kern/ieee1275/cmain.c b/kern/ieee1275/cmain.c
index 54a52b6..b5e2ba6 100644
--- a/kern/ieee1275/cmain.c
+++ b/kern/ieee1275/cmain.c
@@ -144,6 +144,9 @@ grub_ieee1275_find_options (void)
{
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT);
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CANNOT_SET_COLORS);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_ANSI);
}
}
}
diff --git a/kern/ieee1275/ieee1275.c b/kern/ieee1275/ieee1275.c
index 135b30e..2605901 100644
--- a/kern/ieee1275/ieee1275.c
+++ b/kern/ieee1275/ieee1275.c
@@ -390,6 +390,9 @@ grub_ieee1275_interpret (const char *command, grub_ieee1275_cell_t *catch)
}
args;
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
+ return -1;
+
INIT_IEEE1275_COMMON (&args.common, "interpret", 1, 1);
args.command = (grub_ieee1275_cell_t) command;
diff --git a/kern/ieee1275/init.c b/kern/ieee1275/init.c
index b8f414b..645d1bd 100644
--- a/kern/ieee1275/init.c
+++ b/kern/ieee1275/init.c
@@ -171,7 +171,10 @@ static void grub_claim_heap (void)
return 0;
}
- grub_available_iterate (heap_init);
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
+ heap_init (HEAP_MAX_ADDR - HEAP_MIN_SIZE, HEAP_MIN_SIZE);
+ else
+ grub_available_iterate (heap_init);
}
#ifdef __i386__
diff --git a/term/ieee1275/ofconsole.c b/term/ieee1275/ofconsole.c
index 3b269ce..9af4327 100644
--- a/term/ieee1275/ofconsole.c
+++ b/term/ieee1275/ofconsole.c
@@ -63,6 +63,9 @@ static int bgcolor = 0;
static void
grub_ofconsole_writeesc (const char *str)
{
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_ANSI))
+ return;
+
while (*str)
{
char chr = *(str++);
@@ -284,11 +287,28 @@ static void
grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
{
char s[11]; /* 5 + 3 + 3. */
- grub_curr_x = x;
- grub_curr_y = y;
- grub_sprintf (s, "\e[%d;%dH", y + 1, x + 1);
- grub_ofconsole_writeesc (s);
+ if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_ANSI))
+ {
+ grub_curr_x = x;
+ grub_curr_y = y;
+
+ grub_sprintf (s, "\e[%d;%dH", y + 1, x + 1);
+ grub_ofconsole_writeesc (s);
+ }
+ else
+ {
+ if ((y == grub_curr_y) && (x == grub_curr_x - 1))
+ {
+ char chr;
+
+ chr = '\b';
+ grub_ieee1275_write (stdout_ihandle, &chr, 1, 0);
+ }
+
+ grub_curr_x = x;
+ grub_curr_y = y;
+ }
}
static void
diff --git a/util/elf/grub-mkimage.c b/util/elf/grub-mkimage.c
index ca138dd..43c873e 100644
--- a/util/elf/grub-mkimage.c
+++ b/util/elf/grub-mkimage.c
@@ -166,8 +166,8 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
FILE *in;
char *kernel_path;
grub_addr_t grub_end = 0;
- off_t phdroff;
- int i;
+ off_t offset;
+ int i, phdr_size;
/* Read ELF header. */
kernel_path = grub_util_get_path (dir, "kernel.elf");
@@ -177,8 +177,21 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
grub_util_read_at (&ehdr, sizeof (ehdr), 0, in);
- phdrs = xmalloc (grub_target_to_host16 (ehdr.e_phentsize)
- * (grub_target_to_host16 (ehdr.e_phnum) + 2));
+ offset = ALIGN_UP (sizeof (ehdr), sizeof (long));
+ ehdr.e_phoff = grub_host_to_target32 (offset);
+
+ phdr_size = (grub_target_to_host16 (ehdr.e_phentsize) *
+ grub_target_to_host16 (ehdr.e_phnum));
+
+ if (mods[0] != NULL)
+ phdr_size += grub_target_to_host16 (ehdr.e_phentsize);
+
+ if (chrp)
+ phdr_size += grub_target_to_host16 (ehdr.e_phentsize);
+
+ phdrs = xmalloc (phdr_size);
+ offset += ALIGN_UP (phdr_size, sizeof (long));
+
/* Copy all existing segments. */
for (i = 0; i < grub_target_to_host16 (ehdr.e_phnum); i++)
{
@@ -207,8 +220,11 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
grub_util_read_at (segment_img, grub_target_to_host32 (phdr->p_filesz),
grub_target_to_host32 (phdr->p_offset), in);
+
+ phdr->p_offset = grub_host_to_target32 (offset);
grub_util_write_image_at (segment_img, grub_target_to_host32 (phdr->p_filesz),
- grub_target_to_host32 (phdr->p_offset), out);
+ offset, out);
+ offset += ALIGN_UP (grub_target_to_host32 (phdr->p_filesz), sizeof (long));
free (segment_img);
}
@@ -249,14 +265,10 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
ehdr.e_shnum = 0;
ehdr.e_shstrndx = 0;
- /* Append entire segment table to the file. */
- phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
- grub_util_write_image_at (phdrs, grub_target_to_host16 (ehdr.e_phentsize)
- * grub_target_to_host16 (ehdr.e_phnum), phdroff,
- out);
+ /* Write entire segment table to the file. */
+ grub_util_write_image_at (phdrs, phdr_size, grub_target_to_host32 (ehdr.e_phoff), out);
/* Write ELF header. */
- ehdr.e_phoff = grub_host_to_target32 (phdroff);
grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
free (phdrs);
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel