From a01b5c9f91adaee088a817861603a5dbe14775c2 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 01 Nov 2024 02:40:28 +0000 Subject: [PATCH] rootfs patch --- kernel/kernel/printk/printk.c | 73 ++++++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+), 0 deletions(-) diff --git a/kernel/kernel/printk/printk.c b/kernel/kernel/printk/printk.c index e253475..db67ef3 100644 --- a/kernel/kernel/printk/printk.c +++ b/kernel/kernel/printk/printk.c @@ -47,6 +47,7 @@ #include <linux/sched/clock.h> #include <linux/sched/debug.h> #include <linux/sched/task_stack.h> +#include <linux/irqstage.h> #include <linux/uaccess.h> #include <asm/sections.h> @@ -2188,6 +2189,73 @@ } #endif +#ifdef CONFIG_RAW_PRINTK +static struct console *raw_console; +static DEFINE_HARD_SPINLOCK(raw_console_lock); + +void raw_puts(const char *s, size_t len) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&raw_console_lock, flags); + if (raw_console) + raw_console->write_raw(raw_console, s, len); + raw_spin_unlock_irqrestore(&raw_console_lock, flags); +} +EXPORT_SYMBOL(raw_puts); + +void raw_vprintk(const char *fmt, va_list ap) +{ + char buf[256]; + size_t n; + + if (raw_console == NULL || console_suspended) + return; + + touch_nmi_watchdog(); + n = vscnprintf(buf, sizeof(buf), fmt, ap); + raw_puts(buf, n); +} +EXPORT_SYMBOL(raw_vprintk); + +asmlinkage __visible void raw_printk(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + raw_vprintk(fmt, ap); + va_end(ap); +} +EXPORT_SYMBOL(raw_printk); + +static inline void register_raw_console(struct console *newcon) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&raw_console_lock, flags); + if (newcon->write_raw) + raw_console = newcon; + raw_spin_unlock_irqrestore(&raw_console_lock, flags); +} + +static inline void unregister_raw_console(struct console *oldcon) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&raw_console_lock, flags); + if (oldcon == raw_console) + raw_console = NULL; + raw_spin_unlock_irqrestore(&raw_console_lock, flags); +} + +#else + +static inline void register_raw_console(struct console *newcon) { } + +static inline void unregister_raw_console(struct console *oldcon) { } + +#endif + static int __add_preferred_console(char *name, int idx, char *options, char *brl_options, bool user_specified) { @@ -2854,6 +2922,9 @@ if (err || newcon->flags & CON_BRL) return; + /* The latest raw console to register is current. */ + register_raw_console(newcon); + /* * If we have a bootconsole, and are switching to a real console, * don't print everything out again, since when the boot console, and @@ -2938,6 +3009,8 @@ (console->flags & CON_BOOT) ? "boot" : "" , console->name, console->index); + unregister_raw_console(console); + res = _braille_unregister_console(console); if (res < 0) return res; -- Gitblit v1.6.2