2017-11-01 15:07:57 +01:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2010-03-05 13:44:06 -08:00
|
|
|
#ifndef _LINUX_COREDUMP_H
|
|
|
|
|
#define _LINUX_COREDUMP_H
|
|
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
|
#include <linux/mm.h>
|
|
|
|
|
#include <linux/fs.h>
|
2012-10-19 13:56:47 -07:00
|
|
|
#include <asm/siginfo.h>
|
2010-03-05 13:44:06 -08:00
|
|
|
|
2021-01-03 20:51:48 -05:00
|
|
|
#ifdef CONFIG_COREDUMP
|
2020-10-15 20:12:54 -07:00
|
|
|
struct core_vma_metadata {
|
|
|
|
|
unsigned long start, end;
|
2025-06-18 20:42:53 +01:00
|
|
|
vm_flags_t flags;
|
2020-10-15 20:12:54 -07:00
|
|
|
unsigned long dump_size;
|
2022-03-08 13:04:19 -06:00
|
|
|
unsigned long pgoff;
|
|
|
|
|
struct file *file;
|
2020-10-15 20:12:54 -07:00
|
|
|
};
|
|
|
|
|
|
2022-01-31 11:50:46 -06:00
|
|
|
struct coredump_params {
|
|
|
|
|
const kernel_siginfo_t *siginfo;
|
|
|
|
|
struct file *file;
|
|
|
|
|
unsigned long limit;
|
|
|
|
|
unsigned long mm_flags;
|
2022-09-03 08:43:30 +02:00
|
|
|
int cpu;
|
2022-01-31 11:50:46 -06:00
|
|
|
loff_t written;
|
|
|
|
|
loff_t pos;
|
|
|
|
|
loff_t to_skip;
|
2022-03-08 12:55:29 -06:00
|
|
|
int vma_count;
|
|
|
|
|
size_t vma_data_size;
|
|
|
|
|
struct core_vma_metadata *vma_meta;
|
2025-04-14 15:55:07 +02:00
|
|
|
struct pid *pid;
|
2022-01-31 11:50:46 -06:00
|
|
|
};
|
|
|
|
|
|
2024-05-06 19:37:00 +00:00
|
|
|
extern unsigned int core_file_note_size_limit;
|
|
|
|
|
|
2010-03-05 13:44:06 -08:00
|
|
|
/*
|
|
|
|
|
* These are the only things you should do on a core-file: use only these
|
|
|
|
|
* functions to write out all the necessary info.
|
|
|
|
|
*/
|
2020-03-08 09:16:37 -04:00
|
|
|
extern void dump_skip_to(struct coredump_params *cprm, unsigned long to);
|
|
|
|
|
extern void dump_skip(struct coredump_params *cprm, size_t nr);
|
2013-10-05 15:32:35 -04:00
|
|
|
extern int dump_emit(struct coredump_params *cprm, const void *addr, int nr);
|
2013-10-08 11:05:01 -04:00
|
|
|
extern int dump_align(struct coredump_params *cprm, int align);
|
2020-10-15 20:12:46 -07:00
|
|
|
int dump_user_range(struct coredump_params *cprm, unsigned long start,
|
|
|
|
|
unsigned long len);
|
2025-06-12 15:25:23 +02:00
|
|
|
extern void vfs_coredump(const kernel_siginfo_t *siginfo);
|
2024-07-18 11:27:24 -07:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Logging for the coredump code, ratelimited.
|
|
|
|
|
* The TGID and comm fields are added to the message.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#define __COREDUMP_PRINTK(Level, Format, ...) \
|
|
|
|
|
do { \
|
|
|
|
|
char comm[TASK_COMM_LEN]; \
|
2024-09-28 14:08:31 -07:00
|
|
|
/* This will always be NUL terminated. */ \
|
|
|
|
|
memcpy(comm, current->comm, sizeof(comm)); \
|
2024-07-18 11:27:24 -07:00
|
|
|
printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n", \
|
|
|
|
|
task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__); \
|
|
|
|
|
} while (0) \
|
|
|
|
|
|
|
|
|
|
#define coredump_report(fmt, ...) __COREDUMP_PRINTK(KERN_INFO, fmt, ##__VA_ARGS__)
|
|
|
|
|
#define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__)
|
|
|
|
|
|
2012-10-04 17:15:24 -07:00
|
|
|
#else
|
2025-06-12 15:25:23 +02:00
|
|
|
static inline void vfs_coredump(const kernel_siginfo_t *siginfo) {}
|
2024-07-18 11:27:24 -07:00
|
|
|
|
|
|
|
|
#define coredump_report(...)
|
|
|
|
|
#define coredump_report_failure(...)
|
|
|
|
|
|
2012-10-04 17:15:24 -07:00
|
|
|
#endif
|
2010-03-05 13:44:06 -08:00
|
|
|
|
2022-01-21 22:13:38 -08:00
|
|
|
#if defined(CONFIG_COREDUMP) && defined(CONFIG_SYSCTL)
|
|
|
|
|
extern void validate_coredump_safety(void);
|
|
|
|
|
#else
|
|
|
|
|
static inline void validate_coredump_safety(void) {}
|
|
|
|
|
#endif
|
|
|
|
|
|
2010-03-05 13:44:06 -08:00
|
|
|
#endif /* _LINUX_COREDUMP_H */
|