xref: /linux-6.15/include/linux/kmsg_dump.h (revision fb13cb8a)
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