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