/* * * Copyright (c) 2015 Mark Johnston * Copyright (c) 2025 Kyle Evans * * SPDX-License-Identifier: BSD-2-Clause * */ #ifndef _SYS_UCOREDUMP_H_ #define _SYS_UCOREDUMP_H_ #ifdef _KERNEL #include #include #include /* Coredump output parameters. */ struct coredump_params; struct coredump_writer; struct thread; struct ucred; typedef int coredump_init_fn(const struct coredump_writer *, const struct coredump_params *); typedef int coredump_write_fn(const struct coredump_writer *, const void *, size_t, off_t, enum uio_seg, struct ucred *, size_t *, struct thread *); typedef int coredump_extend_fn(const struct coredump_writer *, off_t, struct ucred *); struct coredump_vnode_ctx { struct vnode *vp; struct ucred *fcred; }; coredump_write_fn core_vn_write; coredump_extend_fn core_vn_extend; struct coredump_writer { void *ctx; coredump_init_fn *init_fn; coredump_write_fn *write_fn; coredump_extend_fn *extend_fn; }; struct coredump_params { off_t offset; struct ucred *active_cred; struct thread *td; const struct coredump_writer *cdw; struct compressor *comp; }; #define CORE_BUF_SIZE (16 * 1024) int core_write(struct coredump_params *, const void *, size_t, off_t, enum uio_seg, size_t *); int core_output(char *, size_t, off_t, struct coredump_params *, void *); int sbuf_drain_core_output(void *, const char *, int); extern int coredump_pack_fileinfo; extern int coredump_pack_vmmapinfo; extern int compress_user_cores; extern int compress_user_cores_level; typedef int coredumper_probe_fn(struct thread *); /* * Some arbitrary values for coredumper probes to return. The highest priority * we can find wins. It's somewhat expected that a coredumper may want to bid * differently based on the process in question. Note that probe functions will * be called with the proc lock held, so they must not sleep. */ #define COREDUMPER_NOMATCH (-1) /* Decline to touch it */ #define COREDUMPER_GENERIC (0) /* I handle coredumps */ #define COREDUMPER_SPECIAL (50) /* Special handler */ #define COREDUMPER_HIGH_PRIORITY (100) /* High-priority handler */ /* * The handle functions will be called with the proc lock held, and should * return with the proc lock dropped. */ typedef int coredumper_handle_fn(struct thread *, off_t); struct coredumper { SLIST_ENTRY(coredumper) cd_entry; const char *cd_name; coredumper_probe_fn *cd_probe; coredumper_handle_fn *cd_handle; blockcount_t cd_refcount; }; void coredumper_register(struct coredumper *); void coredumper_unregister(struct coredumper *); #endif /* _KERNEL */ #endif /* _SYS_UCOREDUMP_H_ */