1 #include <linux/elf.h> 2 #include <linux/coredump.h> 3 #include <linux/fs.h> 4 #include <linux/mm.h> 5 6 #include <asm/elf.h> 7 8 9 Elf64_Half elf_core_extra_phdrs(void) 10 { 11 return GATE_EHDR->e_phnum; 12 } 13 14 int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) 15 { 16 const struct elf_phdr *const gate_phdrs = 17 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 18 int i; 19 Elf64_Off ofs = 0; 20 21 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 22 struct elf_phdr phdr = gate_phdrs[i]; 23 24 if (phdr.p_type == PT_LOAD) { 25 phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); 26 phdr.p_filesz = phdr.p_memsz; 27 if (ofs == 0) { 28 ofs = phdr.p_offset = offset; 29 offset += phdr.p_filesz; 30 } else { 31 phdr.p_offset = ofs; 32 } 33 } else { 34 phdr.p_offset += ofs; 35 } 36 phdr.p_paddr = 0; /* match other core phdrs */ 37 if (!dump_emit(cprm, &phdr, sizeof(phdr))) 38 return 0; 39 } 40 return 1; 41 } 42 43 int elf_core_write_extra_data(struct coredump_params *cprm) 44 { 45 const struct elf_phdr *const gate_phdrs = 46 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 47 int i; 48 49 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 50 if (gate_phdrs[i].p_type == PT_LOAD) { 51 void *addr = (void *)gate_phdrs[i].p_vaddr; 52 size_t memsz = PAGE_ALIGN(gate_phdrs[i].p_memsz); 53 54 if (!dump_emit(cprm, addr, memsz)) 55 return 0; 56 break; 57 } 58 } 59 return 1; 60 } 61 62 size_t elf_core_extra_data_size(void) 63 { 64 const struct elf_phdr *const gate_phdrs = 65 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 66 int i; 67 size_t size = 0; 68 69 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 70 if (gate_phdrs[i].p_type == PT_LOAD) { 71 size += PAGE_ALIGN(gate_phdrs[i].p_memsz); 72 break; 73 } 74 } 75 return size; 76 } 77