diff options
| -rw-r--r-- | arch/um/kernel/Makefile | 2 | ||||
| -rw-r--r-- | arch/um/kernel/kmsg_dump.c | 43 | ||||
| -rw-r--r-- | arch/um/kernel/um_arch.c | 2 |
3 files changed, 46 insertions, 1 deletions
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index b7e31e5a8c0c..a6a5e42caaef 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile | |||
| @@ -13,7 +13,7 @@ clean-files := | |||
| 13 | obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \ | 13 | obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \ |
| 14 | physmem.o process.o ptrace.o reboot.o sigio.o \ | 14 | physmem.o process.o ptrace.o reboot.o sigio.o \ |
| 15 | signal.o syscall.o sysrq.o time.o tlb.o trap.o \ | 15 | signal.o syscall.o sysrq.o time.o tlb.o trap.o \ |
| 16 | um_arch.o umid.o maccess.o skas/ | 16 | um_arch.o umid.o maccess.o kmsg_dump.o skas/ |
| 17 | 17 | ||
| 18 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o | 18 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o |
| 19 | obj-$(CONFIG_GPROF) += gprof_syms.o | 19 | obj-$(CONFIG_GPROF) += gprof_syms.o |
diff --git a/arch/um/kernel/kmsg_dump.c b/arch/um/kernel/kmsg_dump.c new file mode 100644 index 000000000000..407d49251d6f --- /dev/null +++ b/arch/um/kernel/kmsg_dump.c | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | #include <linux/kmsg_dump.h> | ||
| 2 | #include <linux/console.h> | ||
| 3 | #include <shared/init.h> | ||
| 4 | #include <shared/kern.h> | ||
| 5 | #include <os.h> | ||
| 6 | |||
| 7 | static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, | ||
| 8 | enum kmsg_dump_reason reason) | ||
| 9 | { | ||
| 10 | static char line[1024]; | ||
| 11 | |||
| 12 | size_t len = 0; | ||
| 13 | bool con_available = false; | ||
| 14 | |||
| 15 | /* only dump kmsg when no console is available */ | ||
| 16 | if (!console_trylock()) | ||
| 17 | return; | ||
| 18 | |||
| 19 | if (console_drivers != NULL) | ||
| 20 | con_available = true; | ||
| 21 | |||
| 22 | console_unlock(); | ||
| 23 | |||
| 24 | if (con_available == true) | ||
| 25 | return; | ||
| 26 | |||
| 27 | printf("kmsg_dump:\n"); | ||
| 28 | while (kmsg_dump_get_line(dumper, true, line, sizeof(line), &len)) { | ||
| 29 | line[len] = '\0'; | ||
| 30 | printf("%s", line); | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 34 | static struct kmsg_dumper kmsg_dumper = { | ||
| 35 | .dump = kmsg_dumper_stdout | ||
| 36 | }; | ||
| 37 | |||
| 38 | int __init kmsg_dumper_stdout_init(void) | ||
| 39 | { | ||
| 40 | return kmsg_dump_register(&kmsg_dumper); | ||
| 41 | } | ||
| 42 | |||
| 43 | __uml_postsetup(kmsg_dumper_stdout_init); | ||
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 9b06957e98ce..926ecdceba86 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
| 12 | #include <linux/utsname.h> | 12 | #include <linux/utsname.h> |
| 13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
| 14 | #include <linux/kmsg_dump.h> | ||
| 14 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
| 15 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
| 16 | #include <asm/sections.h> | 17 | #include <asm/sections.h> |
| @@ -211,6 +212,7 @@ static void __init uml_postsetup(void) | |||
| 211 | static int panic_exit(struct notifier_block *self, unsigned long unused1, | 212 | static int panic_exit(struct notifier_block *self, unsigned long unused1, |
| 212 | void *unused2) | 213 | void *unused2) |
| 213 | { | 214 | { |
| 215 | kmsg_dump(KMSG_DUMP_PANIC); | ||
| 214 | bust_spinlocks(1); | 216 | bust_spinlocks(1); |
| 215 | bust_spinlocks(0); | 217 | bust_spinlocks(0); |
| 216 | uml_exitcode = 1; | 218 | uml_exitcode = 1; |
