xref: /openbmc/linux/arch/ia64/kernel/elfcore.c (revision 842b6b16)
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