master
  1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 2002 Poul-Henning Kamp
  5 * Copyright (c) 2002 Networks Associates Technology, Inc.
  6 * All rights reserved.
  7 *
  8 * This software was developed for the FreeBSD Project by Poul-Henning Kamp
  9 * and NAI Labs, the Security Research Division of Network Associates, Inc.
 10 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
 11 * DARPA CHATS research program.
 12 *
 13 * Redistribution and use in source and binary forms, with or without
 14 * modification, are permitted provided that the following conditions
 15 * are met:
 16 * 1. Redistributions of source code must retain the above copyright
 17 *    notice, this list of conditions and the following disclaimer.
 18 * 2. Redistributions in binary form must reproduce the above copyright
 19 *    notice, this list of conditions and the following disclaimer in the
 20 *    documentation and/or other materials provided with the distribution.
 21 * 3. The names of the authors may not be used to endorse or promote
 22 *    products derived from this software without specific prior written
 23 *    permission.
 24 *
 25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 28 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 35 * SUCH DAMAGE.
 36 */
 37
 38#ifndef _SYS_KERNELDUMP_H
 39#define _SYS_KERNELDUMP_H
 40
 41#include <sys/param.h>
 42#include <sys/conf.h>
 43
 44#include <machine/endian.h>
 45
 46#if BYTE_ORDER == LITTLE_ENDIAN
 47#define	dtoh32(x)	__bswap32(x)
 48#define	dtoh64(x)	__bswap64(x)
 49#define	htod32(x)	__bswap32(x)
 50#define	htod64(x)	__bswap64(x)
 51#elif BYTE_ORDER == BIG_ENDIAN
 52#define	dtoh32(x)	(x)
 53#define	dtoh64(x)	(x)
 54#define	htod32(x)	(x)
 55#define	htod64(x)	(x)
 56#endif
 57
 58#define	KERNELDUMP_COMP_NONE		0
 59#define	KERNELDUMP_COMP_GZIP		1
 60#define	KERNELDUMP_COMP_ZSTD		2
 61
 62#define	KERNELDUMP_ENC_NONE		0
 63#define	KERNELDUMP_ENC_AES_256_CBC	1
 64#define	KERNELDUMP_ENC_CHACHA20		2
 65
 66#define	KERNELDUMP_BUFFER_SIZE		4096
 67#define	KERNELDUMP_IV_MAX_SIZE		32
 68#define	KERNELDUMP_KEY_MAX_SIZE		64
 69#define	KERNELDUMP_ENCKEY_MAX_SIZE	(16384 / 8)
 70
 71/*
 72 * All uintX_t fields are in dump byte order, which is the same as
 73 * network byte order. Use the macros defined above to read or
 74 * write the fields.
 75 */
 76struct kerneldumpheader {
 77	char		magic[20];
 78#define	KERNELDUMPMAGIC		"FreeBSD Kernel Dump"
 79#define	TEXTDUMPMAGIC		"FreeBSD Text Dump"
 80#define	KERNELDUMPMAGIC_CLEARED	"Cleared Kernel Dump"
 81	char		architecture[12];
 82	uint32_t	version;
 83#define	KERNELDUMPVERSION		4
 84#define	KERNELDUMP_TEXT_VERSION		4
 85	uint32_t	architectureversion;
 86#define	KERNELDUMP_AARCH64_VERSION	1
 87#define	KERNELDUMP_AMD64_VERSION	2
 88#define	KERNELDUMP_ARM_VERSION		1
 89#define	KERNELDUMP_I386_VERSION		2
 90#define	KERNELDUMP_MIPS_VERSION		1
 91#define	KERNELDUMP_POWERPC_VERSION	1
 92#define	KERNELDUMP_RISCV_VERSION	1
 93#define	KERNELDUMP_SPARC64_VERSION	1
 94	uint64_t	dumplength;		/* excl headers */
 95	uint64_t	dumptime;
 96	uint32_t	dumpkeysize;
 97	uint32_t	blocksize;
 98	char		hostname[64];
 99	char		versionstring[192];
100	char		panicstring[175];
101	uint8_t		compression;
102	uint64_t	dumpextent;
103	char		unused[4];
104	uint32_t	parity;
105};
106
107struct kerneldumpkey {
108	uint8_t		kdk_encryption;
109	uint8_t		kdk_iv[KERNELDUMP_IV_MAX_SIZE];
110	uint32_t	kdk_encryptedkeysize;
111	uint8_t		kdk_encryptedkey[];
112} __packed;
113
114/*
115 * Parity calculation is endian insensitive.
116 */
117static __inline u_int32_t
118kerneldump_parity(struct kerneldumpheader *kdhp)
119{
120	uint32_t *up, parity;
121	u_int i;
122
123	up = (uint32_t *)kdhp;
124	parity = 0;
125	for (i = 0; i < sizeof *kdhp; i += sizeof *up)
126		parity ^= *up++;
127	return (parity);
128}
129
130#ifdef _KERNEL
131struct dump_pa {
132	vm_paddr_t pa_start;
133	vm_paddr_t pa_size;
134};
135
136struct minidumpstate {
137	struct msgbuf	*msgbufp;
138	struct bitset	*dump_bitset;
139};
140
141int minidumpsys(struct dumperinfo *, bool);
142int dumpsys_generic(struct dumperinfo *);
143
144void dumpsys_map_chunk(vm_paddr_t, size_t, void **);
145typedef int dumpsys_callback_t(struct dump_pa *, int, void *);
146int dumpsys_foreach_chunk(dumpsys_callback_t, void *);
147int dumpsys_cb_dumpdata(struct dump_pa *, int, void *);
148int dumpsys_buf_seek(struct dumperinfo *, size_t);
149int dumpsys_buf_write(struct dumperinfo *, char *, size_t);
150int dumpsys_buf_flush(struct dumperinfo *);
151
152void dumpsys_gen_pa_init(void);
153struct dump_pa *dumpsys_gen_pa_next(struct dump_pa *);
154void dumpsys_gen_wbinv_all(void);
155void dumpsys_gen_unmap_chunk(vm_paddr_t, size_t, void *);
156int dumpsys_gen_write_aux_headers(struct dumperinfo *);
157
158void dumpsys_pb_init(uint64_t);
159void dumpsys_pb_progress(size_t);
160
161extern int do_minidump;
162
163int livedump_start(int, int, uint8_t);
164
165/* Live minidump events */
166typedef void (*livedump_start_fn)(void *arg, int *errorp);
167typedef void (*livedump_dump_fn)(void *arg, void *virtual, off_t offset,
168    size_t len, int *errorp);
169typedef void (*livedump_finish_fn)(void *arg);
170EVENTHANDLER_DECLARE(livedumper_start, livedump_start_fn);
171EVENTHANDLER_DECLARE(livedumper_dump, livedump_dump_fn);
172EVENTHANDLER_DECLARE(livedumper_finish, livedump_finish_fn);
173
174#endif
175
176#endif /* _SYS_KERNELDUMP_H */