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);