1 /* 2 * linux/include/kmsg_dump.h 3 * 4 * Copyright (C) 2009 Net Insight AB 5 * 6 * Author: Simon Kagstrom <[email protected]> 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 }; 30 31 /** 32 * struct kmsg_dumper - kernel crash message dumper structure 33 * @list: Entry in the dumper list (private) 34 * @dump: Call into dumping code which will retrieve the data with 35 * through the record iterator 36 * @max_reason: filter for highest reason number that should be dumped 37 * @registered: Flag that specifies if this is already registered 38 */ 39 struct kmsg_dumper { 40 struct list_head list; 41 void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); 42 enum kmsg_dump_reason max_reason; 43 bool active; 44 bool registered; 45 46 /* private state of the kmsg iterator */ 47 u32 cur_idx; 48 u32 next_idx; 49 u64 cur_seq; 50 u64 next_seq; 51 }; 52 53 #ifdef CONFIG_PRINTK 54 void kmsg_dump(enum kmsg_dump_reason reason); 55 56 bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, 57 char *line, size_t size, size_t *len); 58 59 bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, 60 char *line, size_t size, size_t *len); 61 62 bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, 63 char *buf, size_t size, size_t *len); 64 65 void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper); 66 67 void kmsg_dump_rewind(struct kmsg_dumper *dumper); 68 69 int kmsg_dump_register(struct kmsg_dumper *dumper); 70 71 int kmsg_dump_unregister(struct kmsg_dumper *dumper); 72 #else 73 static inline void kmsg_dump(enum kmsg_dump_reason reason) 74 { 75 } 76 77 static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, 78 bool syslog, const char *line, 79 size_t size, size_t *len) 80 { 81 return false; 82 } 83 84 static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, 85 const char *line, size_t size, size_t *len) 86 { 87 return false; 88 } 89 90 static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, 91 char *buf, size_t size, size_t *len) 92 { 93 return false; 94 } 95 96 static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) 97 { 98 } 99 100 static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper) 101 { 102 } 103 104 static inline int kmsg_dump_register(struct kmsg_dumper *dumper) 105 { 106 return -EINVAL; 107 } 108 109 static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper) 110 { 111 return -EINVAL; 112 } 113 #endif 114 115 #endif /* _LINUX_KMSG_DUMP_H */ 116