Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <linux/elf.h>
0003 #include <linux/coredump.h>
0004 #include <linux/fs.h>
0005 #include <linux/mm.h>
0006 
0007 #include <asm/elf.h>
0008 
0009 
0010 Elf32_Half elf_core_extra_phdrs(void)
0011 {
0012     return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0;
0013 }
0014 
0015 int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
0016 {
0017     if ( vsyscall_ehdr ) {
0018         const struct elfhdr *const ehdrp =
0019             (struct elfhdr *) vsyscall_ehdr;
0020         const struct elf_phdr *const phdrp =
0021             (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
0022         int i;
0023         Elf32_Off ofs = 0;
0024 
0025         for (i = 0; i < ehdrp->e_phnum; ++i) {
0026             struct elf_phdr phdr = phdrp[i];
0027 
0028             if (phdr.p_type == PT_LOAD) {
0029                 ofs = phdr.p_offset = offset;
0030                 offset += phdr.p_filesz;
0031             } else {
0032                 phdr.p_offset += ofs;
0033             }
0034             phdr.p_paddr = 0; /* match other core phdrs */
0035             if (!dump_emit(cprm, &phdr, sizeof(phdr)))
0036                 return 0;
0037         }
0038     }
0039     return 1;
0040 }
0041 
0042 int elf_core_write_extra_data(struct coredump_params *cprm)
0043 {
0044     if ( vsyscall_ehdr ) {
0045         const struct elfhdr *const ehdrp =
0046             (struct elfhdr *) vsyscall_ehdr;
0047         const struct elf_phdr *const phdrp =
0048             (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
0049         int i;
0050 
0051         for (i = 0; i < ehdrp->e_phnum; ++i) {
0052             if (phdrp[i].p_type == PT_LOAD) {
0053                 void *addr = (void *) phdrp[i].p_vaddr;
0054                 size_t filesz = phdrp[i].p_filesz;
0055                 if (!dump_emit(cprm, addr, filesz))
0056                     return 0;
0057             }
0058         }
0059     }
0060     return 1;
0061 }
0062 
0063 size_t elf_core_extra_data_size(void)
0064 {
0065     if ( vsyscall_ehdr ) {
0066         const struct elfhdr *const ehdrp =
0067             (struct elfhdr *)vsyscall_ehdr;
0068         const struct elf_phdr *const phdrp =
0069             (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
0070         int i;
0071 
0072         for (i = 0; i < ehdrp->e_phnum; ++i)
0073             if (phdrp[i].p_type == PT_LOAD)
0074                 return (size_t) phdrp[i].p_filesz;
0075     }
0076     return 0;
0077 }