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