xref: /openbmc/linux/include/linux/elfcore.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_ELFCORE_H
31da177e4SLinus Torvalds #define _LINUX_ELFCORE_H
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds #include <linux/user.h>
6187f1882SPaul Gortmaker #include <linux/bug.h>
768db0cf1SIngo Molnar #include <linux/sched/task_stack.h>
81e6b57d6SAl Viro #include <linux/types.h>
91e6b57d6SAl Viro #include <linux/signal.h>
101e6b57d6SAl Viro #include <linux/time.h>
111e6b57d6SAl Viro #include <linux/ptrace.h>
121e6b57d6SAl Viro #include <linux/fs.h>
131e6b57d6SAl Viro #include <linux/elf.h>
141da177e4SLinus Torvalds 
15506f21c5SAl Viro struct coredump_params;
16506f21c5SAl Viro 
171e6b57d6SAl Viro struct elf_siginfo
181e6b57d6SAl Viro {
191e6b57d6SAl Viro 	int	si_signo;			/* signal number */
201e6b57d6SAl Viro 	int	si_code;			/* extra code */
211e6b57d6SAl Viro 	int	si_errno;			/* errno */
221e6b57d6SAl Viro };
231e6b57d6SAl Viro 
241e6b57d6SAl Viro /*
251e6b57d6SAl Viro  * Definitions to generate Intel SVR4-like core files.
261e6b57d6SAl Viro  * These mostly have the same names as the SVR4 types with "elf_"
271e6b57d6SAl Viro  * tacked on the front to prevent clashes with linux definitions,
281e6b57d6SAl Viro  * and the typedef forms have been avoided.  This is mostly like
291e6b57d6SAl Viro  * the SVR4 structure, but more Linuxy, with things that Linux does
301e6b57d6SAl Viro  * not support and which gdb doesn't really use excluded.
311e6b57d6SAl Viro  */
32f2485a2dSAl Viro struct elf_prstatus_common
331e6b57d6SAl Viro {
341e6b57d6SAl Viro 	struct elf_siginfo pr_info;	/* Info associated with signal */
351e6b57d6SAl Viro 	short	pr_cursig;		/* Current signal */
361e6b57d6SAl Viro 	unsigned long pr_sigpend;	/* Set of pending signals */
371e6b57d6SAl Viro 	unsigned long pr_sighold;	/* Set of held signals */
381e6b57d6SAl Viro 	pid_t	pr_pid;
391e6b57d6SAl Viro 	pid_t	pr_ppid;
401e6b57d6SAl Viro 	pid_t	pr_pgrp;
411e6b57d6SAl Viro 	pid_t	pr_sid;
421e6b57d6SAl Viro 	struct __kernel_old_timeval pr_utime;	/* User time */
431e6b57d6SAl Viro 	struct __kernel_old_timeval pr_stime;	/* System time */
441e6b57d6SAl Viro 	struct __kernel_old_timeval pr_cutime;	/* Cumulative user time */
451e6b57d6SAl Viro 	struct __kernel_old_timeval pr_cstime;	/* Cumulative system time */
46f2485a2dSAl Viro };
47f2485a2dSAl Viro 
48f2485a2dSAl Viro struct elf_prstatus
49f2485a2dSAl Viro {
50f2485a2dSAl Viro 	struct elf_prstatus_common common;
511e6b57d6SAl Viro 	elf_gregset_t pr_reg;	/* GP registers */
521e6b57d6SAl Viro 	int pr_fpvalid;		/* True if math co-processor being used.  */
531e6b57d6SAl Viro };
541e6b57d6SAl Viro 
551e6b57d6SAl Viro #define ELF_PRARGSZ	(80)	/* Number of chars for args */
561e6b57d6SAl Viro 
571e6b57d6SAl Viro struct elf_prpsinfo
581e6b57d6SAl Viro {
591e6b57d6SAl Viro 	char	pr_state;	/* numeric process state */
601e6b57d6SAl Viro 	char	pr_sname;	/* char for pr_state */
611e6b57d6SAl Viro 	char	pr_zomb;	/* zombie */
621e6b57d6SAl Viro 	char	pr_nice;	/* nice val */
631e6b57d6SAl Viro 	unsigned long pr_flag;	/* flags */
641e6b57d6SAl Viro 	__kernel_uid_t	pr_uid;
651e6b57d6SAl Viro 	__kernel_gid_t	pr_gid;
661e6b57d6SAl Viro 	pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;
671e6b57d6SAl Viro 	/* Lots missing */
6895af469cSYafang Shao 	/*
6995af469cSYafang Shao 	 * The hard-coded 16 is derived from TASK_COMM_LEN, but it can't be
7095af469cSYafang Shao 	 * changed as it is exposed to userspace. We'd better make it hard-coded
7195af469cSYafang Shao 	 * here.
7295af469cSYafang Shao 	 */
731e6b57d6SAl Viro 	char	pr_fname[16];	/* filename of executable */
741e6b57d6SAl Viro 	char	pr_psargs[ELF_PRARGSZ];	/* initial part of arg list */
751e6b57d6SAl Viro };
761e6b57d6SAl Viro 
elf_core_copy_regs(elf_gregset_t * elfregs,struct pt_regs * regs)771da177e4SLinus Torvalds static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *regs)
781da177e4SLinus Torvalds {
791da177e4SLinus Torvalds #ifdef ELF_CORE_COPY_REGS
801da177e4SLinus Torvalds 	ELF_CORE_COPY_REGS((*elfregs), regs)
811da177e4SLinus Torvalds #else
821da177e4SLinus Torvalds 	BUG_ON(sizeof(*elfregs) != sizeof(*regs));
831da177e4SLinus Torvalds 	*(struct pt_regs *)elfregs = *regs;
841da177e4SLinus Torvalds #endif
851da177e4SLinus Torvalds }
861da177e4SLinus Torvalds 
elf_core_copy_task_regs(struct task_struct * t,elf_gregset_t * elfregs)871da177e4SLinus Torvalds static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs)
881da177e4SLinus Torvalds {
89e9bf0cc7SParag Warudkar #if defined (ELF_CORE_COPY_TASK_REGS)
901da177e4SLinus Torvalds 	return ELF_CORE_COPY_TASK_REGS(t, elfregs);
91fcf1492dSAl Viro #else
92a65e7bfcSHui Zhu 	elf_core_copy_regs(elfregs, task_pt_regs(t));
931da177e4SLinus Torvalds #endif
941da177e4SLinus Torvalds 	return 0;
951da177e4SLinus Torvalds }
961da177e4SLinus Torvalds 
97bdbadfccSAl Viro int elf_core_copy_task_fpregs(struct task_struct *t, elf_fpregset_t *fpu);
981da177e4SLinus Torvalds 
99b62a8486SCatalin Marinas #ifdef CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS
1001fcccbacSDaisuke HATAYAMA /*
1011fcccbacSDaisuke HATAYAMA  * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out
1021fcccbacSDaisuke HATAYAMA  * extra segments containing the gate DSO contents.  Dumping its
1031fcccbacSDaisuke HATAYAMA  * contents makes post-mortem fully interpretable later without matching up
1041fcccbacSDaisuke HATAYAMA  * the same kernel and hardware config to see what PC values meant.
1051fcccbacSDaisuke HATAYAMA  * Dumping its extra ELF program headers includes all the other information
1061fcccbacSDaisuke HATAYAMA  * a debugger needs to easily find how the gate DSO was being used.
1071fcccbacSDaisuke HATAYAMA  */
108*19e183b5SCatalin Marinas extern Elf_Half elf_core_extra_phdrs(struct coredump_params *cprm);
1091fcccbacSDaisuke HATAYAMA extern int
110506f21c5SAl Viro elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset);
1111fcccbacSDaisuke HATAYAMA extern int
112aa3e7eafSAl Viro elf_core_write_extra_data(struct coredump_params *cprm);
113*19e183b5SCatalin Marinas extern size_t elf_core_extra_data_size(struct coredump_params *cprm);
1146e7b64b9SArnd Bergmann #else
elf_core_extra_phdrs(struct coredump_params * cprm)115*19e183b5SCatalin Marinas static inline Elf_Half elf_core_extra_phdrs(struct coredump_params *cprm)
1166e7b64b9SArnd Bergmann {
1176e7b64b9SArnd Bergmann 	return 0;
1186e7b64b9SArnd Bergmann }
1196e7b64b9SArnd Bergmann 
elf_core_write_extra_phdrs(struct coredump_params * cprm,loff_t offset)1206e7b64b9SArnd Bergmann static inline int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
1216e7b64b9SArnd Bergmann {
1226e7b64b9SArnd Bergmann 	return 1;
1236e7b64b9SArnd Bergmann }
1246e7b64b9SArnd Bergmann 
elf_core_write_extra_data(struct coredump_params * cprm)1256e7b64b9SArnd Bergmann static inline int elf_core_write_extra_data(struct coredump_params *cprm)
1266e7b64b9SArnd Bergmann {
1276e7b64b9SArnd Bergmann 	return 1;
1286e7b64b9SArnd Bergmann }
1296e7b64b9SArnd Bergmann 
elf_core_extra_data_size(struct coredump_params * cprm)130*19e183b5SCatalin Marinas static inline size_t elf_core_extra_data_size(struct coredump_params *cprm)
1316e7b64b9SArnd Bergmann {
1326e7b64b9SArnd Bergmann 	return 0;
1336e7b64b9SArnd Bergmann }
134b62a8486SCatalin Marinas #endif /* CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS */
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds #endif /* _LINUX_ELFCORE_H */
137