xref: /freebsd/sys/sys/ucoredump.h (revision ce51f79913aa28a32217a424845a2649019535af)
1 /*
2  *
3  * Copyright (c) 2015 Mark Johnston <markj@FreeBSD.org>
4  * Copyright (c) 2025 Kyle Evans <kevans@FreeBSD.org>
5  *
6  * SPDX-License-Identifier: BSD-2-Clause
7  *
8  */
9 
10 #ifndef _SYS_UCOREDUMP_H_
11 #define _SYS_UCOREDUMP_H_
12 
13 #ifdef _KERNEL
14 
15 #include <sys/_uio.h>
16 #include <sys/blockcount.h>
17 #include <sys/queue.h>
18 
19 /* Coredump output parameters. */
20 struct coredump_params;
21 struct coredump_writer;
22 struct thread;
23 struct ucred;
24 
25 typedef int coredump_init_fn(const struct coredump_writer *,
26     const struct coredump_params *);
27 typedef int coredump_write_fn(const struct coredump_writer *, const void *, size_t,
28     off_t, enum uio_seg, struct ucred *, size_t *, struct thread *);
29 typedef int coredump_extend_fn(const struct coredump_writer *, off_t,
30     struct ucred *);
31 
32 struct coredump_vnode_ctx {
33 	struct vnode	*vp;
34 	struct ucred	*fcred;
35 };
36 
37 coredump_write_fn core_vn_write;
38 coredump_extend_fn core_vn_extend;
39 
40 struct coredump_writer {
41 	void			*ctx;
42 	coredump_init_fn	*init_fn;
43 	coredump_write_fn	*write_fn;
44 	coredump_extend_fn	*extend_fn;
45 };
46 
47 struct coredump_params {
48 	off_t		offset;
49 	struct ucred	*active_cred;
50 	struct thread	*td;
51 	const struct coredump_writer	*cdw;
52 	struct compressor *comp;
53 };
54 
55 #define   CORE_BUF_SIZE   (16 * 1024)
56 
57 int core_write(struct coredump_params *, const void *, size_t, off_t,
58     enum uio_seg, size_t *);
59 int core_output(char *, size_t, off_t, struct coredump_params *, void *);
60 int sbuf_drain_core_output(void *, const char *, int);
61 
62 extern int coredump_pack_fileinfo;
63 extern int coredump_pack_vmmapinfo;
64 
65 extern int compress_user_cores;
66 extern int compress_user_cores_level;
67 
68 typedef int coredumper_probe_fn(struct thread *);
69 
70 /*
71  * Some arbitrary values for coredumper probes to return.  The highest priority
72  * we can find wins.  It's somewhat expected that a coredumper may want to bid
73  * differently based on the process in question.  Note that probe functions will
74  * be called with the proc lock held, so they must not sleep.
75  */
76 #define	COREDUMPER_NOMATCH		(-1)	/* Decline to touch it */
77 #define	COREDUMPER_GENERIC		(0)	/* I handle coredumps */
78 #define	COREDUMPER_SPECIAL		(50)	/* Special handler */
79 #define	COREDUMPER_HIGH_PRIORITY	(100)	/* High-priority handler */
80 
81 /*
82  * The handle functions will be called with the proc lock held, and should
83  * return with the proc lock dropped.
84  */
85 typedef int coredumper_handle_fn(struct thread *, off_t);
86 
87 struct coredumper {
88 	SLIST_ENTRY(coredumper)	 cd_entry;
89 	const char		*cd_name;
90 	coredumper_probe_fn	*cd_probe;
91 	coredumper_handle_fn	*cd_handle;
92 	blockcount_t		 cd_refcount;
93 };
94 
95 void coredumper_register(struct coredumper *);
96 void coredumper_unregister(struct coredumper *);
97 
98 #endif	/* _KERNEL */
99 #endif	/* _SYS_UCOREDUMP_H_ */
100