xref: /linux/include/linux/kmsg_dump.h (revision a4f98765)
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 <simon.kagstrom@netinsight.net>
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 /**
33*f9f3f02dSJohn Ogness  * struct kmsg_dump_iter - iterator for retrieving kernel messages
34*f9f3f02dSJohn Ogness  * @cur_seq:	Points to the oldest message to dump
35*f9f3f02dSJohn Ogness  * @next_seq:	Points after the newest message to dump
36*f9f3f02dSJohn Ogness  */
37*f9f3f02dSJohn Ogness struct kmsg_dump_iter {
38*f9f3f02dSJohn Ogness 	u64	cur_seq;
39*f9f3f02dSJohn Ogness 	u64	next_seq;
40*f9f3f02dSJohn Ogness };
41*f9f3f02dSJohn Ogness 
42*f9f3f02dSJohn Ogness /**
43456b565cSSimon Kagstrom  * struct kmsg_dumper - kernel crash message dumper structure
44456b565cSSimon Kagstrom  * @list:	Entry in the dumper list (private)
45e2ae715dSKay Sievers  * @dump:	Call into dumping code which will retrieve the data with
46e2ae715dSKay Sievers  * 		through the record iterator
47e2ae715dSKay Sievers  * @max_reason:	filter for highest reason number that should be dumped
48456b565cSSimon Kagstrom  * @registered:	Flag that specifies if this is already registered
49456b565cSSimon Kagstrom  */
50456b565cSSimon Kagstrom struct kmsg_dumper {
51456b565cSSimon Kagstrom 	struct list_head list;
52e2ae715dSKay Sievers 	void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason);
53e2ae715dSKay Sievers 	enum kmsg_dump_reason max_reason;
54e2ae715dSKay Sievers 	bool registered;
55456b565cSSimon Kagstrom };
56456b565cSSimon Kagstrom 
57595dd3d8SRandy Dunlap #ifdef CONFIG_PRINTK
58456b565cSSimon Kagstrom void kmsg_dump(enum kmsg_dump_reason reason);
59456b565cSSimon Kagstrom 
60*f9f3f02dSJohn Ogness bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
61e2ae715dSKay Sievers 			char *line, size_t size, size_t *len);
62e2ae715dSKay Sievers 
63*f9f3f02dSJohn Ogness bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
64726b5097SJohn Ogness 			  char *buf, size_t size, size_t *len_out);
65e2ae715dSKay Sievers 
66*f9f3f02dSJohn Ogness void kmsg_dump_rewind(struct kmsg_dump_iter *iter);
67e2ae715dSKay Sievers 
68456b565cSSimon Kagstrom int kmsg_dump_register(struct kmsg_dumper *dumper);
69456b565cSSimon Kagstrom 
70456b565cSSimon Kagstrom int kmsg_dump_unregister(struct kmsg_dumper *dumper);
71fb13cb8aSKees Cook 
72fb13cb8aSKees Cook const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason);
73595dd3d8SRandy Dunlap #else
kmsg_dump(enum kmsg_dump_reason reason)74595dd3d8SRandy Dunlap static inline void kmsg_dump(enum kmsg_dump_reason reason)
75595dd3d8SRandy Dunlap {
76595dd3d8SRandy Dunlap }
77595dd3d8SRandy Dunlap 
kmsg_dump_get_line(struct kmsg_dump_iter * iter,bool syslog,const char * line,size_t size,size_t * len)78*f9f3f02dSJohn Ogness static inline bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
79e2ae715dSKay Sievers 				const char *line, size_t size, size_t *len)
80e2ae715dSKay Sievers {
81e2ae715dSKay Sievers 	return false;
82e2ae715dSKay Sievers }
83e2ae715dSKay Sievers 
kmsg_dump_get_buffer(struct kmsg_dump_iter * iter,bool syslog,char * buf,size_t size,size_t * len)84*f9f3f02dSJohn Ogness static inline bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
85e2ae715dSKay Sievers 					char *buf, size_t size, size_t *len)
86e2ae715dSKay Sievers {
87e2ae715dSKay Sievers 	return false;
88e2ae715dSKay Sievers }
89e2ae715dSKay Sievers 
kmsg_dump_rewind(struct kmsg_dump_iter * iter)90*f9f3f02dSJohn Ogness static inline void kmsg_dump_rewind(struct kmsg_dump_iter *iter)
91e2ae715dSKay Sievers {
92e2ae715dSKay Sievers }
93e2ae715dSKay Sievers 
kmsg_dump_register(struct kmsg_dumper * dumper)94595dd3d8SRandy Dunlap static inline int kmsg_dump_register(struct kmsg_dumper *dumper)
95595dd3d8SRandy Dunlap {
96595dd3d8SRandy Dunlap 	return -EINVAL;
97595dd3d8SRandy Dunlap }
98595dd3d8SRandy Dunlap 
kmsg_dump_unregister(struct kmsg_dumper * dumper)99595dd3d8SRandy Dunlap static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper)
100595dd3d8SRandy Dunlap {
101595dd3d8SRandy Dunlap 	return -EINVAL;
102595dd3d8SRandy Dunlap }
103fb13cb8aSKees Cook 
kmsg_dump_reason_str(enum kmsg_dump_reason reason)104fb13cb8aSKees Cook static inline const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason)
105fb13cb8aSKees Cook {
106fb13cb8aSKees Cook 	return "Disabled";
107fb13cb8aSKees Cook }
108595dd3d8SRandy Dunlap #endif
109456b565cSSimon Kagstrom 
110456b565cSSimon Kagstrom #endif /* _LINUX_KMSG_DUMP_H */
111