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 /**
33f9f3f02dSJohn Ogness * struct kmsg_dump_iter - iterator for retrieving kernel messages
34f9f3f02dSJohn Ogness * @cur_seq: Points to the oldest message to dump
35f9f3f02dSJohn Ogness * @next_seq: Points after the newest message to dump
36f9f3f02dSJohn Ogness */
37f9f3f02dSJohn Ogness struct kmsg_dump_iter {
38f9f3f02dSJohn Ogness u64 cur_seq;
39f9f3f02dSJohn Ogness u64 next_seq;
40f9f3f02dSJohn Ogness };
41f9f3f02dSJohn Ogness
42f9f3f02dSJohn Ogness /**
43*e1a261baSJocelyn Falempe * struct kmsg_dump_detail - kernel crash detail
44*e1a261baSJocelyn Falempe * @reason: reason for the crash, see kmsg_dump_reason.
45*e1a261baSJocelyn Falempe * @description: optional short string, to provide additional information.
46*e1a261baSJocelyn Falempe */
47*e1a261baSJocelyn Falempe
48*e1a261baSJocelyn Falempe struct kmsg_dump_detail {
49*e1a261baSJocelyn Falempe enum kmsg_dump_reason reason;
50*e1a261baSJocelyn Falempe const char *description;
51*e1a261baSJocelyn Falempe };
52*e1a261baSJocelyn Falempe
53*e1a261baSJocelyn Falempe /**
54456b565cSSimon Kagstrom * struct kmsg_dumper - kernel crash message dumper structure
55456b565cSSimon Kagstrom * @list: Entry in the dumper list (private)
56e2ae715dSKay Sievers * @dump: Call into dumping code which will retrieve the data with
57e2ae715dSKay Sievers * through the record iterator
58e2ae715dSKay Sievers * @max_reason: filter for highest reason number that should be dumped
59456b565cSSimon Kagstrom * @registered: Flag that specifies if this is already registered
60456b565cSSimon Kagstrom */
61456b565cSSimon Kagstrom struct kmsg_dumper {
62456b565cSSimon Kagstrom struct list_head list;
63*e1a261baSJocelyn Falempe void (*dump)(struct kmsg_dumper *dumper, struct kmsg_dump_detail *detail);
64e2ae715dSKay Sievers enum kmsg_dump_reason max_reason;
65e2ae715dSKay Sievers bool registered;
66456b565cSSimon Kagstrom };
67456b565cSSimon Kagstrom
68595dd3d8SRandy Dunlap #ifdef CONFIG_PRINTK
69*e1a261baSJocelyn Falempe void kmsg_dump_desc(enum kmsg_dump_reason reason, const char *desc);
70456b565cSSimon Kagstrom
71f9f3f02dSJohn Ogness bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
72e2ae715dSKay Sievers char *line, size_t size, size_t *len);
73e2ae715dSKay Sievers
74f9f3f02dSJohn Ogness bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
75726b5097SJohn Ogness char *buf, size_t size, size_t *len_out);
76e2ae715dSKay Sievers
77f9f3f02dSJohn Ogness void kmsg_dump_rewind(struct kmsg_dump_iter *iter);
78e2ae715dSKay Sievers
79456b565cSSimon Kagstrom int kmsg_dump_register(struct kmsg_dumper *dumper);
80456b565cSSimon Kagstrom
81456b565cSSimon Kagstrom int kmsg_dump_unregister(struct kmsg_dumper *dumper);
82fb13cb8aSKees Cook
83fb13cb8aSKees Cook const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason);
84595dd3d8SRandy Dunlap #else
kmsg_dump_desc(enum kmsg_dump_reason reason,const char * desc)85*e1a261baSJocelyn Falempe static inline void kmsg_dump_desc(enum kmsg_dump_reason reason, const char *desc)
86595dd3d8SRandy Dunlap {
87595dd3d8SRandy Dunlap }
88595dd3d8SRandy Dunlap
kmsg_dump_get_line(struct kmsg_dump_iter * iter,bool syslog,const char * line,size_t size,size_t * len)89f9f3f02dSJohn Ogness static inline bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
90e2ae715dSKay Sievers const char *line, size_t size, size_t *len)
91e2ae715dSKay Sievers {
92e2ae715dSKay Sievers return false;
93e2ae715dSKay Sievers }
94e2ae715dSKay Sievers
kmsg_dump_get_buffer(struct kmsg_dump_iter * iter,bool syslog,char * buf,size_t size,size_t * len)95f9f3f02dSJohn Ogness static inline bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
96e2ae715dSKay Sievers char *buf, size_t size, size_t *len)
97e2ae715dSKay Sievers {
98e2ae715dSKay Sievers return false;
99e2ae715dSKay Sievers }
100e2ae715dSKay Sievers
kmsg_dump_rewind(struct kmsg_dump_iter * iter)101f9f3f02dSJohn Ogness static inline void kmsg_dump_rewind(struct kmsg_dump_iter *iter)
102e2ae715dSKay Sievers {
103e2ae715dSKay Sievers }
104e2ae715dSKay Sievers
kmsg_dump_register(struct kmsg_dumper * dumper)105595dd3d8SRandy Dunlap static inline int kmsg_dump_register(struct kmsg_dumper *dumper)
106595dd3d8SRandy Dunlap {
107595dd3d8SRandy Dunlap return -EINVAL;
108595dd3d8SRandy Dunlap }
109595dd3d8SRandy Dunlap
kmsg_dump_unregister(struct kmsg_dumper * dumper)110595dd3d8SRandy Dunlap static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper)
111595dd3d8SRandy Dunlap {
112595dd3d8SRandy Dunlap return -EINVAL;
113595dd3d8SRandy Dunlap }
114fb13cb8aSKees Cook
kmsg_dump_reason_str(enum kmsg_dump_reason reason)115fb13cb8aSKees Cook static inline const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason)
116fb13cb8aSKees Cook {
117fb13cb8aSKees Cook return "Disabled";
118fb13cb8aSKees Cook }
119595dd3d8SRandy Dunlap #endif
120456b565cSSimon Kagstrom
kmsg_dump(enum kmsg_dump_reason reason)121*e1a261baSJocelyn Falempe static inline void kmsg_dump(enum kmsg_dump_reason reason)
122*e1a261baSJocelyn Falempe {
123*e1a261baSJocelyn Falempe kmsg_dump_desc(reason, NULL);
124*e1a261baSJocelyn Falempe }
125*e1a261baSJocelyn Falempe
126456b565cSSimon Kagstrom #endif /* _LINUX_KMSG_DUMP_H */
127