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