[1895] 2008-11-07 Robert Millan <[email protected]>

Robert Millan <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 1895
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1895
Author:   robertmh
Date:     2008-11-07 19:11:39 +0000 (Fri, 07 Nov 2008)

Log Message:
-----------
2008-11-07  Robert Millan  <[email protected]>

            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).

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/commands/terminal.c
    trunk/grub2/conf/i386-ieee1275.rmk
    trunk/grub2/conf/i386.rmk
    trunk/grub2/include/grub/i386/coreboot/console.h
    trunk/grub2/include/grub/i386/ieee1275/console.h
    trunk/grub2/include/grub/i386/pc/console.h
    trunk/grub2/include/grub/term.h
    trunk/grub2/kern/i386/coreboot/init.c
    trunk/grub2/kern/ieee1275/init.c
    trunk/grub2/kern/misc.c
    trunk/grub2/kern/term.c
    trunk/grub2/term/efi/console.c
    trunk/grub2/term/gfxterm.c
    trunk/grub2/term/i386/pc/at_keyboard.c
    trunk/grub2/term/i386/pc/console.c
    trunk/grub2/term/i386/pc/serial.c
    trunk/grub2/term/i386/pc/vga.c
    trunk/grub2/term/ieee1275/ofconsole.c
    trunk/grub2/util/console.c
    trunk/grub2/util/grub-editenv.c
    trunk/grub2/util/grub-fstest.c
    trunk/grub2/util/grub-mkconfig.in
    trunk/grub2/util/grub-probe.c
    trunk/grub2/util/grub.d/00_header.in
    trunk/grub2/util/i386/pc/grub-setup.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/ChangeLog	2008-11-07 19:11:39 UTC (rev 1895)
@@ -1,3 +1,144 @@
+2008-11-07  Robert Millan  <[email protected]>
+
+	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).
+
 2008-11-04  Robert Millan  <[email protected]>
 
 	* util/grub.d/10_freebsd.in: New file.  Generate grub configuration

Modified: trunk/grub2/commands/terminal.c
===================================================================
--- trunk/grub2/commands/terminal.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/commands/terminal.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -24,21 +24,21 @@
 #include <grub/term.h>
 
 static grub_err_t
-grub_cmd_terminal (struct grub_arg_list *state __attribute__ ((unused)),
-		   int argc, char **args)
+grub_cmd_terminal_input (struct grub_arg_list *state __attribute__ ((unused)),
+			 int argc, char **args)
 {
-  grub_term_t term = 0;
+  grub_term_input_t term = 0;
   
-  auto int print_terminal (grub_term_t);
-  auto int find_terminal (grub_term_t);
+  auto int print_terminal (grub_term_input_t);
+  auto int find_terminal (grub_term_input_t);
   
-  int print_terminal (grub_term_t t)
+  int print_terminal (grub_term_input_t t)
     {
       grub_printf (" %s", t->name);
       return 0;
     }
 
-  int find_terminal (grub_term_t t)
+  int find_terminal (grub_term_input_t t)
     {
       if (grub_strcmp (t->name, args[0]) == 0)
 	{
@@ -51,30 +51,78 @@
   
   if (argc == 0)
     {
-      grub_printf ("Available terminal(s):");
-      grub_term_iterate (print_terminal);
+      grub_printf ("Available input terminal(s):");
+      grub_term_iterate_input (print_terminal);
       grub_putchar ('\n');
       
-      grub_printf ("Current terminal: %s\n", grub_term_get_current ()->name);
+      grub_printf ("Current input terminal: %s\n", grub_term_get_current_input ()->name);
     }
   else
     {
-      grub_term_iterate (find_terminal);
+      grub_term_iterate_input (find_terminal);
       if (! term)
-	return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such terminal");
+	return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such input terminal");
 
-      grub_term_set_current (term);
+      grub_term_set_current_input (term);
     }
 
   return GRUB_ERR_NONE;
 }
 
+static grub_err_t
+grub_cmd_terminal_output (struct grub_arg_list *state __attribute__ ((unused)),
+			  int argc, char **args)
+{
+  grub_term_output_t term = 0;
+  
+  auto int print_terminal (grub_term_output_t);
+  auto int find_terminal (grub_term_output_t);
+  
+  int print_terminal (grub_term_output_t t)
+    {
+      grub_printf (" %s", t->name);
+      return 0;
+    }
+
+  int find_terminal (grub_term_output_t t)
+    {
+      if (grub_strcmp (t->name, args[0]) == 0)
+	{
+	  term = t;
+	  return 1;
+	}
+
+      return 0;
+    }
+  
+  if (argc == 0)
+    {
+      grub_printf ("Available output terminal(s):");
+      grub_term_iterate_output (print_terminal);
+      grub_putchar ('\n');
+      
+      grub_printf ("Current output terminal: %s\n", grub_term_get_current_output ()->name);
+    }
+  else
+    {
+      grub_term_iterate_output (find_terminal);
+      if (! term)
+	return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such output terminal");
+
+      grub_term_set_current_output (term);
+    }
+
+  return GRUB_ERR_NONE;
+}
+
 
 GRUB_MOD_INIT(terminal)
 {
   (void)mod;			/* To stop warning. */
-  grub_register_command ("terminal", grub_cmd_terminal, GRUB_COMMAND_FLAG_BOTH,
-			 "terminal [TERM...]", "Select a terminal.", 0);
+  grub_register_command ("terminal_input", grub_cmd_terminal_input, GRUB_COMMAND_FLAG_BOTH,
+			 "terminal_input [TERM...]", "Select an input terminal.", 0);
+  grub_register_command ("terminal_output", grub_cmd_terminal_output, GRUB_COMMAND_FLAG_BOTH,
+			 "terminal_output [TERM...]", "Select an output terminal.", 0);
 }
 
 GRUB_MOD_FINI(terminal)

Modified: trunk/grub2/conf/i386-ieee1275.rmk
===================================================================
--- trunk/grub2/conf/i386-ieee1275.rmk	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/conf/i386-ieee1275.rmk	2008-11-07 19:11:39 UTC (rev 1895)
@@ -22,7 +22,7 @@
 	kern/time.c \
 	kern/generic/millisleep.c \
 	kern/ieee1275/ieee1275.c \
-	term/ieee1275/ofconsole.c term/i386/pc/at_keyboard.c \
+	term/ieee1275/ofconsole.c \
 	disk/ieee1275/ofdisk.c \
 	symlist.c
 kernel_elf_HEADERS = arg.h cache.h device.h disk.h dl.h elf.h elfload.h \

Modified: trunk/grub2/conf/i386.rmk
===================================================================
--- trunk/grub2/conf/i386.rmk	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/conf/i386.rmk	2008-11-07 19:11:39 UTC (rev 1895)
@@ -1,8 +1,11 @@
 # -*- makefile -*-
 
 pkglib_MODULES += cpuid.mod
-
-# For cpuid.mod.
 cpuid_mod_SOURCES = commands/i386/cpuid.c
 cpuid_mod_CFLAGS = $(COMMON_CFLAGS)
 cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+pkglib_MODULES += at_keyboard.mod
+at_keyboard_mod_SOURCES = term/i386/pc/at_keyboard.c
+at_keyboard_mod_CFLAGS = $(COMMON_CFLAGS)
+at_keyboard_mod_LDFLAGS = $(COMMON_LDFLAGS)

Modified: trunk/grub2/include/grub/i386/coreboot/console.h
===================================================================
--- trunk/grub2/include/grub/i386/coreboot/console.h	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/include/grub/i386/coreboot/console.h	2008-11-07 19:11:39 UTC (rev 1895)
@@ -1,25 +1 @@
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2008  Free Software Foundation, Inc.
- *
- *  GRUB is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  GRUB is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _GRUB_CONSOLE_MACHINE_LB_HEADER
-#define _GRUB_CONSOLE_MACHINE_LB_HEADER 1
 #include <grub/i386/pc/console.h>
-
-void grub_keyboard_controller_init (void);
-
-#endif /* ! _GRUB_CONSOLE_MACHINE_LB_HEADER */

Modified: trunk/grub2/include/grub/i386/ieee1275/console.h
===================================================================
--- trunk/grub2/include/grub/i386/ieee1275/console.h	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/include/grub/i386/ieee1275/console.h	2008-11-07 19:11:39 UTC (rev 1895)
@@ -21,10 +21,6 @@
 
 #include <grub/symbol.h>
 
-void EXPORT_FUNC(grub_keyboard_controller_init) (void);
-int EXPORT_FUNC(grub_console_checkkey) (void);
-int EXPORT_FUNC(grub_console_getkey) (void);
-
 /* Initialize the console system.  */
 void grub_console_init (void);
 

Modified: trunk/grub2/include/grub/i386/pc/console.h
===================================================================
--- trunk/grub2/include/grub/i386/pc/console.h	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/include/grub/i386/pc/console.h	2008-11-07 19:11:39 UTC (rev 1895)
@@ -40,8 +40,8 @@
 /* These are global to share code between C and asm.  */
 extern grub_uint8_t grub_console_cur_color;
 void grub_console_real_putchar (int c);
-int EXPORT_FUNC(grub_console_checkkey) (void);
-int EXPORT_FUNC(grub_console_getkey) (void);
+int grub_console_checkkey (void);
+int grub_console_getkey (void);
 grub_uint16_t grub_console_getxy (void);
 void grub_console_gotoxy (grub_uint8_t x, grub_uint8_t y);
 void grub_console_cls (void);

Modified: trunk/grub2/include/grub/term.h
===================================================================
--- trunk/grub2/include/grub/term.h	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/include/grub/term.h	2008-11-07 19:11:39 UTC (rev 1895)
@@ -137,7 +137,7 @@
                                  - 1)
 
 
-struct grub_term
+struct grub_term_input
 {
   /* The terminal name.  */
   const char *name;
@@ -148,6 +148,28 @@
   /* Clean up the terminal.  */
   grub_err_t (*fini) (void);
   
+  /* Check if any input character is available.  */
+  int (*checkkey) (void);
+  
+  /* Get a character.  */
+  int (*getkey) (void);
+
+  /* The next terminal.  */
+  struct grub_term_input *next;
+};
+typedef struct grub_term_input *grub_term_input_t;
+
+struct grub_term_output
+{
+  /* The terminal name.  */
+  const char *name;
+
+  /* Initialize the terminal.  */
+  grub_err_t (*init) (void);
+
+  /* Clean up the terminal.  */
+  grub_err_t (*fini) (void);
+  
   /* Put a character. C is encoded in Unicode.  */
   void (*putchar) (grub_uint32_t c);
 
@@ -155,12 +177,6 @@
      encoded in Unicode.  */
   grub_ssize_t (*getcharwidth) (grub_uint32_t c);
   
-  /* Check if any input character is available.  */
-  int (*checkkey) (void);
-  
-  /* Get a character.  */
-  int (*getkey) (void);
-  
   /* Get the screen size. The return value is ((Width << 8) | Height).  */
   grub_uint16_t (*getwh) (void);
 
@@ -194,16 +210,21 @@
   grub_uint32_t flags;
   
   /* The next terminal.  */
-  struct grub_term *next;
+  struct grub_term_output *next;
 };
-typedef struct grub_term *grub_term_t;
+typedef struct grub_term_output *grub_term_output_t;
 
-void EXPORT_FUNC(grub_term_register) (grub_term_t term);
-void EXPORT_FUNC(grub_term_unregister) (grub_term_t term);
-void EXPORT_FUNC(grub_term_iterate) (int (*hook) (grub_term_t term));
+void EXPORT_FUNC(grub_term_register_input) (grub_term_input_t term);
+void EXPORT_FUNC(grub_term_register_output) (grub_term_output_t term);
+void EXPORT_FUNC(grub_term_unregister_input) (grub_term_input_t term);
+void EXPORT_FUNC(grub_term_unregister_output) (grub_term_output_t term);
+void EXPORT_FUNC(grub_term_iterate_input) (int (*hook) (grub_term_input_t term));
+void EXPORT_FUNC(grub_term_iterate_output) (int (*hook) (grub_term_output_t term));
 
-grub_err_t EXPORT_FUNC(grub_term_set_current) (grub_term_t term);
-grub_term_t EXPORT_FUNC(grub_term_get_current) (void);
+grub_err_t EXPORT_FUNC(grub_term_set_current_input) (grub_term_input_t term);
+grub_err_t EXPORT_FUNC(grub_term_set_current_output) (grub_term_output_t term);
+grub_term_input_t EXPORT_FUNC(grub_term_get_current_input) (void);
+grub_term_output_t EXPORT_FUNC(grub_term_get_current_output) (void);
 
 void EXPORT_FUNC(grub_putchar) (int c);
 void EXPORT_FUNC(grub_putcode) (grub_uint32_t code);

Modified: trunk/grub2/kern/i386/coreboot/init.c
===================================================================
--- trunk/grub2/kern/i386/coreboot/init.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/kern/i386/coreboot/init.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -138,6 +138,7 @@
   grub_upper_mem -= GRUB_MEMORY_MACHINE_UPPER_START;
 
   grub_tsc_init ();
+  grub_at_keyboard_init ();
 }
 
 void

Modified: trunk/grub2/kern/ieee1275/init.c
===================================================================
--- trunk/grub2/kern/ieee1275/init.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/kern/ieee1275/init.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -217,7 +217,6 @@
   grub_console_init ();
 #ifdef __i386__
   grub_get_extended_memory ();
-  grub_keyboard_controller_init ();
 #endif
   grub_claim_heap ();
   grub_ofdisk_init ();

Modified: trunk/grub2/kern/misc.c
===================================================================
--- trunk/grub2/kern/misc.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/kern/misc.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -1026,10 +1026,15 @@
 void
 grub_abort (void)
 {
-  if (grub_term_get_current ())
+  if (grub_term_get_current_output ())
     {
-      grub_printf ("\nAborted. Press any key to exit.");
-      grub_getkey ();
+      grub_printf ("\nAborted.");
+
+      if (grub_term_get_current_input ())
+	{
+	  grub_printf (" Press any key to exit.");
+	  grub_getkey ();
+	}
     }
 
   grub_exit ();

Modified: trunk/grub2/kern/term.c
===================================================================
--- trunk/grub2/kern/term.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/kern/term.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -23,10 +23,12 @@
 #include <grub/env.h>
 
 /* The list of terminals.  */
-static grub_term_t grub_term_list;
+static grub_term_input_t grub_term_list_input;
+static grub_term_output_t grub_term_list_output;
 
 /* The current terminal.  */
-static grub_term_t grub_cur_term;
+static grub_term_input_t grub_cur_term_input;
+static grub_term_output_t grub_cur_term_output;
 
 /* The amount of lines counted by the pager.  */
 static int grub_more_lines;
@@ -38,18 +40,25 @@
 static int cursor_state = 1;
 
 void
-grub_term_register (grub_term_t term)
+grub_term_register_input (grub_term_input_t term)
 {
-  term->next = grub_term_list;
-  grub_term_list = term;
+  term->next = grub_term_list_input;
+  grub_term_list_input = term;
 }
 
 void
-grub_term_unregister (grub_term_t term)
+grub_term_register_output (grub_term_output_t term)
 {
-  grub_term_t *p, q;
+  term->next = grub_term_list_output;
+  grub_term_list_output = term;
+}
+
+void
+grub_term_unregister_input (grub_term_input_t term)
+{
+  grub_term_input_t *p, q;
   
-  for (p = &grub_term_list, q = *p; q; p = &(q->next), q = q->next)
+  for (p = &grub_term_list_input, q = *p; q; p = &(q->next), q = q->next)
     if (q == term)
       {
         *p = q->next;
@@ -58,45 +67,87 @@
 }
 
 void
-grub_term_iterate (int (*hook) (grub_term_t term))
+grub_term_unregister_output (grub_term_output_t term)
 {
-  grub_term_t p;
+  grub_term_output_t *p, q;
   
-  for (p = grub_term_list; p; p = p->next)
+  for (p = &grub_term_list_output, q = *p; q; p = &(q->next), q = q->next)
+    if (q == term)
+      {
+        *p = q->next;
+	break;
+      }
+}
+
+void
+grub_term_iterate_input (int (*hook) (grub_term_input_t term))
+{
+  grub_term_input_t p;
+  
+  for (p = grub_term_list_input; p; p = p->next)
     if (hook (p))
       break;
 }
 
+void
+grub_term_iterate_output (int (*hook) (grub_term_output_t term))
+{
+  grub_term_output_t p;
+  
+  for (p = grub_term_list_output; p; p = p->next)
+    if (hook (p))
+      break;
+}
+
 grub_err_t
-grub_term_set_current (grub_term_t term)
+grub_term_set_current_input (grub_term_input_t term)
 {
-  if (grub_cur_term && grub_cur_term->fini)
-    if ((grub_cur_term->fini) () != GRUB_ERR_NONE)
+  if (grub_cur_term_input && grub_cur_term_input->fini)
+    if ((grub_cur_term_input->fini) () != GRUB_ERR_NONE)
       return grub_errno;
 
   if (term->init)
     if ((term->init) () != GRUB_ERR_NONE)
       return grub_errno;
   
-  grub_cur_term = term;
-  grub_cls ();
-  grub_setcursor (grub_getcursor ());
+  grub_cur_term_input = term;
   return GRUB_ERR_NONE;
 }
 
-grub_term_t
-grub_term_get_current (void)
+grub_err_t
+grub_term_set_current_output (grub_term_output_t term)
 {
-  return grub_cur_term;
+  if (grub_cur_term_output && grub_cur_term_output->fini)
+    if ((grub_cur_term_output->fini) () != GRUB_ERR_NONE)
+      return grub_errno;
+
+  if (term->init)
+    if ((term->init) () != GRUB_ERR_NONE)
+      return grub_errno;
+  
+  grub_cur_term_output = term;
+  return GRUB_ERR_NONE;
 }
 
+grub_term_input_t
+grub_term_get_current_input (void)
+{
+  return grub_cur_term_input;
+}
+
+grub_term_output_t
+grub_term_get_current_output (void)
+{
+  return grub_cur_term_output;
+}
+
 /* Put a Unicode character.  */
 void
 grub_putcode (grub_uint32_t code)
 {
   int height = grub_getwh () & 255;
 
-  if (code == '\t' && grub_cur_term->getxy)
+  if (code == '\t' && grub_cur_term_output->getxy)
     {
       int n;
       
@@ -107,7 +158,7 @@
       return;
     }
   
-  (grub_cur_term->putchar) (code);
+  (grub_cur_term_output->putchar) (code);
   
   if (code == '\n')
     {
@@ -171,70 +222,70 @@
 grub_ssize_t
 grub_getcharwidth (grub_uint32_t code)
 {
-  return (grub_cur_term->getcharwidth) (code);
+  return (grub_cur_term_output->getcharwidth) (code);
 }
 
 int
 grub_getkey (void)
 {
-  return (grub_cur_term->getkey) ();
+  return (grub_cur_term_input->getkey) ();
 }
 
 int
 grub_checkkey (void)
 {
-  return (grub_cur_term->checkkey) ();
+  return (grub_cur_term_input->checkkey) ();
 }
 
 grub_uint16_t
 grub_getxy (void)
 {
-  return (grub_cur_term->getxy) ();
+  return (grub_cur_term_output->getxy) ();
 }
 
 grub_uint16_t
 grub_getwh (void)
 {
-  return (grub_cur_term->getwh) ();
+  return (grub_cur_term_output->getwh) ();
 }
 
 void
 grub_gotoxy (grub_uint8_t x, grub_uint8_t y)
 {
-  (grub_cur_term->gotoxy) (x, y);
+  (grub_cur_term_output->gotoxy) (x, y);
 }
 
 void
 grub_cls (void)
 {
-  if ((grub_cur_term->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug")))
+  if ((grub_cur_term_output->flags & GRUB_TERM_DUMB) || (grub_env_get ("debug")))
     {
       grub_putchar ('\n');
       grub_refresh ();
     }
   else
-    (grub_cur_term->cls) ();
+    (grub_cur_term_output->cls) ();
 }
 
 void
 grub_setcolorstate (grub_term_color_state state)
 {
-  if (grub_cur_term->setcolorstate)
-    (grub_cur_term->setcolorstate) (state);
+  if (grub_cur_term_output->setcolorstate)
+    (grub_cur_term_output->setcolorstate) (state);
 }
 
 void
 grub_setcolor (grub_uint8_t normal_color, grub_uint8_t highlight_color)
 {
-  if (grub_cur_term->setcolor)
-    (grub_cur_term->setcolor) (normal_color, highlight_color);
+  if (grub_cur_term_output->setcolor)
+    (grub_cur_term_output->setcolor) (normal_color, highlight_color);
 }
 
 void
 grub_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color)
 {
-  if (grub_cur_term->getcolor)
-    (grub_cur_term->getcolor) (normal_color, highlight_color);
+  if (grub_cur_term_output->getcolor)
+    (grub_cur_term_output->getcolor) (normal_color, highlight_color);
 }
 
 int
@@ -242,9 +293,9 @@
 {
   int ret = cursor_state;
 
-  if (grub_cur_term->setcursor)
+  if (grub_cur_term_output->setcursor)
     {
-      (grub_cur_term->setcursor) (on);
+      (grub_cur_term_output->setcursor) (on);
       cursor_state = on;
     }
   
@@ -260,8 +311,8 @@
 void
 grub_refresh (void)
 {
-  if (grub_cur_term->refresh)
-    (grub_cur_term->refresh) ();
+  if (grub_cur_term_output->refresh)
+    (grub_cur_term_output->refresh) ();
 }
 
 void

Modified: trunk/grub2/term/efi/console.c
===================================================================
--- trunk/grub2/term/efi/console.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/efi/console.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -332,15 +332,18 @@
   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,
+    .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,
-    .checkkey = grub_console_checkkey,
-    .getkey = grub_console_getkey,
     .getwh = grub_console_getwh,
     .getxy = grub_console_getxy,
     .gotoxy = grub_console_gotoxy,
@@ -350,7 +353,6 @@
     .getcolor = grub_console_getcolor,
     .setcursor = grub_console_setcursor,
     .flags = 0,
-    .next = 0
   };
 
 void
@@ -364,12 +366,15 @@
       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);
 }

Modified: trunk/grub2/term/gfxterm.c
===================================================================
--- trunk/grub2/term/gfxterm.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/gfxterm.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -1056,15 +1056,13 @@
   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 @@
 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_FINI(term_gfxterm)
 {
   grub_unregister_command ("bgimage");
-  grub_term_unregister (&grub_video_term);
+  grub_term_unregister_output (&grub_video_term);
 }

Modified: trunk/grub2/term/i386/pc/at_keyboard.c
===================================================================
--- trunk/grub2/term/i386/pc/at_keyboard.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/i386/pc/at_keyboard.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -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 @@
   '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 @@
   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 @@
 }
 
 /* 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 @@
   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);
+}

Modified: trunk/grub2/term/i386/pc/console.c
===================================================================
--- trunk/grub2/term/i386/pc/console.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/i386/pc/console.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -125,15 +125,22 @@
   *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,
+    .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,
-    .checkkey = grub_console_checkkey,
-    .getkey = grub_console_getkey,
     .getwh = grub_console_getwh,
     .getxy = grub_console_getxy,
     .gotoxy = grub_console_gotoxy,
@@ -143,23 +150,26 @@
     .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);
 }

Modified: trunk/grub2/term/i386/pc/serial.c
===================================================================
--- trunk/grub2/term/i386/pc/serial.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/i386/pc/serial.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -467,15 +467,18 @@
     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,
+  .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,
-  .checkkey = grub_serial_checkkey,
-  .getkey = grub_serial_getkey,
   .getwh = grub_serial_getwh,
   .getxy = grub_serial_getxy,
   .gotoxy = grub_serial_gotoxy,
@@ -483,7 +486,6 @@
   .setcolorstate = grub_serial_setcolorstate,
   .setcursor = grub_serial_setcursor,
   .flags = 0,
-  .next = 0
 };
 
 
@@ -575,7 +577,8 @@
       /* 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 @@
 	  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_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);
+    }
 }

Modified: trunk/grub2/term/i386/pc/vga.c
===================================================================
--- trunk/grub2/term/i386/pc/vga.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/i386/pc/vga.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -473,15 +473,13 @@
     }
 }
 
-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 @@
     .setcolorstate = grub_vga_setcolorstate,
     .setcursor = grub_vga_setcursor,
     .flags = 0,
-    .next = 0
   };
 
 GRUB_MOD_INIT(vga)
@@ -497,10 +494,10 @@
 #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);
 }

Modified: trunk/grub2/term/ieee1275/ofconsole.c
===================================================================
--- trunk/grub2/term/ieee1275/ofconsole.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/term/ieee1275/ofconsole.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -33,10 +33,8 @@
 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 @@
   *highlight_color = grub_ofconsole_highlight_color;
 }
 
-#ifndef __i386__
 static int
 grub_ofconsole_readkey (int *key)
 {
@@ -342,9 +339,22 @@
 }
 
 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;
 
   /* The latest PowerMacs don't actually initialize the screen for us, so we
@@ -358,11 +368,6 @@
       || 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 @@
 
 
 
-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 @@
     .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);
 }

Modified: trunk/grub2/util/console.c
===================================================================
--- trunk/grub2/util/console.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/console.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -371,7 +371,8 @@
 grub_console_init (void)
 {
   grub_term_register (&grub_ncurses_term);
-  grub_term_set_current (&grub_ncurses_term);
+  grub_term_set_current_input (&grub_ncurses_term);
+  grub_term_set_current_output (&grub_ncurses_term);
 }
 
 void

Modified: trunk/grub2/util/grub-editenv.c
===================================================================
--- trunk/grub2/util/grub-editenv.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/grub-editenv.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -41,11 +41,17 @@
 }
 
 void *
-grub_term_get_current (void)
+grub_term_get_current_input (void)
 {
   return 0;
 }
 
+void *
+grub_term_get_current_output (void)
+{
+  return 0;
+}
+
 int
 grub_getkey (void)
 {

Modified: trunk/grub2/util/grub-fstest.c
===================================================================
--- trunk/grub2/util/grub-fstest.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/grub-fstest.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -54,11 +54,17 @@
 }
 
 grub_term_t
-grub_term_get_current (void)
+grub_term_get_current_input (void)
 {
   return 0;
 }
 
+grub_term_t
+grub_term_get_current_output (void)
+{
+  return 0;
+}
+
 void
 grub_refresh (void)
 {

Modified: trunk/grub2/util/grub-mkconfig.in
===================================================================
--- trunk/grub2/util/grub-mkconfig.in	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/grub-mkconfig.in	2008-11-07 19:11:39 UTC (rev 1895)
@@ -130,31 +130,37 @@
   . ${sysconfdir}/default/grub
 fi
 
-case x${GRUB_TERMINAL} in
+# XXX: should this be deprecated at some point?
+if [ "x${GRUB_TERMINAL}" != "x" ] ; then
+  GRUB_TERMINAL_INPUT="${GRUB_TERMINAL}"
+  GRUB_TERMINAL_OUTPUT="${GRUB_TERMINAL}"
+fi
+
+case x${GRUB_TERMINAL_OUTPUT} in
   x)
     # If this platform supports gfxterm, try to use it.
     if test -e ${grub_prefix}/gfxterm.mod ; then
-      GRUB_TERMINAL=gfxterm
+      GRUB_TERMINAL_OUTPUT=gfxterm
     fi
   ;;
   xconsole | xserial | xofconsole | xgfxterm) ;;
-  *) echo "Invalid terminal \"${GRUB_TERMINAL}\"" >&2 ; exit 1 ;;
+  *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;;
 esac
 
 # check for terminals that require fonts
-case ${GRUB_TERMINAL} in
+case ${GRUB_TERMINAL_OUTPUT} in
   gfxterm)
     if path=`font_path` ; then
       GRUB_FONT_PATH="${path}"
     else
       # fallback to the native terminal for this platform
-      unset GRUB_TERMINAL
+      unset GRUB_TERMINAL_OUTPUT
     fi
   ;;
 esac
 
 # does our terminal support utf-8 ?
-case ${GRUB_TERMINAL} in
+case ${GRUB_TERMINAL_OUTPUT} in
   gfxterm) ;;
   *)
     # make sure all our children behave in conformance with ascii..
@@ -167,7 +173,7 @@
 export GRUB_DEVICE GRUB_DEVICE_UUID GRUB_DEVICE_BOOT GRUB_DEVICE_BOOT_UUID GRUB_FS GRUB_FONT_PATH GRUB_PRELOAD_MODULES
 
 # These are optional, user-defined variables.
-export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUX_DEFAULT GRUB_TERMINAL GRUB_SERIAL_COMMAND GRUB_DISABLE_LINUX_UUID GRUB_GFXMODE
+export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUX_DEFAULT GRUB_TERMINAL_OUTPUT GRUB_SERIAL_COMMAND GRUB_DISABLE_LINUX_UUID GRUB_GFXMODE
 
 if test "x${grub_cfg}" != "x"; then
   rm -f ${grub_cfg}.new

Modified: trunk/grub2/util/grub-probe.c
===================================================================
--- trunk/grub2/util/grub-probe.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/grub-probe.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -66,12 +66,18 @@
   return -1;
 }
 
-grub_term_t
-grub_term_get_current (void)
+grub_term_input_t
+grub_term_get_current_input (void)
 {
   return 0;
 }
 
+grub_term_output_t
+grub_term_get_current_output (void)
+{
+  return 0;
+}
+
 void
 grub_refresh (void)
 {

Modified: trunk/grub2/util/grub.d/00_header.in
===================================================================
--- trunk/grub2/util/grub.d/00_header.in	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/grub.d/00_header.in	2008-11-07 19:11:39 UTC (rev 1895)
@@ -40,8 +40,31 @@
 set timeout=${GRUB_TIMEOUT}
 EOF
 
-case x${GRUB_TERMINAL} in
-  xgfxterm)
+case ${GRUB_TERMINAL_INPUT}:${GRUB_TERMINAL_OUTPUT} in
+  serial:* | *: serial)
+    if ! test -e ${grub_prefix}/serial.mod ; then
+      echo "Serial terminal not available on this platform." >&2 ; exit 1
+    fi
+
+    if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
+      echo "Warning, requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used." >&2
+      GRUB_SERIAL_COMMAND=serial
+    fi
+    echo "${GRUB_SERIAL_COMMAND}"
+  ;;
+esac
+
+case x${GRUB_TERMINAL_INPUT} in
+  x)
+    # Just use the native terminal
+  ;;
+  x*)
+    echo "terminal_input ${GRUB_TERMINAL_INPUT}"
+  ;;
+esac
+
+case x${GRUB_TERMINAL_OUTPUT} in
+ xgfxterm)
     # Make the font accessible
     prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_FONT_PATH}`
 
@@ -62,26 +85,14 @@
   set gfxmode=${GRUB_GFXMODE}
   insmod gfxterm
   insmod ${video_backend}
-  terminal gfxterm
+  terminal_output gfxterm
 fi
 EOF
   ;;
-  xserial)
-    if ! test -e ${grub_prefix}/serial.mod ; then
-      echo "Serial terminal not available on this platform." >&2 ; exit 1
-    fi
-
-    if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
-      echo "Warning, requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used." >&2
-      GRUB_SERIAL_COMMAND=serial
-    fi
-    echo "${GRUB_SERIAL_COMMAND}"
-    echo "terminal serial"
-  ;;
   x)
     # Just use the native terminal
   ;;
   x*)
-    echo "terminal ${GRUB_TERMINAL}"
+    echo "terminal_output ${GRUB_TERMINAL_OUTPUT}"
   ;;
 esac

Modified: trunk/grub2/util/i386/pc/grub-setup.c
===================================================================
--- trunk/grub2/util/i386/pc/grub-setup.c	2008-11-07 19:09:01 UTC (rev 1894)
+++ trunk/grub2/util/i386/pc/grub-setup.c	2008-11-07 19:11:39 UTC (rev 1895)
@@ -74,12 +74,18 @@
   return -1;
 }
 
-grub_term_t
-grub_term_get_current (void)
+grub_term_input_t
+grub_term_get_current_input (void)
 {
   return 0;
 }
 
+grub_term_output_t
+grub_term_get_current_output (void)
+{
+  return 0;
+}
+
 void
 grub_refresh (void)
 {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.