Hell[o] Attached current version of console fix'es patches, generaly synced with cvs && cleanups for all of them and some changes in 04-grub2-ofconsole_fix.patch.
First it seems pegasos OF uses 24 lines console by default, but it seems when no framebuffer is used the real number of rows is 25 not 24. Introduced GRUB_IEEE1275_FLAG_NOFB_ROWS25 to handle this situation. Second the very old OF version (Pegaos 1 mainly) has problem to interpret the cls escape and simply ignore it. Introduce GRUB_IEEE1275_FLAG_NOCLS to simulate cls with sequence of '\n' in that case. -- --- 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-01 19:20:49.734330521 +0200 @@ -51,10 +51,13 @@ #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) - /* Unicode characters for fancy graphics. */ #define GRUB_TERM_DISP_LEFT 0x2190 #define GRUB_TERM_DISP_UP 0x2191 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-01 19:27:23.367330521 +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) @@ -106,7 +194,9 @@ 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-01 19:30:35.966330521 +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-01 19:30:22.478330521 +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-01 19:37:38.160330521 +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-01 19:38:10.883330521 +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-01 19:01:49.820330521 +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-01 19:01:49.821330521 +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/term/ieee1275/ofconsole.c grub2/term/ieee1275/ofconsole.c --- grub2.org/term/ieee1275/ofconsole.c 2007-10-03 10:55:27.191943734 +0200 +++ grub2/term/ieee1275/ofconsole.c 2007-10-03 10:56:26.399943734 +0200 @@ -63,12 +63,8 @@ static void grub_ofconsole_writeesc (const char *str) { - while (*str) - { - char chr = *(str++); - grub_ieee1275_write (stdout_ihandle, &chr, 1, 0); - } - + int len = grub_strlen(str); + grub_ieee1275_write (stdout_ihandle, str, len, 0); } static void
diff -urN grub2.org/term/ieee1275/ofconsole.c grub2/term/ieee1275/ofconsole.c --- grub2.org/term/ieee1275/ofconsole.c 2007-10-01 18:02:39.000000000 +0200 +++ grub2/term/ieee1275/ofconsole.c 2007-10-01 18:06:33.000000000 +0200 @@ -135,43 +135,56 @@ grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual > 0 && c == '\e') + if (actual > 0) { - grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual <= 0) - { - *key = '\e'; - return 1; - } + if (c != '\e') + { + switch(c) + { + case 127: + /* Backspace */ + c = '\b'; + break; + } + } + else + { + grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); + if (actual <= 0) + { + *key = '\e'; + return 1; + } - if (c != 91) - return 0; + if (c != 91) + return 0; - grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); - if (actual <= 0) - return 0; + grub_ieee1275_read (stdin_ihandle, &c, 1, &actual); + if (actual <= 0) + return 0; - switch (c) - { - case 65: - /* Up: Ctrl-p. */ - c = 16; - break; - case 66: - /* Down: Ctrl-n. */ - c = 14; - break; - case 67: - /* Right: Ctrl-f. */ - c = 6; - break; - case 68: - /* Left: Ctrl-b. */ - c = 2; - break; - } + switch (c) + { + case 65: + /* Up: Ctrl-p. */ + c = 16; + break; + case 66: + /* Down: Ctrl-n. */ + c = 14; + break; + case 67: + /* Right: Ctrl-f. */ + c = 6; + break; + case 68: + /* Left: Ctrl-b. */ + c = 2; + break; + } + } } - + *key = c; return actual > 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-03 17:52:35.006425889 +0200 +++ grub2/include/grub/ieee1275/ieee1275.h 2007-10-03 16:45:56.000000000 +0200 @@ -82,6 +82,12 @@ /* 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 use workaround */ + GRUB_IEEE1275_FLAG_NOCLS, }; 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-03 17:52:35.007425889 +0200 +++ grub2/kern/powerpc/ieee1275/cmain.c 2007-10-03 16:49:21.000000000 +0200 @@ -73,6 +73,7 @@ { /* Broken in all versions */ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT); + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NOFB_ROWS25); /* There are two incompatible ways of checking the version number. Try both. */ @@ -98,6 +99,14 @@ 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, "0.") + || !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-03 17:52:35.009425889 +0200 +++ grub2/term/ieee1275/ofconsole.c 2007-10-03 17:40:31.000000000 +0200 @@ -29,6 +29,7 @@ static grub_uint8_t grub_ofconsole_width; static grub_uint8_t grub_ofconsole_height; +static grub_uint8_t grub_ofconsole_fb; static int grub_curr_x; static int grub_curr_y; @@ -70,20 +71,40 @@ static void grub_ofconsole_putchar (grub_uint32_t c) { - char chr = c; - - if (c == '\n') - { + char chr; + + 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 +249,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 @@ -270,6 +291,21 @@ grub_free (val); } } + if (! grub_ieee1275_get_property_length (options, "fb-mode", + &lval) && lval != -1) + { + val = grub_malloc (lval); + if (val) + { + if (! grub_ieee1275_get_property (options, "fb-mode", + val, lval, 0)) + { + if (grub_strncmp (val, "0x0x0", 5) != 0) + grub_ofconsole_fb = 1; + } + grub_free (val); + } + } } /* Use a small console by default. */ @@ -278,6 +314,9 @@ if (! grub_ofconsole_height) grub_ofconsole_height = 24; + if ( grub_ofconsole_fb == 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 +334,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); }
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel