Hi,
This new patch uses a little trick to make the backspace key works, as
it's quite annoying not being able to delete character.
--
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..dcaafa2 100644
--- a/kern/ieee1275/init.c
+++ b/kern/ieee1275/init.c
@@ -171,7 +171,26 @@ static void grub_claim_heap (void)
return 0;
}
- grub_available_iterate (heap_init);
+ 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)
+ {
+ grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ "Failed to claim heap at 0x%llx, len 0x%llx\n",
+ addr, len);
+ return;
+ }
+
+ grub_mm_init_region ((void *) addr, len);
+ }
+ 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
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel