xref: /linux-6.15/include/linux/kmsg_dump.h (revision 246f6f2f)
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,
2804c6862cSSeiji Aguchi 	KMSG_DUMP_RESTART,
2904c6862cSSeiji Aguchi 	KMSG_DUMP_HALT,
3004c6862cSSeiji Aguchi 	KMSG_DUMP_POWEROFF,
31456b565cSSimon Kagstrom };
32456b565cSSimon Kagstrom 
33456b565cSSimon Kagstrom /**
34456b565cSSimon Kagstrom  * struct kmsg_dumper - kernel crash message dumper structure
35456b565cSSimon Kagstrom  * @list:	Entry in the dumper list (private)
36e2ae715dSKay Sievers  * @dump:	Call into dumping code which will retrieve the data with
37e2ae715dSKay Sievers  * 		through the record iterator
38e2ae715dSKay Sievers  * @max_reason:	filter for highest reason number that should be dumped
39456b565cSSimon Kagstrom  * @registered:	Flag that specifies if this is already registered
40456b565cSSimon Kagstrom  */
41456b565cSSimon Kagstrom struct kmsg_dumper {
42456b565cSSimon Kagstrom 	struct list_head list;
43e2ae715dSKay Sievers 	void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason);
44e2ae715dSKay Sievers 	enum kmsg_dump_reason max_reason;
45e2ae715dSKay Sievers 	bool active;
46e2ae715dSKay Sievers 	bool registered;
47e2ae715dSKay Sievers 
48e2ae715dSKay Sievers 	/* private state of the kmsg iterator */
49e2ae715dSKay Sievers 	u32 cur_idx;
50e2ae715dSKay Sievers 	u32 next_idx;
51e2ae715dSKay Sievers 	u64 cur_seq;
52e2ae715dSKay Sievers 	u64 next_seq;
53456b565cSSimon Kagstrom };
54456b565cSSimon Kagstrom 
55595dd3d8SRandy Dunlap #ifdef CONFIG_PRINTK
56456b565cSSimon Kagstrom void kmsg_dump(enum kmsg_dump_reason reason);
57456b565cSSimon Kagstrom 
58e2ae715dSKay Sievers bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
59e2ae715dSKay Sievers 			char *line, size_t size, size_t *len);
60e2ae715dSKay Sievers 
61e2ae715dSKay Sievers bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
62e2ae715dSKay Sievers 			  char *buf, size_t size, size_t *len);
63e2ae715dSKay Sievers 
64e2ae715dSKay Sievers void kmsg_dump_rewind(struct kmsg_dumper *dumper);
65e2ae715dSKay Sievers 
66456b565cSSimon Kagstrom int kmsg_dump_register(struct kmsg_dumper *dumper);
67456b565cSSimon Kagstrom 
68456b565cSSimon Kagstrom int kmsg_dump_unregister(struct kmsg_dumper *dumper);
69595dd3d8SRandy Dunlap #else
70595dd3d8SRandy Dunlap static inline void kmsg_dump(enum kmsg_dump_reason reason)
71595dd3d8SRandy Dunlap {
72595dd3d8SRandy Dunlap }
73595dd3d8SRandy Dunlap 
74*246f6f2fSKay Sievers static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
75e2ae715dSKay Sievers 				const char *line, size_t size, size_t *len)
76e2ae715dSKay Sievers {
77e2ae715dSKay Sievers 	return false;
78e2ae715dSKay Sievers }
79e2ae715dSKay Sievers 
80*246f6f2fSKay Sievers static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
81e2ae715dSKay Sievers 					char *buf, size_t size, size_t *len)
82e2ae715dSKay Sievers {
83e2ae715dSKay Sievers 	return false;
84e2ae715dSKay Sievers }
85e2ae715dSKay Sievers 
86*246f6f2fSKay Sievers static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper)
87e2ae715dSKay Sievers {
88e2ae715dSKay Sievers }
89e2ae715dSKay Sievers 
90595dd3d8SRandy Dunlap static inline int kmsg_dump_register(struct kmsg_dumper *dumper)
91595dd3d8SRandy Dunlap {
92595dd3d8SRandy Dunlap 	return -EINVAL;
93595dd3d8SRandy Dunlap }
94595dd3d8SRandy Dunlap 
95595dd3d8SRandy Dunlap static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper)
96595dd3d8SRandy Dunlap {
97595dd3d8SRandy Dunlap 	return -EINVAL;
98595dd3d8SRandy Dunlap }
99595dd3d8SRandy Dunlap #endif
100456b565cSSimon Kagstrom 
101456b565cSSimon Kagstrom #endif /* _LINUX_KMSG_DUMP_H */
102