1e16f5350d4cf402cffd18898b07c3b72917db192Jeff Dike#include <linux/kernel.h>
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/console.h>
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "chan_user.h"
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ----------------------------------------------------------------------------- */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* trivial console driver -- simply dump everything to stderr                    */
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
11b60745b960dc8313400899fcda310ba51604ffb8Simon Arlott * Don't register by default -- as this registers very early in the
126edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * boot process it becomes the default console.
13730760e90a173ef81f89beed2f1dad2fab310f68Jeff Dike *
14730760e90a173ef81f89beed2f1dad2fab310f68Jeff Dike * Initialized at init time.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int use_stderr_console = 0;
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void stderr_console_write(struct console *console, const char *string,
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				 unsigned len)
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	generic_write(2 /* stderr */, string, len, NULL);
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct console stderr_console = {
25da00d9a5466558ccd9e7b7d04b13d7cb9160c876Jeff Dike	.name		= "stderr",
26da00d9a5466558ccd9e7b7d04b13d7cb9160c876Jeff Dike	.write		= stderr_console_write,
27da00d9a5466558ccd9e7b7d04b13d7cb9160c876Jeff Dike	.flags		= CON_PRINTBUFFER,
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init stderr_console_init(void)
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (use_stderr_console)
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		register_console(&stderr_console);
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconsole_initcall(stderr_console_init);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int stderr_setup(char *str)
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!str)
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	use_stderr_console = simple_strtoul(str,&str,0);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__setup("stderr=", stderr_setup);
466edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike
476edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike/* The previous behavior of not unregistering led to /dev/console being
486edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * impossible to open.  My FC5 filesystem started having init die, and the
496edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * system panicing because of this.  Unregistering causes the real
506edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * console to become the default console, and /dev/console can then be
516edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * opened.  Making this an initcall makes this happen late enough that
526edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * there is no added value in dumping everything to stderr, and the
536edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike * normal console is good enough to show you all available output.
546edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike */
556edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dikestatic int __init unregister_stderr(void)
566edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike{
576edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike	unregister_console(&stderr_console);
586edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike
596edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike	return 0;
606edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike}
616edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike
626edb08620fbeeeba81ab63c7129a51cdb3acd8b3Jeff Dike__initcall(unregister_stderr);
63