| 1 | /* | 
|---|
| 2 | * linux/include/kmsg_dump.h | 
|---|
| 3 | * | 
|---|
| 4 | * Copyright (C) 2009 Net Insight AB | 
|---|
| 5 | * | 
|---|
| 6 | * Author: Simon Kagstrom <simon.kagstrom@netinsight.net> | 
|---|
| 7 | * | 
|---|
| 8 | * This file is subject to the terms and conditions of the GNU General Public | 
|---|
| 9 | * License.  See the file COPYING in the main directory of this archive | 
|---|
| 10 | * for more details. | 
|---|
| 11 | */ | 
|---|
| 12 | #ifndef _LINUX_KMSG_DUMP_H | 
|---|
| 13 | #define _LINUX_KMSG_DUMP_H | 
|---|
| 14 |  | 
|---|
| 15 | #include <linux/errno.h> | 
|---|
| 16 | #include <linux/list.h> | 
|---|
| 17 |  | 
|---|
| 18 | /* | 
|---|
| 19 | * Keep this list arranged in rough order of priority. Anything listed after | 
|---|
| 20 | * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump | 
|---|
| 21 | * is passed to the kernel. | 
|---|
| 22 | */ | 
|---|
| 23 | enum kmsg_dump_reason { | 
|---|
| 24 | KMSG_DUMP_UNDEF, | 
|---|
| 25 | KMSG_DUMP_PANIC, | 
|---|
| 26 | KMSG_DUMP_OOPS, | 
|---|
| 27 | KMSG_DUMP_EMERG, | 
|---|
| 28 | KMSG_DUMP_SHUTDOWN, | 
|---|
| 29 | KMSG_DUMP_MAX | 
|---|
| 30 | }; | 
|---|
| 31 |  | 
|---|
| 32 | /** | 
|---|
| 33 | * struct kmsg_dump_iter - iterator for retrieving kernel messages | 
|---|
| 34 | * @cur_seq:	Points to the oldest message to dump | 
|---|
| 35 | * @next_seq:	Points after the newest message to dump | 
|---|
| 36 | */ | 
|---|
| 37 | struct kmsg_dump_iter { | 
|---|
| 38 | u64	cur_seq; | 
|---|
| 39 | u64	next_seq; | 
|---|
| 40 | }; | 
|---|
| 41 |  | 
|---|
| 42 | /** | 
|---|
| 43 | * struct kmsg_dump_detail - kernel crash detail | 
|---|
| 44 | * @reason: reason for the crash, see kmsg_dump_reason. | 
|---|
| 45 | * @description: optional short string, to provide additional information. | 
|---|
| 46 | */ | 
|---|
| 47 |  | 
|---|
| 48 | struct kmsg_dump_detail { | 
|---|
| 49 | enum kmsg_dump_reason reason; | 
|---|
| 50 | const char *description; | 
|---|
| 51 | }; | 
|---|
| 52 |  | 
|---|
| 53 | /** | 
|---|
| 54 | * struct kmsg_dumper - kernel crash message dumper structure | 
|---|
| 55 | * @list:	Entry in the dumper list (private) | 
|---|
| 56 | * @dump:	Call into dumping code which will retrieve the data with | 
|---|
| 57 | * 		through the record iterator | 
|---|
| 58 | * @max_reason:	filter for highest reason number that should be dumped | 
|---|
| 59 | * @registered:	Flag that specifies if this is already registered | 
|---|
| 60 | */ | 
|---|
| 61 | struct kmsg_dumper { | 
|---|
| 62 | struct list_head list; | 
|---|
| 63 | void (*dump)(struct kmsg_dumper *dumper, struct kmsg_dump_detail *detail); | 
|---|
| 64 | enum kmsg_dump_reason max_reason; | 
|---|
| 65 | bool registered; | 
|---|
| 66 | }; | 
|---|
| 67 |  | 
|---|
| 68 | #ifdef CONFIG_PRINTK | 
|---|
| 69 | void kmsg_dump_desc(enum kmsg_dump_reason reason, const char *desc); | 
|---|
| 70 |  | 
|---|
| 71 | bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog, | 
|---|
| 72 | char *line, size_t size, size_t *len); | 
|---|
| 73 |  | 
|---|
| 74 | bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog, | 
|---|
| 75 | char *buf, size_t size, size_t *len_out); | 
|---|
| 76 |  | 
|---|
| 77 | void kmsg_dump_rewind(struct kmsg_dump_iter *iter); | 
|---|
| 78 |  | 
|---|
| 79 | int kmsg_dump_register(struct kmsg_dumper *dumper); | 
|---|
| 80 |  | 
|---|
| 81 | int kmsg_dump_unregister(struct kmsg_dumper *dumper); | 
|---|
| 82 |  | 
|---|
| 83 | const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason); | 
|---|
| 84 | #else | 
|---|
| 85 | static inline void kmsg_dump_desc(enum kmsg_dump_reason reason, const char *desc) | 
|---|
| 86 | { | 
|---|
| 87 | } | 
|---|
| 88 |  | 
|---|
| 89 | static inline bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog, | 
|---|
| 90 | const char *line, size_t size, size_t *len) | 
|---|
| 91 | { | 
|---|
| 92 | return false; | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|
| 95 | static inline bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog, | 
|---|
| 96 | char *buf, size_t size, size_t *len) | 
|---|
| 97 | { | 
|---|
| 98 | return false; | 
|---|
| 99 | } | 
|---|
| 100 |  | 
|---|
| 101 | static inline void kmsg_dump_rewind(struct kmsg_dump_iter *iter) | 
|---|
| 102 | { | 
|---|
| 103 | } | 
|---|
| 104 |  | 
|---|
| 105 | static inline int kmsg_dump_register(struct kmsg_dumper *dumper) | 
|---|
| 106 | { | 
|---|
| 107 | return -EINVAL; | 
|---|
| 108 | } | 
|---|
| 109 |  | 
|---|
| 110 | static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper) | 
|---|
| 111 | { | 
|---|
| 112 | return -EINVAL; | 
|---|
| 113 | } | 
|---|
| 114 |  | 
|---|
| 115 | static inline const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason) | 
|---|
| 116 | { | 
|---|
| 117 | return "Disabled"; | 
|---|
| 118 | } | 
|---|
| 119 | #endif | 
|---|
| 120 |  | 
|---|
| 121 | static inline void kmsg_dump(enum kmsg_dump_reason reason) | 
|---|
| 122 | { | 
|---|
| 123 | kmsg_dump_desc(reason, NULL); | 
|---|
| 124 | } | 
|---|
| 125 |  | 
|---|
| 126 | #endif /* _LINUX_KMSG_DUMP_H */ | 
|---|
| 127 |  | 
|---|