kmsg_dump.c (1193B)
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/kmsg_dump.h> 3#include <linux/spinlock.h> 4#include <linux/console.h> 5#include <linux/string.h> 6#include <shared/init.h> 7#include <shared/kern.h> 8#include <os.h> 9 10static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, 11 enum kmsg_dump_reason reason) 12{ 13 static struct kmsg_dump_iter iter; 14 static DEFINE_SPINLOCK(lock); 15 static char line[1024]; 16 struct console *con; 17 unsigned long flags; 18 size_t len = 0; 19 20 /* only dump kmsg when no console is available */ 21 if (!console_trylock()) 22 return; 23 24 for_each_console(con) { 25 if(strcmp(con->name, "tty") == 0 && 26 (con->flags & (CON_ENABLED | CON_CONSDEV)) != 0) { 27 break; 28 } 29 } 30 31 console_unlock(); 32 33 if (con) 34 return; 35 36 if (!spin_trylock_irqsave(&lock, flags)) 37 return; 38 39 kmsg_dump_rewind(&iter); 40 41 printf("kmsg_dump:\n"); 42 while (kmsg_dump_get_line(&iter, true, line, sizeof(line), &len)) { 43 line[len] = '\0'; 44 printf("%s", line); 45 } 46 47 spin_unlock_irqrestore(&lock, flags); 48} 49 50static struct kmsg_dumper kmsg_dumper = { 51 .dump = kmsg_dumper_stdout 52}; 53 54int __init kmsg_dumper_stdout_init(void) 55{ 56 return kmsg_dump_register(&kmsg_dumper); 57} 58 59__uml_postsetup(kmsg_dumper_stdout_init);