xref: /linux-6.15/include/linux/coredump.h (revision 200f091c)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2088e7af7SDaisuke HATAYAMA #ifndef _LINUX_COREDUMP_H
3088e7af7SDaisuke HATAYAMA #define _LINUX_COREDUMP_H
4088e7af7SDaisuke HATAYAMA 
5088e7af7SDaisuke HATAYAMA #include <linux/types.h>
6088e7af7SDaisuke HATAYAMA #include <linux/mm.h>
7088e7af7SDaisuke HATAYAMA #include <linux/fs.h>
81d46e232SRichard Weinberger #include <asm/siginfo.h>
9088e7af7SDaisuke HATAYAMA 
10a64b8908SAl Viro #ifdef CONFIG_COREDUMP
11a07279c9SJann Horn struct core_vma_metadata {
12a07279c9SJann Horn 	unsigned long start, end;
13a07279c9SJann Horn 	unsigned long flags;
14a07279c9SJann Horn 	unsigned long dump_size;
15390031c9SEric W. Biederman 	unsigned long pgoff;
16390031c9SEric W. Biederman 	struct file   *file;
17a07279c9SJann Horn };
18a07279c9SJann Horn 
19a99a3e2eSEric W. Biederman struct coredump_params {
20a99a3e2eSEric W. Biederman 	const kernel_siginfo_t *siginfo;
21a99a3e2eSEric W. Biederman 	struct file *file;
22a99a3e2eSEric W. Biederman 	unsigned long limit;
23a99a3e2eSEric W. Biederman 	unsigned long mm_flags;
248603b6f5SOleksandr Natalenko 	int cpu;
25a99a3e2eSEric W. Biederman 	loff_t written;
26a99a3e2eSEric W. Biederman 	loff_t pos;
27a99a3e2eSEric W. Biederman 	loff_t to_skip;
2895c5436aSEric W. Biederman 	int vma_count;
2995c5436aSEric W. Biederman 	size_t vma_data_size;
3095c5436aSEric W. Biederman 	struct core_vma_metadata *vma_meta;
31a99a3e2eSEric W. Biederman };
32a99a3e2eSEric W. Biederman 
334bbf9c3bSAllen Pais extern unsigned int core_file_note_size_limit;
344bbf9c3bSAllen Pais 
35088e7af7SDaisuke HATAYAMA /*
36088e7af7SDaisuke HATAYAMA  * These are the only things you should do on a core-file: use only these
37088e7af7SDaisuke HATAYAMA  * functions to write out all the necessary info.
38088e7af7SDaisuke HATAYAMA  */
39d0f1088bSAl Viro extern void dump_skip_to(struct coredump_params *cprm, unsigned long to);
40d0f1088bSAl Viro extern void dump_skip(struct coredump_params *cprm, size_t nr);
41ecc8c772SAl Viro extern int dump_emit(struct coredump_params *cprm, const void *addr, int nr);
4222a8cb82SAl Viro extern int dump_align(struct coredump_params *cprm, int align);
43afc63a97SJann Horn int dump_user_range(struct coredump_params *cprm, unsigned long start,
44afc63a97SJann Horn 		    unsigned long len);
45a78282e2SLinus Torvalds extern void do_coredump(const kernel_siginfo_t *siginfo);
46c114e994SRoman Kisel 
47c114e994SRoman Kisel /*
48c114e994SRoman Kisel  * Logging for the coredump code, ratelimited.
49c114e994SRoman Kisel  * The TGID and comm fields are added to the message.
50c114e994SRoman Kisel  */
51c114e994SRoman Kisel 
52c114e994SRoman Kisel #define __COREDUMP_PRINTK(Level, Format, ...) \
53c114e994SRoman Kisel 	do {	\
54c114e994SRoman Kisel 		char comm[TASK_COMM_LEN];	\
55*200f091cSKees Cook 		/* This will always be NUL terminated. */ \
56*200f091cSKees Cook 		memcpy(comm, current->comm, sizeof(comm)); \
57c114e994SRoman Kisel 		printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n",	\
58c114e994SRoman Kisel 			task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__);	\
59c114e994SRoman Kisel 	} while (0)	\
60c114e994SRoman Kisel 
61c114e994SRoman Kisel #define coredump_report(fmt, ...) __COREDUMP_PRINTK(KERN_INFO, fmt, ##__VA_ARGS__)
62c114e994SRoman Kisel #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__)
63c114e994SRoman Kisel 
64179899fdSAlex Kelly #else
do_coredump(const kernel_siginfo_t * siginfo)65a78282e2SLinus Torvalds static inline void do_coredump(const kernel_siginfo_t *siginfo) {}
66c114e994SRoman Kisel 
67c114e994SRoman Kisel #define coredump_report(...)
68c114e994SRoman Kisel #define coredump_report_failure(...)
69c114e994SRoman Kisel 
70179899fdSAlex Kelly #endif
71088e7af7SDaisuke HATAYAMA 
72f0bc21b2SXiaoming Ni #if defined(CONFIG_COREDUMP) && defined(CONFIG_SYSCTL)
73f0bc21b2SXiaoming Ni extern void validate_coredump_safety(void);
74f0bc21b2SXiaoming Ni #else
validate_coredump_safety(void)75f0bc21b2SXiaoming Ni static inline void validate_coredump_safety(void) {}
76f0bc21b2SXiaoming Ni #endif
77f0bc21b2SXiaoming Ni 
78088e7af7SDaisuke HATAYAMA #endif /* _LINUX_COREDUMP_H */
79