2008-07-02 Bean <bean123ch@gmail.com>
* include/grub/ieee1275.h (grub_ieee1275_flag): New constant GRUB_IEEE1275_FLAG_CANNOT_INTERPRET, GRUB_IEEE1275_FLAG_FORCE_CLAIM and GRUB_IEEE1275_FLAG_NO_ANSI. * kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set flag GRUB_IEEE1275_FLAG_CANNOT_INTERPRET, GRUB_IEEE1275_FLAG_FORCE_CLAIM and GRUB_IEEE1275_FLAG_NO_ANSI for Open Hackware. * kern/ieee1275/ieee1275.c (grub_ieee1275_interpret): Return immediately if GRUB_IEEE1275_FLAG_CANNOT_INTERPRET is set. * kern/ieee1275/init.c (grub_claim_heap): Claim memory directly if GRUB_IEEE1275_FLAG_FORCE_CLAIM is set. * term/ieee1275/ofconsole.c (grub_ofconsole_writeesc): Don't output esc sequence on non ANSI terminal. (grub_ofconsole_gotoxy): Emulate backspace key on non ANSI terminal. * util/elf/grub-mkimage.c (add_segments): Move ELF header to the beginning of file.
This commit is contained in:
parent
2270f77bea
commit
d4156eeedf
7 changed files with 89 additions and 16 deletions
23
ChangeLog
23
ChangeLog
|
@ -1,3 +1,26 @@
|
||||||
|
2008-07-02 Bean <bean123ch@gmail.com>
|
||||||
|
|
||||||
|
* include/grub/ieee1275.h (grub_ieee1275_flag): New constant
|
||||||
|
GRUB_IEEE1275_FLAG_CANNOT_INTERPRET, GRUB_IEEE1275_FLAG_FORCE_CLAIM
|
||||||
|
and GRUB_IEEE1275_FLAG_NO_ANSI.
|
||||||
|
|
||||||
|
* kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set flag
|
||||||
|
GRUB_IEEE1275_FLAG_CANNOT_INTERPRET, GRUB_IEEE1275_FLAG_FORCE_CLAIM
|
||||||
|
and GRUB_IEEE1275_FLAG_NO_ANSI for Open Hackware.
|
||||||
|
|
||||||
|
* kern/ieee1275/ieee1275.c (grub_ieee1275_interpret): Return
|
||||||
|
immediately if GRUB_IEEE1275_FLAG_CANNOT_INTERPRET is set.
|
||||||
|
|
||||||
|
* kern/ieee1275/init.c (grub_claim_heap): Claim memory directly if
|
||||||
|
GRUB_IEEE1275_FLAG_FORCE_CLAIM is set.
|
||||||
|
|
||||||
|
* term/ieee1275/ofconsole.c (grub_ofconsole_writeesc): Don't output
|
||||||
|
esc sequence on non ANSI terminal.
|
||||||
|
(grub_ofconsole_gotoxy): Emulate backspace key on non ANSI terminal.
|
||||||
|
|
||||||
|
* util/elf/grub-mkimage.c (add_segments): Move ELF header to the
|
||||||
|
beginning of file.
|
||||||
|
|
||||||
2008-07-02 Bean <bean123ch@gmail.com>
|
2008-07-02 Bean <bean123ch@gmail.com>
|
||||||
|
|
||||||
* conf/common.rmk (bin_UTILITIES): Add grub-editenv.
|
* conf/common.rmk (bin_UTILITIES): Add grub-editenv.
|
||||||
|
|
|
@ -89,6 +89,15 @@ enum grub_ieee1275_flag
|
||||||
|
|
||||||
/* Open Hack'Ware stops when trying to set colors */
|
/* Open Hack'Ware stops when trying to set colors */
|
||||||
GRUB_IEEE1275_FLAG_CANNOT_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);
|
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
|
||||||
|
|
|
@ -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_BROKEN_OUTPUT);
|
||||||
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CANNOT_SET_COLORS);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -390,6 +390,9 @@ grub_ieee1275_interpret (const char *command, grub_ieee1275_cell_t *catch)
|
||||||
}
|
}
|
||||||
args;
|
args;
|
||||||
|
|
||||||
|
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_INTERPRET))
|
||||||
|
return -1;
|
||||||
|
|
||||||
INIT_IEEE1275_COMMON (&args.common, "interpret", 1, 1);
|
INIT_IEEE1275_COMMON (&args.common, "interpret", 1, 1);
|
||||||
args.command = (grub_ieee1275_cell_t) command;
|
args.command = (grub_ieee1275_cell_t) command;
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,10 @@ static void grub_claim_heap (void)
|
||||||
return 0;
|
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__
|
#ifdef __i386__
|
||||||
|
|
|
@ -63,6 +63,9 @@ static grub_uint8_t grub_ofconsole_highlight_color = 0x70;
|
||||||
static void
|
static void
|
||||||
grub_ofconsole_writeesc (const char *str)
|
grub_ofconsole_writeesc (const char *str)
|
||||||
{
|
{
|
||||||
|
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_ANSI))
|
||||||
|
return;
|
||||||
|
|
||||||
while (*str)
|
while (*str)
|
||||||
{
|
{
|
||||||
char chr = *(str++);
|
char chr = *(str++);
|
||||||
|
@ -284,11 +287,28 @@ static void
|
||||||
grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
|
grub_ofconsole_gotoxy (grub_uint8_t x, grub_uint8_t y)
|
||||||
{
|
{
|
||||||
char s[11]; /* 5 + 3 + 3. */
|
char s[11]; /* 5 + 3 + 3. */
|
||||||
grub_curr_x = x;
|
|
||||||
grub_curr_y = y;
|
|
||||||
|
|
||||||
grub_sprintf (s, "\e[%d;%dH", y + 1, x + 1);
|
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_ANSI))
|
||||||
grub_ofconsole_writeesc (s);
|
{
|
||||||
|
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
|
static void
|
||||||
|
|
|
@ -166,8 +166,8 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
||||||
FILE *in;
|
FILE *in;
|
||||||
char *kernel_path;
|
char *kernel_path;
|
||||||
grub_addr_t grub_end = 0;
|
grub_addr_t grub_end = 0;
|
||||||
off_t phdroff;
|
off_t offset;
|
||||||
int i;
|
int i, phdr_size;
|
||||||
|
|
||||||
/* Read ELF header. */
|
/* Read ELF header. */
|
||||||
kernel_path = grub_util_get_path (dir, "kernel.elf");
|
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);
|
grub_util_read_at (&ehdr, sizeof (ehdr), 0, in);
|
||||||
|
|
||||||
phdrs = xmalloc (grub_target_to_host16 (ehdr.e_phentsize)
|
offset = ALIGN_UP (sizeof (ehdr), sizeof (long));
|
||||||
* (grub_target_to_host16 (ehdr.e_phnum) + 2));
|
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. */
|
/* Copy all existing segments. */
|
||||||
for (i = 0; i < grub_target_to_host16 (ehdr.e_phnum); i++)
|
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_util_read_at (segment_img, grub_target_to_host32 (phdr->p_filesz),
|
||||||
grub_target_to_host32 (phdr->p_offset), in);
|
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_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);
|
free (segment_img);
|
||||||
}
|
}
|
||||||
|
@ -249,14 +265,10 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
|
||||||
ehdr.e_shnum = 0;
|
ehdr.e_shnum = 0;
|
||||||
ehdr.e_shstrndx = 0;
|
ehdr.e_shstrndx = 0;
|
||||||
|
|
||||||
/* Append entire segment table to the file. */
|
/* Write entire segment table to the file. */
|
||||||
phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
|
grub_util_write_image_at (phdrs, phdr_size, grub_target_to_host32 (ehdr.e_phoff), out);
|
||||||
grub_util_write_image_at (phdrs, grub_target_to_host16 (ehdr.e_phentsize)
|
|
||||||
* grub_target_to_host16 (ehdr.e_phnum), phdroff,
|
|
||||||
out);
|
|
||||||
|
|
||||||
/* Write ELF header. */
|
/* Write ELF header. */
|
||||||
ehdr.e_phoff = grub_host_to_target32 (phdroff);
|
|
||||||
grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
|
grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
|
||||||
|
|
||||||
free (phdrs);
|
free (phdrs);
|
||||||
|
|
Loading…
Add table
Reference in a new issue