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. */
20struct coredump_params;
21struct coredump_writer;
22struct thread;
23struct ucred;
24
25typedef int coredump_init_fn(const struct coredump_writer *,
26 const struct coredump_params *);
27typedef int coredump_write_fn(const struct coredump_writer *, const void *, size_t,
28 off_t, enum uio_seg, struct ucred *, size_t *, struct thread *);
29typedef int coredump_extend_fn(const struct coredump_writer *, off_t,
30 struct ucred *);
31
32struct coredump_vnode_ctx {
33 struct vnode *vp;
34 struct ucred *fcred;
35};
36
37coredump_write_fn core_vn_write;
38coredump_extend_fn core_vn_extend;
39
40struct 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
47struct 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
57int core_write(struct coredump_params *, const void *, size_t, off_t,
58 enum uio_seg, size_t *);
59int core_output(char *, size_t, off_t, struct coredump_params *, void *);
60int sbuf_drain_core_output(void *, const char *, int);
61
62extern int coredump_pack_fileinfo;
63extern int coredump_pack_vmmapinfo;
64
65extern int compress_user_cores;
66extern int compress_user_cores_level;
67
68typedef 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 */
85typedef int coredumper_handle_fn(struct thread *, off_t);
86
87struct 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
95void coredumper_register(struct coredumper *);
96void coredumper_unregister(struct coredumper *);
97
98#endif /* _KERNEL */
99#endif /* _SYS_UCOREDUMP_H_ */