1456b565cSSimon Kagstrom /* 2456b565cSSimon Kagstrom * linux/include/kmsg_dump.h 3456b565cSSimon Kagstrom * 4456b565cSSimon Kagstrom * Copyright (C) 2009 Net Insight AB 5456b565cSSimon Kagstrom * 6456b565cSSimon Kagstrom * Author: Simon Kagstrom <[email protected]> 7456b565cSSimon Kagstrom * 8456b565cSSimon Kagstrom * This file is subject to the terms and conditions of the GNU General Public 9456b565cSSimon Kagstrom * License. See the file COPYING in the main directory of this archive 10456b565cSSimon Kagstrom * for more details. 11456b565cSSimon Kagstrom */ 12456b565cSSimon Kagstrom #ifndef _LINUX_KMSG_DUMP_H 13456b565cSSimon Kagstrom #define _LINUX_KMSG_DUMP_H 14456b565cSSimon Kagstrom 15ac562241SRandy Dunlap #include <linux/errno.h> 16456b565cSSimon Kagstrom #include <linux/list.h> 17456b565cSSimon Kagstrom 18c22ab332SMatthew Garrett /* 19c22ab332SMatthew Garrett * Keep this list arranged in rough order of priority. Anything listed after 20c22ab332SMatthew Garrett * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump 21c22ab332SMatthew Garrett * is passed to the kernel. 22c22ab332SMatthew Garrett */ 23456b565cSSimon Kagstrom enum kmsg_dump_reason { 24e2ae715dSKay Sievers KMSG_DUMP_UNDEF, 25456b565cSSimon Kagstrom KMSG_DUMP_PANIC, 26c22ab332SMatthew Garrett KMSG_DUMP_OOPS, 27c22ab332SMatthew Garrett KMSG_DUMP_EMERG, 286d3cf962SKees Cook KMSG_DUMP_SHUTDOWN, 29b1f6f161SPavel Tatashin KMSG_DUMP_MAX 30456b565cSSimon Kagstrom }; 31456b565cSSimon Kagstrom 32456b565cSSimon Kagstrom /** 33456b565cSSimon Kagstrom * struct kmsg_dumper - kernel crash message dumper structure 34456b565cSSimon Kagstrom * @list: Entry in the dumper list (private) 35e2ae715dSKay Sievers * @dump: Call into dumping code which will retrieve the data with 36e2ae715dSKay Sievers * through the record iterator 37e2ae715dSKay Sievers * @max_reason: filter for highest reason number that should be dumped 38456b565cSSimon Kagstrom * @registered: Flag that specifies if this is already registered 39456b565cSSimon Kagstrom */ 40456b565cSSimon Kagstrom struct kmsg_dumper { 41456b565cSSimon Kagstrom struct list_head list; 42e2ae715dSKay Sievers void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); 43e2ae715dSKay Sievers enum kmsg_dump_reason max_reason; 44e2ae715dSKay Sievers bool active; 45e2ae715dSKay Sievers bool registered; 46e2ae715dSKay Sievers 47e2ae715dSKay Sievers /* private state of the kmsg iterator */ 48e2ae715dSKay Sievers u32 cur_idx; 49e2ae715dSKay Sievers u32 next_idx; 50e2ae715dSKay Sievers u64 cur_seq; 51e2ae715dSKay Sievers u64 next_seq; 52456b565cSSimon Kagstrom }; 53456b565cSSimon Kagstrom 54595dd3d8SRandy Dunlap #ifdef CONFIG_PRINTK 55456b565cSSimon Kagstrom void kmsg_dump(enum kmsg_dump_reason reason); 56456b565cSSimon Kagstrom 57533827c9SAnton Vorontsov bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, 58533827c9SAnton Vorontsov char *line, size_t size, size_t *len); 59533827c9SAnton Vorontsov 60e2ae715dSKay Sievers bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, 61e2ae715dSKay Sievers char *line, size_t size, size_t *len); 62e2ae715dSKay Sievers 63e2ae715dSKay Sievers bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, 64e2ae715dSKay Sievers char *buf, size_t size, size_t *len); 65e2ae715dSKay Sievers 66533827c9SAnton Vorontsov void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper); 67533827c9SAnton Vorontsov 68e2ae715dSKay Sievers void kmsg_dump_rewind(struct kmsg_dumper *dumper); 69e2ae715dSKay Sievers 70456b565cSSimon Kagstrom int kmsg_dump_register(struct kmsg_dumper *dumper); 71456b565cSSimon Kagstrom 72456b565cSSimon Kagstrom int kmsg_dump_unregister(struct kmsg_dumper *dumper); 73*fb13cb8aSKees Cook 74*fb13cb8aSKees Cook const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason); 75595dd3d8SRandy Dunlap #else 76595dd3d8SRandy Dunlap static inline void kmsg_dump(enum kmsg_dump_reason reason) 77595dd3d8SRandy Dunlap { 78595dd3d8SRandy Dunlap } 79595dd3d8SRandy Dunlap 80533827c9SAnton Vorontsov static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, 81533827c9SAnton Vorontsov bool syslog, const char *line, 82533827c9SAnton Vorontsov size_t size, size_t *len) 83533827c9SAnton Vorontsov { 84533827c9SAnton Vorontsov return false; 85533827c9SAnton Vorontsov } 86533827c9SAnton Vorontsov 87246f6f2fSKay Sievers static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, 88e2ae715dSKay Sievers const char *line, size_t size, size_t *len) 89e2ae715dSKay Sievers { 90e2ae715dSKay Sievers return false; 91e2ae715dSKay Sievers } 92e2ae715dSKay Sievers 93246f6f2fSKay Sievers static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, 94e2ae715dSKay Sievers char *buf, size_t size, size_t *len) 95e2ae715dSKay Sievers { 96e2ae715dSKay Sievers return false; 97e2ae715dSKay Sievers } 98e2ae715dSKay Sievers 99533827c9SAnton Vorontsov static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) 100533827c9SAnton Vorontsov { 101533827c9SAnton Vorontsov } 102533827c9SAnton Vorontsov 103246f6f2fSKay Sievers static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper) 104e2ae715dSKay Sievers { 105e2ae715dSKay Sievers } 106e2ae715dSKay Sievers 107595dd3d8SRandy Dunlap static inline int kmsg_dump_register(struct kmsg_dumper *dumper) 108595dd3d8SRandy Dunlap { 109595dd3d8SRandy Dunlap return -EINVAL; 110595dd3d8SRandy Dunlap } 111595dd3d8SRandy Dunlap 112595dd3d8SRandy Dunlap static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper) 113595dd3d8SRandy Dunlap { 114595dd3d8SRandy Dunlap return -EINVAL; 115595dd3d8SRandy Dunlap } 116*fb13cb8aSKees Cook 117*fb13cb8aSKees Cook static inline const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason) 118*fb13cb8aSKees Cook { 119*fb13cb8aSKees Cook return "Disabled"; 120*fb13cb8aSKees Cook } 121595dd3d8SRandy Dunlap #endif 122456b565cSSimon Kagstrom 123456b565cSSimon Kagstrom #endif /* _LINUX_KMSG_DUMP_H */ 124