2008-11-07 Robert Millan <rmh@aybabtu.com>

Modularize at_keyboard.mod:

            * conf/i386.rmk (pkglib_MODULES): Add `at_keyboard.mod'.
            (at_keyboard_mod_SOURCES, at_keyboard_mod_CFLAGS)
            (at_keyboard_mod_LDFLAGS): New variables.

            Actual terminal split:

            * include/grub/term.h (struct grub_term): Split in ...
            (struct grub_term_input): ... this, and ...
            (struct grub_term_output): ... this.  Update all users.
            (grub_term_set_current): Split in ...
            (grub_term_set_current_input): ... this, and ...
            (grub_term_set_current_output): ... this.
            (grub_term_get_current): Split in ...
            (grub_term_get_current_input): ... this, and ...
            (grub_term_get_current_output): ... this.
            (grub_term_register): Split in ...
            (grub_term_register_input): ... this, and ...
            (grub_term_register_output): ... this.
            (grub_term_unregister): Split in ...
            (grub_term_unregister_input): ... this, and ...
            (grub_term_unregister_output): ... this.
            (grub_term_iterate): Split in ...
            (grub_term_iterate_input): ... this, and ...
            (grub_term_iterate_output): ... this.

            * kern/term.c (grub_term_list): Split in ...
            (grub_term_list_input): ... this, and ...
            (grub_term_list_output): ... this.  Update all users.
            (grub_cur_term): Split in ...
            (grub_cur_term_input): ... this, and ...
            (grub_cur_term_output): ... this.  Update all users.
            (grub_term_set_current): Split in ...
            (grub_term_set_current_input): ... this, and ...
            (grub_term_set_current_output): ... this.
            (grub_term_get_current): Split in ...
            (grub_term_get_current_input): ... this, and ...
            (grub_term_get_current_output): ... this.
            (grub_term_register): Split in ...
            (grub_term_register_input): ... this, and ...
            (grub_term_register_output): ... this.
            (grub_term_unregister): Split in ...
            (grub_term_unregister_input): ... this, and ...
            (grub_term_unregister_output): ... this.
            (grub_term_iterate): Split in ...
            (grub_term_iterate_input): ... this, and ...
            (grub_term_iterate_output): ... this.

            * kern/misc.c (grub_abort): Split use of grub_term_get_current() into
            a check for input and one for output (and only attempt to get keys
            from user when input works).

            * util/grub-probe.c (grub_term_get_current): Split in ...
            (grub_term_get_current_input): ... this, and ...
            (grub_term_get_current_output): ... this.
            * util/grub-fstest.c: Likewise.
            * util/i386/pc/grub-setup.c: Likewise.
            * util/grub-editenv.c: Likewise.

            Portability adjustments:

            * conf/i386-ieee1275.rmk (kernel_elf_SOURCES): Remove
            `term/i386/pc/at_keyboard.c'.
            * kern/ieee1275/init.c [__i386__] (grub_machine_init): Remove call to
            grub_keyboard_controller_init() (now handled by terminal .init).
            * kern/i386/coreboot/init.c (grub_machine_init): Add call to
            grub_at_keyboard_init().
            * include/grub/i386/ieee1275/console.h (grub_keyboard_controller_init)
            (grub_console_checkkey, grub_console_getkey): Remove (now provided by
            at_keyboard.mod via input terminal interface).
            * include/grub/i386/coreboot/console.h: Convert into a stub for
            `<grub/i386/pc/console.h>'.

            Migrate full terminals to new API:

            * term/efi/console.c (grub_console_term): Split into ...
            (grub_console_term_input): ... this, and ...
            (grub_console_term_output): ... this.  Update all users.
            * term/ieee1275/ofconsole.c: Remove __i386__ hack.
            (grub_ofconsole_init): Split into ...
            (grub_ofconsole_init_input): ... this, and ...
            (grub_ofconsole_init_output): ... this.
            (grub_ofconsole_term): Split into ...
            (grub_ofconsole_term_input): ... this, and ...
            (grub_ofconsole_term_output): ... this.  Update all users.
            * term/i386/pc/serial.c (grub_serial_term): Split into ...
            (grub_serial_term_input): ... this, and ...
            (grub_serial_term_output): ... this.  Update all users.
            * term/i386/pc/console.c (grub_console_term): Split into ...
            (grub_console_term_input): ... this, and ...
            (grub_console_term_output): ... this.  Update all users.
            (grub_console_term_input): Only enable it on PC/BIOS platform.
            (grub_console_init): Remove grub_keyboard_controller_init() call.

            Migrate input terminals to new API:

            * term/i386/pc/at_keyboard.c: Replace `cpu' and `machine' with
            `i386' and `i386/pc' to enable build on x86_64 (this driver is
            i386-specific anyway).
            (grub_console_checkkey): Rename to ...
            (grub_at_keyboard_checkkey): ... this.  Static-ize.  Update all
            users.
            (grub_keyboard_controller_orig): New variable.
            (grub_console_getkey): Rename to ...
            (grub_at_keyboard_getkey): ... this.  Static-ize.  Update all
            users.
            (grub_keyboard_controller_init): Static-ize.  Save original
            controller value so that it can be restored ...
            (grub_keyboard_controller_fini): ... here (new function).
            (grub_at_keyboard_term): New structure.
            (GRUB_MOD_INIT(at_keyboard), GRUB_MOD_FINI(at_keyboard)): New
            functions.

            Migrate output terminals to new API:

            * term/i386/pc/vga.c (grub_vga_term): Change type to
            `struct  grub_term_output'.  Remove `.checkkey' and `.getkey'
            members.  Update all users.
            * term/gfxterm.c (grub_video_term): Change type to
            `struct  grub_term_output'.  Remove `.checkkey' and `.getkey'
            members.  Update all users.
            * include/grub/i386/pc/console.h (grub_console_checkkey)
            (grub_console_getkey): Do not export (no longer needed by gfxterm,
            etc).

            Migrate `terminal' command and userland tools to new API:

            * commands/terminal.c (grub_cmd_terminal): Split into ...
            (grub_cmd_terminal_input): ... this, and ...
            (grub_cmd_terminal_output): ... this.
            (GRUB_MOD_INIT(terminal)): Split `terminal' command in two commands:
            `terminal_input' and `terminal_output'.
            * util/grub.d/00_header.in: Adjust `terminal' calls to new
            `terminal_input' / `terminal_output' API.
            * util/grub-mkconfig.in: Export ${GRUB_TERMINAL_INPUT} and
            ${GRUB_TERMINAL_OUTPUT} instead of ${GRUB_TERMINAL} (and if user
            provided ${GRUB_TERMINAL}, convert it).
This commit is contained in:
robertmh 2008-11-07 19:11:39 +00:00
parent 96e5d876a4
commit 651c29b79e
26 changed files with 555 additions and 190 deletions

View file

@ -332,15 +332,18 @@ grub_console_setcursor (int on)
efi_call_2 (o->enable_cursor, o, on);
}
static struct grub_term grub_console_term =
static struct grub_term_input grub_console_term_input =
{
.name = "console",
.init = 0,
.fini = 0,
.putchar = grub_console_putchar,
.getcharwidth = grub_console_getcharwidth,
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
};
static struct grub_term_output grub_console_term_output =
{
.name = "console",
.putchar = grub_console_putchar,
.getcharwidth = grub_console_getcharwidth,
.getwh = grub_console_getwh,
.getxy = grub_console_getxy,
.gotoxy = grub_console_gotoxy,
@ -350,7 +353,6 @@ static struct grub_term grub_console_term =
.getcolor = grub_console_getcolor,
.setcursor = grub_console_setcursor,
.flags = 0,
.next = 0
};
void
@ -364,12 +366,15 @@ grub_console_init (void)
return;
}
grub_term_register (&grub_console_term);
grub_term_set_current (&grub_console_term);
grub_term_register_input (&grub_console_term_input);
grub_term_register_output (&grub_console_term_output);
grub_term_set_current_output (&grub_console_term_output);
grub_term_set_current_input (&grub_console_term_input);
}
void
grub_console_fini (void)
{
grub_term_unregister (&grub_console_term);
grub_term_unregister_input (&grub_console_term_input);
grub_term_unregister_output (&grub_console_term_output);
}

View file

@ -1056,15 +1056,13 @@ grub_gfxterm_background_image_cmd (struct grub_arg_list *state __attribute__ ((u
return grub_errno;
}
static struct grub_term grub_video_term =
static struct grub_term_output grub_video_term =
{
.name = "gfxterm",
.init = grub_gfxterm_init,
.fini = grub_gfxterm_fini,
.putchar = grub_gfxterm_putchar,
.getcharwidth = grub_gfxterm_getcharwidth,
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
.getwh = grub_virtual_screen_getwh,
.getxy = grub_virtual_screen_getxy,
.gotoxy = grub_gfxterm_gotoxy,
@ -1081,7 +1079,7 @@ static struct grub_term grub_video_term =
GRUB_MOD_INIT(term_gfxterm)
{
my_mod = mod;
grub_term_register (&grub_video_term);
grub_term_register_output (&grub_video_term);
grub_register_command ("background_image",
grub_gfxterm_background_image_cmd,
@ -1094,5 +1092,5 @@ GRUB_MOD_INIT(term_gfxterm)
GRUB_MOD_FINI(term_gfxterm)
{
grub_unregister_command ("bgimage");
grub_term_unregister (&grub_video_term);
grub_term_unregister_output (&grub_video_term);
}

View file

@ -16,9 +16,10 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/machine/console.h>
#include <grub/cpu/at_keyboard.h>
#include <grub/cpu/io.h>
#include <grub/dl.h>
#include <grub/i386/pc/console.h>
#include <grub/i386/at_keyboard.h>
#include <grub/i386/io.h>
#include <grub/misc.h>
#include <grub/term.h>
@ -61,6 +62,8 @@ static char keyboard_map_shift[128] =
'B', 'N', 'M', '<', '>', '?'
};
static grub_uint8_t grub_keyboard_controller_orig;
static void
grub_keyboard_controller_write (grub_uint8_t c)
{
@ -77,12 +80,6 @@ grub_keyboard_controller_read (void)
return grub_inb (KEYBOARD_REG_DATA);
}
void
grub_keyboard_controller_init (void)
{
grub_keyboard_controller_write (grub_keyboard_controller_read () | KEYBOARD_SCANCODE_SET1);
}
/* FIXME: This should become an interrupt service routine. For now
it's just used to catch events from control keys. */
static void
@ -148,8 +145,8 @@ grub_keyboard_getkey (void)
}
/* If there is a character pending, return it; otherwise return -1. */
int
grub_console_checkkey (void)
static int
grub_at_keyboard_checkkey (void)
{
int code, key;
code = grub_keyboard_getkey ();
@ -192,13 +189,47 @@ grub_console_checkkey (void)
return (int) key;
}
int
grub_console_getkey (void)
static int
grub_at_keyboard_getkey (void)
{
int key;
do
{
key = grub_console_checkkey ();
key = grub_at_keyboard_checkkey ();
} while (key == -1);
return key;
}
static grub_err_t
grub_keyboard_controller_init (void)
{
grub_keyboard_controller_orig = grub_keyboard_controller_read ();
grub_keyboard_controller_write (grub_keyboard_controller_orig | KEYBOARD_SCANCODE_SET1);
return GRUB_ERR_NONE;
}
static grub_err_t
grub_keyboard_controller_fini (void)
{
grub_keyboard_controller_write (grub_keyboard_controller_orig);
return GRUB_ERR_NONE;
}
static struct grub_term_input grub_at_keyboard_term =
{
.name = "at_keyboard",
.init = grub_keyboard_controller_init,
.fini = grub_keyboard_controller_fini,
.checkkey = grub_at_keyboard_checkkey,
.getkey = grub_at_keyboard_getkey,
};
GRUB_MOD_INIT(at_keyboard)
{
grub_term_register_input (&grub_at_keyboard_term);
}
GRUB_MOD_FINI(at_keyboard)
{
grub_term_unregister_output (&grub_at_keyboard_term);
}

View file

@ -125,15 +125,22 @@ grub_console_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color
*highlight_color = grub_console_highlight_color;
}
static struct grub_term grub_console_term =
/* On non-BIOS platforms, console.c is used in combination with vga_text.c
(only to handle output). */
#ifdef GRUB_MACHINE_PCBIOS
static struct grub_term_input grub_console_term_input =
{
.name = "console",
.init = 0,
.fini = 0,
.putchar = grub_console_putchar,
.getcharwidth = grub_console_getcharwidth,
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
};
#endif
static struct grub_term_output grub_console_term_output =
{
.name = "console",
.putchar = grub_console_putchar,
.getcharwidth = grub_console_getcharwidth,
.getwh = grub_console_getwh,
.getxy = grub_console_getxy,
.gotoxy = grub_console_gotoxy,
@ -143,23 +150,26 @@ static struct grub_term grub_console_term =
.getcolor = grub_console_getcolor,
.setcursor = grub_console_setcursor,
.flags = 0,
.next = 0
};
void
grub_console_init (void)
{
grub_term_register (&grub_console_term);
grub_term_set_current (&grub_console_term);
#ifdef GRUB_MACHINE_LINUXBIOS
grub_keyboard_controller_init ();
grub_term_register_output (&grub_console_term_output);
grub_term_set_current_output (&grub_console_term_output);
#ifdef GRUB_MACHINE_PCBIOS
grub_term_register_input (&grub_console_term_input);
grub_term_set_current_input (&grub_console_term_input);
#endif
}
void
grub_console_fini (void)
{
grub_term_set_current (&grub_console_term);
grub_term_unregister (&grub_console_term);
grub_term_set_current_output (&grub_console_term_output);
#ifdef GRUB_MACHINE_PCBIOS
grub_term_set_current_input (&grub_console_term_input);
grub_term_unregister_input (&grub_console_term_input);
#endif
grub_term_unregister_output (&grub_console_term_output);
}

View file

@ -467,15 +467,18 @@ grub_serial_setcursor (const int on)
grub_terminfo_cursor_off ();
}
static struct grub_term grub_serial_term =
static struct grub_term_input grub_serial_term_input =
{
.name = "serial",
.init = 0,
.fini = 0,
.putchar = grub_serial_putchar,
.getcharwidth = grub_serial_getcharwidth,
.checkkey = grub_serial_checkkey,
.getkey = grub_serial_getkey,
};
static struct grub_term_output grub_serial_term_output =
{
.name = "serial",
.putchar = grub_serial_putchar,
.getcharwidth = grub_serial_getcharwidth,
.getwh = grub_serial_getwh,
.getxy = grub_serial_getxy,
.gotoxy = grub_serial_gotoxy,
@ -483,7 +486,6 @@ static struct grub_term grub_serial_term =
.setcolorstate = grub_serial_setcolorstate,
.setcursor = grub_serial_setcursor,
.flags = 0,
.next = 0
};
@ -575,7 +577,8 @@ grub_cmd_serial (struct grub_arg_list *state,
/* Register terminal if not yet registered. */
if (registered == 0)
{
grub_term_register (&grub_serial_term);
grub_term_register_input (&grub_serial_term_input);
grub_term_register_output (&grub_serial_term_output);
registered = 1;
}
}
@ -590,7 +593,8 @@ grub_cmd_serial (struct grub_arg_list *state,
if (serial_hw_init () != GRUB_ERR_NONE)
{
/* If unable to restore settings, unregister terminal. */
grub_term_unregister (&grub_serial_term);
grub_term_unregister_input (&grub_serial_term_input);
grub_term_unregister_output (&grub_serial_term_output);
registered = 0;
}
}
@ -616,5 +620,8 @@ GRUB_MOD_FINI(serial)
{
grub_unregister_command ("serial");
if (registered == 1) /* Unregister terminal only if registered. */
grub_term_unregister (&grub_serial_term);
{
grub_term_unregister_input (&grub_serial_term_input);
grub_term_unregister_output (&grub_serial_term_output);
}
}

View file

@ -473,15 +473,13 @@ grub_vga_setcursor (int on)
}
}
static struct grub_term grub_vga_term =
static struct grub_term_output grub_vga_term =
{
.name = "vga",
.init = grub_vga_mod_init,
.fini = grub_vga_mod_fini,
.putchar = grub_vga_putchar,
.getcharwidth = grub_vga_getcharwidth,
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
.getwh = grub_vga_getwh,
.getxy = grub_vga_getxy,
.gotoxy = grub_vga_gotoxy,
@ -489,7 +487,6 @@ static struct grub_term grub_vga_term =
.setcolorstate = grub_vga_setcolorstate,
.setcursor = grub_vga_setcursor,
.flags = 0,
.next = 0
};
GRUB_MOD_INIT(vga)
@ -497,10 +494,10 @@ GRUB_MOD_INIT(vga)
#ifndef GRUB_UTIL
my_mod = mod;
#endif
grub_term_register (&grub_vga_term);
grub_term_register_output (&grub_vga_term);
}
GRUB_MOD_FINI(vga)
{
grub_term_unregister (&grub_vga_term);
grub_term_unregister_output (&grub_vga_term);
}

View file

@ -33,10 +33,8 @@ static grub_uint8_t grub_ofconsole_height;
static int grub_curr_x;
static int grub_curr_y;
#ifndef __i386__
static int grub_keybuf;
static int grub_buflen;
#endif
struct color
{
@ -144,7 +142,6 @@ grub_ofconsole_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_col
*highlight_color = grub_ofconsole_highlight_color;
}
#ifndef __i386__
static int
grub_ofconsole_readkey (int *key)
{
@ -342,7 +339,20 @@ grub_ofconsole_refresh (void)
}
static grub_err_t
grub_ofconsole_init (void)
grub_ofconsole_init_input (void)
{
grub_ssize_t actual;
if (grub_ieee1275_get_integer_property (grub_ieee1275_chosen, "stdin", &stdin_ihandle,
sizeof stdin_ihandle, &actual)
|| actual != sizeof stdin_ihandle)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Cannot find stdin");
return 0;
}
static grub_err_t
grub_ofconsole_init_output (void)
{
grub_ssize_t actual;
int col;
@ -358,11 +368,6 @@ grub_ofconsole_init (void)
|| actual != sizeof stdout_ihandle)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Cannot find stdout");
if (grub_ieee1275_get_integer_property (grub_ieee1275_chosen, "stdin", &stdin_ihandle,
sizeof stdin_ihandle, &actual)
|| actual != sizeof stdin_ihandle)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Cannot find stdin");
/* Initialize colors. */
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CANNOT_SET_COLORS))
{
@ -385,20 +390,22 @@ grub_ofconsole_fini (void)
static struct grub_term grub_ofconsole_term =
static struct grub_term_input grub_ofconsole_term_input =
{
.name = "ofconsole",
.init = grub_ofconsole_init,
.init = grub_ofconsole_init_input,
.fini = grub_ofconsole_fini,
.checkkey = grub_ofconsole_checkkey,
.getkey = grub_ofconsole_getkey,
};
static struct grub_term_output grub_ofconsole_term_output =
{
.name = "ofconsole",
.init = grub_ofconsole_init_output,
.fini = grub_ofconsole_fini,
.putchar = grub_ofconsole_putchar,
.getcharwidth = grub_ofconsole_getcharwidth,
#ifdef __i386__
.checkkey = grub_console_checkkey,
.getkey = grub_console_getkey,
#else
.checkkey = grub_ofconsole_checkkey,
.getkey = grub_ofconsole_getkey,
#endif
.getxy = grub_ofconsole_getxy,
.getwh = grub_ofconsole_getwh,
.gotoxy = grub_ofconsole_gotoxy,
@ -409,18 +416,20 @@ static struct grub_term grub_ofconsole_term =
.setcursor = grub_ofconsole_setcursor,
.refresh = grub_ofconsole_refresh,
.flags = 0,
.next = 0
};
void
grub_console_init (void)
{
grub_term_register (&grub_ofconsole_term);
grub_term_set_current (&grub_ofconsole_term);
grub_term_register_input (&grub_ofconsole_term_input);
grub_term_register_output (&grub_ofconsole_term_output);
grub_term_set_current_output (&grub_ofconsole_term_output);
grub_term_set_current_input (&grub_ofconsole_term_input);
}
void
grub_console_fini (void)
{
grub_term_unregister (&grub_ofconsole_term);
grub_term_unregister_input (&grub_ofconsole_term_input);
grub_term_unregister_output (&grub_ofconsole_term_output);
}