18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/kernel.h> 38c2ecf20Sopenharmony_ci#include <linux/init.h> 48c2ecf20Sopenharmony_ci#include <linux/console.h> 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include "chan_user.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci/* ----------------------------------------------------------------------------- */ 98c2ecf20Sopenharmony_ci/* trivial console driver -- simply dump everything to stderr */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/* 128c2ecf20Sopenharmony_ci * Don't register by default -- as this registers very early in the 138c2ecf20Sopenharmony_ci * boot process it becomes the default console. 148c2ecf20Sopenharmony_ci * 158c2ecf20Sopenharmony_ci * Initialized at init time. 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_cistatic int use_stderr_console = 0; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic void stderr_console_write(struct console *console, const char *string, 208c2ecf20Sopenharmony_ci unsigned len) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci generic_write(2 /* stderr */, string, len, NULL); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic struct console stderr_console = { 268c2ecf20Sopenharmony_ci .name = "stderr", 278c2ecf20Sopenharmony_ci .write = stderr_console_write, 288c2ecf20Sopenharmony_ci .flags = CON_PRINTBUFFER, 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int __init stderr_console_init(void) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci if (use_stderr_console) 348c2ecf20Sopenharmony_ci register_console(&stderr_console); 358c2ecf20Sopenharmony_ci return 0; 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ciconsole_initcall(stderr_console_init); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic int stderr_setup(char *str) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci if (!str) 428c2ecf20Sopenharmony_ci return 0; 438c2ecf20Sopenharmony_ci use_stderr_console = simple_strtoul(str,&str,0); 448c2ecf20Sopenharmony_ci return 1; 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci__setup("stderr=", stderr_setup); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci/* The previous behavior of not unregistering led to /dev/console being 498c2ecf20Sopenharmony_ci * impossible to open. My FC5 filesystem started having init die, and the 508c2ecf20Sopenharmony_ci * system panicing because of this. Unregistering causes the real 518c2ecf20Sopenharmony_ci * console to become the default console, and /dev/console can then be 528c2ecf20Sopenharmony_ci * opened. Making this an initcall makes this happen late enough that 538c2ecf20Sopenharmony_ci * there is no added value in dumping everything to stderr, and the 548c2ecf20Sopenharmony_ci * normal console is good enough to show you all available output. 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_cistatic int __init unregister_stderr(void) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci unregister_console(&stderr_console); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci return 0; 618c2ecf20Sopenharmony_ci} 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci__initcall(unregister_stderr); 64