162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * linux/include/kmsg_dump.h
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2009 Net Insight AB
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Author: Simon Kagstrom <simon.kagstrom@netinsight.net>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
962306a36Sopenharmony_ci * License.  See the file COPYING in the main directory of this archive
1062306a36Sopenharmony_ci * for more details.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci#ifndef _LINUX_KMSG_DUMP_H
1362306a36Sopenharmony_ci#define _LINUX_KMSG_DUMP_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/errno.h>
1662306a36Sopenharmony_ci#include <linux/list.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/*
1962306a36Sopenharmony_ci * Keep this list arranged in rough order of priority. Anything listed after
2062306a36Sopenharmony_ci * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump
2162306a36Sopenharmony_ci * is passed to the kernel.
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_cienum kmsg_dump_reason {
2462306a36Sopenharmony_ci	KMSG_DUMP_UNDEF,
2562306a36Sopenharmony_ci	KMSG_DUMP_PANIC,
2662306a36Sopenharmony_ci	KMSG_DUMP_OOPS,
2762306a36Sopenharmony_ci	KMSG_DUMP_EMERG,
2862306a36Sopenharmony_ci	KMSG_DUMP_SHUTDOWN,
2962306a36Sopenharmony_ci	KMSG_DUMP_MAX
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/**
3362306a36Sopenharmony_ci * struct kmsg_dump_iter - iterator for retrieving kernel messages
3462306a36Sopenharmony_ci * @cur_seq:	Points to the oldest message to dump
3562306a36Sopenharmony_ci * @next_seq:	Points after the newest message to dump
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cistruct kmsg_dump_iter {
3862306a36Sopenharmony_ci	u64	cur_seq;
3962306a36Sopenharmony_ci	u64	next_seq;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/**
4362306a36Sopenharmony_ci * struct kmsg_dumper - kernel crash message dumper structure
4462306a36Sopenharmony_ci * @list:	Entry in the dumper list (private)
4562306a36Sopenharmony_ci * @dump:	Call into dumping code which will retrieve the data with
4662306a36Sopenharmony_ci * 		through the record iterator
4762306a36Sopenharmony_ci * @max_reason:	filter for highest reason number that should be dumped
4862306a36Sopenharmony_ci * @registered:	Flag that specifies if this is already registered
4962306a36Sopenharmony_ci */
5062306a36Sopenharmony_cistruct kmsg_dumper {
5162306a36Sopenharmony_ci	struct list_head list;
5262306a36Sopenharmony_ci	void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason);
5362306a36Sopenharmony_ci	enum kmsg_dump_reason max_reason;
5462306a36Sopenharmony_ci	bool registered;
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#ifdef CONFIG_PRINTK
5862306a36Sopenharmony_civoid kmsg_dump(enum kmsg_dump_reason reason);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cibool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
6162306a36Sopenharmony_ci			char *line, size_t size, size_t *len);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cibool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
6462306a36Sopenharmony_ci			  char *buf, size_t size, size_t *len_out);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_civoid kmsg_dump_rewind(struct kmsg_dump_iter *iter);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciint kmsg_dump_register(struct kmsg_dumper *dumper);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciint kmsg_dump_unregister(struct kmsg_dumper *dumper);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciconst char *kmsg_dump_reason_str(enum kmsg_dump_reason reason);
7362306a36Sopenharmony_ci#else
7462306a36Sopenharmony_cistatic inline void kmsg_dump(enum kmsg_dump_reason reason)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic inline bool kmsg_dump_get_line(struct kmsg_dump_iter *iter, bool syslog,
7962306a36Sopenharmony_ci				const char *line, size_t size, size_t *len)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	return false;
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistatic inline bool kmsg_dump_get_buffer(struct kmsg_dump_iter *iter, bool syslog,
8562306a36Sopenharmony_ci					char *buf, size_t size, size_t *len)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return false;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline void kmsg_dump_rewind(struct kmsg_dump_iter *iter)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic inline int kmsg_dump_register(struct kmsg_dumper *dumper)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	return -EINVAL;
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline int kmsg_dump_unregister(struct kmsg_dumper *dumper)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	return -EINVAL;
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic inline const char *kmsg_dump_reason_str(enum kmsg_dump_reason reason)
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	return "Disabled";
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci#endif
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#endif /* _LINUX_KMSG_DUMP_H */
111