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