Hell[o]
> Avoid the cosmetical changes! (there are more thorough the patch)
Arghh, I was sure I removed it :/ Anyway attached updated console patches.
01-grub2-simple_console.patch: Cleanups only. Should have no more
"cosmetical" changes inside.
04-grub2-ofconsole_fix.patch: Added detection of console type (serial,
normal or fb) and use GRUB_TERM_CP437_MENU from [01] for normal
console and GRUB_TERM_SIMPLE_MENU for serial (default) and fb (The
font used by fb has no characters required to use cp437 frames. I
think we can use fb interface to draw frames or use "set-font" commend
to load font with requred characters) Also added workaround of non
working 'cls' escape in old pegasos1 firmware.
To workaround bPlan logo problem I used parts of patch send ealrier to
this list ThX for that.
> Also remember to include a ChangeLog entry.
If the patch would be good enough to commit it I will.
--
--- Marcin 'Morgoth' Kurek ---
diff -urN grub2.org/include/grub/term.h grub2/include/grub/term.h
--- grub2.org/include/grub/term.h 2007-07-22 01:32:22.000000000 +0200
+++ grub2/include/grub/term.h 2007-10-10 16:04:18.331688149 +0200
@@ -51,6 +51,10 @@
#define GRUB_TERM_NO_EDIT (1 << 1)
/* Set when the terminal cannot do fancy things. */
#define GRUB_TERM_DUMB (1 << 2)
+/* Set to use ascii menu borders. */
+#define GRUB_TERM_SIMPLE_MENU (1 << 3)
+/* Set to use cp437 menu borders. */
+#define GRUB_TERM_CP437_MENU (1 << 4)
/* Set when the terminal needs to be initialized. */
#define GRUB_TERM_NEED_INIT (1 << 16)
diff -urN grub2.org/kern/term.c grub2/kern/term.c
--- grub2.org/kern/term.c 2007-07-22 01:32:26.000000000 +0200
+++ grub2/kern/term.c 2007-10-10 16:05:03.047688149 +0200
@@ -90,6 +90,94 @@
return grub_cur_term;
}
+static
+grub_uint32_t remap_border(grub_uint32_t code)
+{
+ if (grub_cur_term->flags & GRUB_TERM_SIMPLE_MENU)
+ {
+ switch (code)
+ {
+ case GRUB_TERM_DISP_LEFT:
+ code = '<';
+ break;
+
+ case GRUB_TERM_DISP_UP:
+ code = '^';
+ break;
+
+ case GRUB_TERM_DISP_RIGHT:
+ code = '>';
+ break;
+
+ case GRUB_TERM_DISP_DOWN:
+ code = 'v';
+ break;
+
+ case GRUB_TERM_DISP_HLINE:
+ code = '-';
+ break;
+
+ case GRUB_TERM_DISP_VLINE:
+ code = '|';
+ break;
+
+ case GRUB_TERM_DISP_UL:
+ case GRUB_TERM_DISP_UR:
+ case GRUB_TERM_DISP_LL:
+ case GRUB_TERM_DISP_LR:
+ code = '+';
+ break;
+ }
+ }
+ else if(grub_cur_term->flags & GRUB_TERM_CP437_MENU)
+ {
+ switch (code)
+ {
+ case GRUB_TERM_DISP_LEFT:
+ code = 0x1b;
+ break;
+
+ case GRUB_TERM_DISP_UP:
+ code = 0x18;
+ break;
+
+ case GRUB_TERM_DISP_RIGHT:
+ code = 0x1a;
+ break;
+
+ case GRUB_TERM_DISP_DOWN:
+ code = 0x19;
+ break;
+
+ case GRUB_TERM_DISP_HLINE:
+ code = 0xc4;
+ break;
+
+ case GRUB_TERM_DISP_VLINE:
+ code = 0xb3;
+ break;
+
+ case GRUB_TERM_DISP_UL:
+ code = 0xda;
+ break;
+
+ case GRUB_TERM_DISP_UR:
+ code = 0xbf;
+ break;
+
+ case GRUB_TERM_DISP_LL:
+ code = 0xc0;
+ break;
+
+ case GRUB_TERM_DISP_LR:
+ code = 0xd9;
+ break;
+ }
+ }
+
+ return code;
+}
+
/* Put a Unicode character. */
void
grub_putcode (grub_uint32_t code)
@@ -107,6 +195,8 @@
return;
}
+ code = remap_border (code);
+
(grub_cur_term->putchar) (code);
if (code == '\n')
diff -urN grub2.org/term/i386/pc/console.c grub2/term/i386/pc/console.c
--- grub2.org/term/i386/pc/console.c 2007-07-22 01:32:30.000000000 +0200
+++ grub2/term/i386/pc/console.c 2007-10-10 16:03:34.131688149 +0200
@@ -25,58 +25,13 @@
static grub_uint8_t grub_console_normal_color = 0x7;
static grub_uint8_t grub_console_highlight_color = 0x70;
-static grub_uint32_t
-map_char (grub_uint32_t c)
-{
- if (c > 0x7f)
- {
- /* Map some unicode characters to the VGA font, if possible. */
- switch (c)
- {
- case 0x2190: /* left arrow */
- c = 0x1b;
- break;
- case 0x2191: /* up arrow */
- c = 0x18;
- break;
- case 0x2192: /* right arrow */
- c = 0x1a;
- break;
- case 0x2193: /* down arrow */
- c = 0x19;
- break;
- case 0x2501: /* horizontal line */
- c = 0xc4;
- break;
- case 0x2503: /* vertical line */
- c = 0xb3;
- break;
- case 0x250F: /* upper-left corner */
- c = 0xda;
- break;
- case 0x2513: /* upper-right corner */
- c = 0xbf;
- break;
- case 0x2517: /* lower-left corner */
- c = 0xc0;
- break;
- case 0x251B: /* lower-right corner */
- c = 0xd9;
- break;
-
- default:
- c = '?';
- break;
- }
- }
-
- return c;
-}
-
static void
grub_console_putchar (grub_uint32_t c)
{
- grub_console_real_putchar (map_char (c));
+ /* No Unicode support. */
+ if (c > 0x7f)
+ c = '?';
+ grub_console_real_putchar (c);
}
static grub_ssize_t
@@ -133,7 +88,7 @@
.setcolorstate = grub_console_setcolorstate,
.setcolor = grub_console_setcolor,
.setcursor = grub_console_setcursor,
- .flags = 0,
+ .flags = GRUB_TERM_CP437_MENU,
.next = 0
};
diff -urN grub2.org/term/i386/pc/serial.c grub2/term/i386/pc/serial.c
--- grub2.org/term/i386/pc/serial.c 2007-07-22 01:32:30.000000000 +0200
+++ grub2/term/i386/pc/serial.c 2007-10-10 16:03:34.132688149 +0200
@@ -324,48 +324,9 @@
/* Keep track of the cursor. */
if (keep_track)
{
- /* The serial terminal does not have VGA fonts. */
+ /* The serial terminal does not support Unicode. */
if (c > 0x7F)
- {
- /* Better than nothing. */
- switch (c)
- {
- case GRUB_TERM_DISP_LEFT:
- c = '<';
- break;
-
- case GRUB_TERM_DISP_UP:
- c = '^';
- break;
-
- case GRUB_TERM_DISP_RIGHT:
- c = '>';
- break;
-
- case GRUB_TERM_DISP_DOWN:
- c = 'v';
- break;
-
- case GRUB_TERM_DISP_HLINE:
- c = '-';
- break;
-
- case GRUB_TERM_DISP_VLINE:
- c = '|';
- break;
-
- case GRUB_TERM_DISP_UL:
- case GRUB_TERM_DISP_UR:
- case GRUB_TERM_DISP_LL:
- case GRUB_TERM_DISP_LR:
- c = '+';
- break;
-
- default:
- c = '?';
- break;
- }
- }
+ c = '?';
switch (c)
{
@@ -498,7 +459,7 @@
.setcolorstate = grub_serial_setcolorstate,
.setcolor = grub_serial_setcolor,
.setcursor = grub_serial_setcursor,
- .flags = 0,
+ .flags = GRUB_TERM_SIMPLE_MENU,
.next = 0
};
diff -urN grub2.org/term/i386/pc/vesafb.c grub2/term/i386/pc/vesafb.c
--- grub2.org/term/i386/pc/vesafb.c 2007-07-22 01:32:31.000000000 +0200
+++ grub2/term/i386/pc/vesafb.c 2007-10-10 16:03:34.133688149 +0200
@@ -214,45 +214,7 @@
unsigned *width)
{
if (code > 0x7f)
- {
- /* Map some unicode characters to the VGA font, if possible. */
- switch (code)
- {
- case 0x2190: /* left arrow */
- code = 0x1b;
- break;
- case 0x2191: /* up arrow */
- code = 0x18;
- break;
- case 0x2192: /* right arrow */
- code = 0x1a;
- break;
- case 0x2193: /* down arrow */
- code = 0x19;
- break;
- case 0x2501: /* horizontal line */
- code = 0xc4;
- break;
- case 0x2503: /* vertical line */
- code = 0xb3;
- break;
- case 0x250F: /* upper-left corner */
- code = 0xda;
- break;
- case 0x2513: /* upper-right corner */
- code = 0xbf;
- break;
- case 0x2517: /* lower-left corner */
- code = 0xc0;
- break;
- case 0x251B: /* lower-right corner */
- code = 0xd9;
- break;
-
- default:
- return grub_font_get_glyph (code, bitmap, width);
- }
- }
+ return grub_font_get_glyph (code, bitmap, width);
if (bitmap)
grub_memcpy (bitmap,
@@ -601,7 +563,7 @@
.setcolorstate = grub_virtual_screen_setcolorstate,
.setcolor = grub_virtual_screen_setcolor,
.setcursor = grub_vesafb_setcursor,
- .flags = 0,
+ .flags = GRUB_TERM_CP437_MENU,
.next = 0
};
diff -urN grub2.org/term/i386/pc/vga.c grub2/term/i386/pc/vga.c
--- grub2.org/term/i386/pc/vga.c 2007-07-22 01:32:31.000000000 +0200
+++ grub2/term/i386/pc/vga.c 2007-10-10 16:03:34.135688149 +0200
@@ -198,45 +198,7 @@
get_vga_glyph (grub_uint32_t code, unsigned char bitmap[32], unsigned *width)
{
if (code > 0x7f)
- {
- /* Map some unicode characters to the VGA font, if possible. */
- switch (code)
- {
- case 0x2190: /* left arrow */
- code = 0x1b;
- break;
- case 0x2191: /* up arrow */
- code = 0x18;
- break;
- case 0x2192: /* right arrow */
- code = 0x1a;
- break;
- case 0x2193: /* down arrow */
- code = 0x19;
- break;
- case 0x2501: /* horizontal line */
- code = 0xc4;
- break;
- case 0x2503: /* vertical line */
- code = 0xb3;
- break;
- case 0x250F: /* upper-left corner */
- code = 0xda;
- break;
- case 0x2513: /* upper-right corner */
- code = 0xbf;
- break;
- case 0x2517: /* lower-left corner */
- code = 0xc0;
- break;
- case 0x251B: /* lower-right corner */
- code = 0xd9;
- break;
-
- default:
- return grub_font_get_glyph (code, bitmap, width);
- }
- }
+ return grub_font_get_glyph (code, bitmap, width);
if (bitmap)
grub_memcpy (bitmap, vga_font + code * CHAR_HEIGHT, CHAR_HEIGHT);
@@ -590,7 +552,7 @@
.setcolorstate = grub_vga_setcolorstate,
.setcolor = grub_vga_setcolor,
.setcursor = grub_vga_setcursor,
- .flags = 0,
+ .flags = GRUB_TERM_CP437_MENU,
.next = 0
};
diff -urN grub2.org/term/ieee1275/ofconsole.c grub2/term/ieee1275/ofconsole.c
--- grub2.org/term/ieee1275/ofconsole.c 2007-07-22 11:05:11.000000000 +0200
+++ grub2/term/ieee1275/ofconsole.c 2007-10-10 16:03:34.136688149 +0200
@@ -75,6 +75,7 @@
grub_ofconsole_putchar (grub_uint32_t c)
{
char chr = c;
+
if (c == '\n')
{
grub_curr_y++;
@@ -86,6 +87,7 @@
if (grub_curr_x > grub_ofconsole_width)
grub_putcode ('\n');
}
+
grub_ieee1275_write (stdout_ihandle, &chr, 1, 0);
}
@@ -366,7 +368,7 @@
.setcolor = grub_ofconsole_setcolor,
.setcursor = grub_ofconsole_setcursor,
.refresh = grub_ofconsole_refresh,
- .flags = 0,
+ .flags = GRUB_TERM_SIMPLE_MENU,
.next = 0
};
diff -urN grub2.org/util/console.c grub2/util/console.c
--- grub2.org/util/console.c 2007-07-22 01:32:31.000000000 +0200
+++ grub2/util/console.c 2007-10-10 16:03:34.137688149 +0200
@@ -44,47 +44,6 @@
static void
grub_ncurses_putchar (grub_uint32_t c)
{
- /* Better than nothing. */
- switch (c)
- {
- case GRUB_TERM_DISP_LEFT:
- c = '<';
- break;
-
- case GRUB_TERM_DISP_UP:
- c = '^';
- break;
-
- case GRUB_TERM_DISP_RIGHT:
- c = '>';
- break;
-
- case GRUB_TERM_DISP_DOWN:
- c = 'v';
- break;
-
- case GRUB_TERM_DISP_HLINE:
- c = '-';
- break;
-
- case GRUB_TERM_DISP_VLINE:
- c = '|';
- break;
-
- case GRUB_TERM_DISP_UL:
- case GRUB_TERM_DISP_UR:
- case GRUB_TERM_DISP_LL:
- case GRUB_TERM_DISP_LR:
- c = '+';
- break;
-
- default:
- /* ncurses does not support Unicode. */
- if (c > 0x7f)
- c = '?';
- break;
- }
-
addch (c | grub_console_attr);
}
@@ -302,7 +261,7 @@
.setcolor = grub_ncurses_setcolor,
.setcursor = grub_ncurses_setcursor,
.refresh = grub_ncurses_refresh,
- .flags = 0,
+ .flags = GRUB_TERM_SIMPLE_MENU,
.next = 0
};
diff -urN grub2.org/include/grub/ieee1275/ieee1275.h grub2/include/grub/ieee1275/ieee1275.h
--- grub2.org/include/grub/ieee1275/ieee1275.h 2007-10-04 22:44:12.000000000 +0200
+++ grub2/include/grub/ieee1275/ieee1275.h 2007-10-10 16:41:39.594688149 +0200
@@ -82,6 +82,16 @@
/* CodeGen firmware does not correctly implement "output-device output" */
GRUB_IEEE1275_FLAG_BROKEN_OUTPUT,
+
+ /* In non fb mode default number of console rows is 24, but in fact it's 25 */
+ GRUB_IEEE1275_FLAG_NOFB_ROWS25,
+
+ /* Old Pegaos firmware does not accept cls escape sequence */
+ GRUB_IEEE1275_FLAG_NOCLS,
+
+ /* On CodeGen firmware, cp437 characters 0xc0 to 0xcb are reserved for the
+ bplan logo */
+ GRUB_IEEE1275_FLAG_BPLAN_LOGO,
};
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
diff -urN grub2.org/kern/powerpc/ieee1275/cmain.c grub2/kern/powerpc/ieee1275/cmain.c
--- grub2.org/kern/powerpc/ieee1275/cmain.c 2007-10-04 22:44:12.000000000 +0200
+++ grub2/kern/powerpc/ieee1275/cmain.c 2007-10-10 16:42:30.520688149 +0200
@@ -73,6 +73,8 @@
{
/* Broken in all versions */
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NOFB_ROWS25);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BPLAN_LOGO);
/* There are two incompatible ways of checking the version number. Try
both. */
@@ -98,6 +100,13 @@
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0);
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS);
}
+ /* It seems old firmware for Pegaos 1 do not accept cls escape then
+ we need to emulate it using \n sequence */
+ if (!grub_strcmp (tmp, "1.0")
+ || !grub_strcmp (tmp, "1.1"))
+ {
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NOCLS);
+ }
}
}
}
diff -urN grub2.org/term/ieee1275/ofconsole.c grub2/term/ieee1275/ofconsole.c
--- grub2.org/term/ieee1275/ofconsole.c 2007-10-04 22:44:12.000000000 +0200
+++ grub2/term/ieee1275/ofconsole.c 2007-10-10 16:51:56.829688149 +0200
@@ -24,12 +24,18 @@
#include <grub/machine/console.h>
#include <grub/ieee1275/ieee1275.h>
+static void grub_ofconsole_setflags(int flags, int x);
+
static grub_ieee1275_ihandle_t stdout_ihandle;
static grub_ieee1275_ihandle_t stdin_ihandle;
static grub_uint8_t grub_ofconsole_width;
static grub_uint8_t grub_ofconsole_height;
+/* We will assume serial console by default */
+static grub_uint8_t grub_ofconsole_fb = 0;
+static grub_uint8_t grub_ofconsole_serial = 1;
+
static int grub_curr_x;
static int grub_curr_y;
@@ -70,20 +76,76 @@
static void
grub_ofconsole_putchar (grub_uint32_t c)
{
- char chr = c;
-
- if (c == '\n')
+ char chr;
+
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BPLAN_LOGO))
{
+ /* cp437 characters 0xc0 to 0xcb are reserved for the bplan logo. Use
+ this layout to workaround it:
+ âââ
+ â â
+ âââ */
+ switch (c)
+ {
+ case 0xc4:
+ /* GRUB_TERM_DISP_HLINE */
+ c = 0xcd;
+ break;
+ case 0xb3:
+ /* GRUB_TERM_DISP_VLINE */
+ c = 0xb3;
+ break;
+ case 0xda:
+ /* GRUB_TERM_DISP_UL */
+ c = 0xd5;
+ break;
+ case 0xbf:
+ /* GRUB_TERM_DISP_UR */
+ c = 0xb8;
+ break;
+ case 0xc0:
+ /* GRUB_TERM_DISP_LL */
+ c = 0xd4;
+ break;
+ case 0xd9:
+ /* GRUB_TERM_DISP_LR */
+ c = 0xbe;
+ break;
+ }
+ }
+
+ switch(c)
+ {
+ case '\a':
+ break;
+ case '\n':
+ grub_putcode ('\r');
grub_curr_y++;
+ if(grub_curr_y > (grub_ofconsole_height - 1))
+ /* Is this realy correct for all OF versions around ? */
+ grub_curr_y = grub_ofconsole_fb ?
+ grub_curr_y - 4 : grub_ofconsole_height - 1;
+ break;
+ case '\r':
grub_curr_x = 0;
- }
- else
- {
+ break;
+ case '\b':
+ if(grub_curr_x > 0)
+ grub_curr_x--;
+ break;
+
+ default:
+ if(c == '\t')
+ c = ' ';
+
+ if (grub_curr_x >= (grub_ofconsole_width - 1))
+ grub_putcode ('\n');
+
grub_curr_x++;
- if (grub_curr_x > grub_ofconsole_width)
- grub_putcode ('\n');
- }
+ break;
+ }
+ chr = c;
grub_ieee1275_write (stdout_ihandle, &chr, 1, 0);
}
@@ -228,7 +290,7 @@
static grub_uint16_t
grub_ofconsole_getxy (void)
{
- return ((grub_curr_x - 1) << 8) | grub_curr_y;
+ return (grub_curr_x << 8) | grub_curr_y;
}
static grub_uint16_t
@@ -278,6 +340,10 @@
if (! grub_ofconsole_height)
grub_ofconsole_height = 24;
+ if ( grub_ofconsole_fb == 0 && grub_ofconsole_serial == 0 && grub_ofconsole_height == 24 &&
+ grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NOFB_ROWS25))
+ grub_ofconsole_height = 25;
+
return (grub_ofconsole_width << 8) | grub_ofconsole_height;
}
@@ -295,10 +361,20 @@
static void
grub_ofconsole_cls (void)
{
- /* Clear the screen. Using serial console, screen(1) only recognizes the
- * ANSI escape sequence. Using video console, Apple Open Firmware (version
- * 3.1.1) only recognizes the literal ^L. So use both. */
- grub_ofconsole_writeesc ("\e[2J");
+ if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NOCLS))
+ {
+ /* Clear the screen. Using serial console, screen(1) only recognizes the
+ * ANSI escape sequence. Using video console, Apple Open Firmware (version
+ * 3.1.1) only recognizes the literal ^L. So use both. */
+ grub_ofconsole_writeesc ("\e[2J");
+ }
+ else
+ {
+ /* It seems no cls escape is available then simulate it using \n flood */
+ int x = (grub_ofconsole_height * 2) - grub_curr_y;
+ while(x--)
+ grub_putcode ('\n');
+ }
grub_gotoxy (0, 0);
}
@@ -317,6 +393,7 @@
static grub_err_t
grub_ofconsole_init (void)
{
+ grub_ieee1275_phandle_t stdout_phandle;
unsigned char data[4];
grub_ssize_t actual;
int col;
@@ -349,6 +426,48 @@
/* Set the right fg and bg colors. */
grub_ofconsole_setcolorstate (GRUB_TERM_COLOR_NORMAL);
+ /* Check do we are on serial or normal console */
+ if(! grub_ieee1275_instance_to_package (stdout_ihandle, &stdout_phandle))
+ {
+ char type[16];
+ char name[128];
+
+ if(! grub_ieee1275_get_property (stdout_phandle, "device_type", &type,
+ sizeof type, 0) &&
+ ! grub_ieee1275_get_property (stdout_phandle, "name", &name,
+ sizeof name, 0))
+ {
+ /*
+ * In general type "serial" is used for console without
+ * framebuffer support in recent firmware versions then
+ * we need to check the name too to determine is it real or
+ * serial console
+ */
+
+ if (! grub_strcmp (type, "serial"))
+ {
+ /* If "name" is something else than "display" we assume serial console */
+ if(! grub_strcmp (name, "display"))
+ grub_ofconsole_serial = 0;
+ }
+ else
+ {
+ grub_ofconsole_serial = 0;
+
+ /* Older versions use name/type set to "bootconsole" */
+ if ( grub_strcmp (name, "bootconsole"))
+ grub_ofconsole_fb = 1;
+ }
+ }
+ }
+
+ /* Set term flags */
+ if(!grub_ofconsole_serial && !grub_ofconsole_fb)
+ {
+ grub_ofconsole_setflags(GRUB_TERM_SIMPLE_MENU, 0);
+ grub_ofconsole_setflags(GRUB_TERM_CP437_MENU, 1);
+ }
+
return 0;
}
@@ -377,7 +496,7 @@
.setcolor = grub_ofconsole_setcolor,
.setcursor = grub_ofconsole_setcursor,
.refresh = grub_ofconsole_refresh,
- .flags = GRUB_TERM_SIMPLE_MENU,
+ .flags = GRUB_TERM_SIMPLE_MENU, /* We are set to serial by default */
.next = 0
};
@@ -393,3 +512,12 @@
{
grub_term_unregister (&grub_ofconsole_term);
}
+
+static void
+grub_ofconsole_setflags(int flags, int x)
+{
+ if(x)
+ grub_ofconsole_term.flags |= flags;
+ else
+ grub_ofconsole_term.flags &= ~flags;
+}
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel