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