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