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 file *file, loff_t offset, size_t *size, 15 unsigned long limit) 16 { 17 const struct elf_phdr *const gate_phdrs = 18 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 19 int i; 20 Elf64_Off ofs = 0; 21 22 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 23 struct elf_phdr phdr = gate_phdrs[i]; 24 25 if (phdr.p_type == PT_LOAD) { 26 phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); 27 phdr.p_filesz = phdr.p_memsz; 28 if (ofs == 0) { 29 ofs = phdr.p_offset = offset; 30 offset += phdr.p_filesz; 31 } else { 32 phdr.p_offset = ofs; 33 } 34 } else { 35 phdr.p_offset += ofs; 36 } 37 phdr.p_paddr = 0; /* match other core phdrs */ 38 *size += sizeof(phdr); 39 if (*size > limit || !dump_write(file, &phdr, sizeof(phdr))) 40 return 0; 41 } 42 return 1; 43 } 44 45 int elf_core_write_extra_data(struct file *file, size_t *size, 46 unsigned long limit) 47 { 48 const struct elf_phdr *const gate_phdrs = 49 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 50 int i; 51 52 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 53 if (gate_phdrs[i].p_type == PT_LOAD) { 54 void *addr = (void *)gate_phdrs[i].p_vaddr; 55 size_t memsz = PAGE_ALIGN(gate_phdrs[i].p_memsz); 56 57 *size += memsz; 58 if (*size > limit || !dump_write(file, addr, memsz)) 59 return 0; 60 break; 61 } 62 } 63 return 1; 64 } 65 66 size_t elf_core_extra_data_size(void) 67 { 68 const struct elf_phdr *const gate_phdrs = 69 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); 70 int i; 71 size_t size = 0; 72 73 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { 74 if (gate_phdrs[i].p_type == PT_LOAD) { 75 size += PAGE_ALIGN(gate_phdrs[i].p_memsz); 76 break; 77 } 78 } 79 return size; 80 } 81