162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/kernel.h>
362306a36Sopenharmony_ci#include <linux/init.h>
462306a36Sopenharmony_ci#include <linux/console.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "chan_user.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/* ----------------------------------------------------------------------------- */
962306a36Sopenharmony_ci/* trivial console driver -- simply dump everything to stderr                    */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * Don't register by default -- as this registers very early in the
1362306a36Sopenharmony_ci * boot process it becomes the default console.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * Initialized at init time.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_cistatic int use_stderr_console = 0;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic void stderr_console_write(struct console *console, const char *string,
2062306a36Sopenharmony_ci				 unsigned len)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	generic_write(2 /* stderr */, string, len, NULL);
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic struct console stderr_console = {
2662306a36Sopenharmony_ci	.name		= "stderr",
2762306a36Sopenharmony_ci	.write		= stderr_console_write,
2862306a36Sopenharmony_ci	.flags		= CON_PRINTBUFFER,
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic int __init stderr_console_init(void)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	if (use_stderr_console)
3462306a36Sopenharmony_ci		register_console(&stderr_console);
3562306a36Sopenharmony_ci	return 0;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ciconsole_initcall(stderr_console_init);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic int stderr_setup(char *str)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	if (!str)
4262306a36Sopenharmony_ci		return 0;
4362306a36Sopenharmony_ci	use_stderr_console = simple_strtoul(str,&str,0);
4462306a36Sopenharmony_ci	return 1;
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci__setup("stderr=", stderr_setup);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* The previous behavior of not unregistering led to /dev/console being
4962306a36Sopenharmony_ci * impossible to open.  My FC5 filesystem started having init die, and the
5062306a36Sopenharmony_ci * system panicing because of this.  Unregistering causes the real
5162306a36Sopenharmony_ci * console to become the default console, and /dev/console can then be
5262306a36Sopenharmony_ci * opened.  Making this an initcall makes this happen late enough that
5362306a36Sopenharmony_ci * there is no added value in dumping everything to stderr, and the
5462306a36Sopenharmony_ci * normal console is good enough to show you all available output.
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_cistatic int __init unregister_stderr(void)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	unregister_console(&stderr_console);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	return 0;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci__initcall(unregister_stderr);
64