switch elf_core_write_extra_phdrs() to dump_emit()
[cascardo/linux.git] / arch / x86 / um / elfcore.c
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 Elf32_Half elf_core_extra_phdrs(void)
10 {
11         return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0;
12 }
13
14 int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
15 {
16         if ( vsyscall_ehdr ) {
17                 const struct elfhdr *const ehdrp =
18                         (struct elfhdr *) vsyscall_ehdr;
19                 const struct elf_phdr *const phdrp =
20                         (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
21                 int i;
22                 Elf32_Off ofs = 0;
23
24                 for (i = 0; i < ehdrp->e_phnum; ++i) {
25                         struct elf_phdr phdr = phdrp[i];
26
27                         if (phdr.p_type == PT_LOAD) {
28                                 ofs = phdr.p_offset = offset;
29                                 offset += phdr.p_filesz;
30                         } else {
31                                 phdr.p_offset += ofs;
32                         }
33                         phdr.p_paddr = 0; /* match other core phdrs */
34                         if (!dump_emit(cprm, &phdr, sizeof(phdr)))
35                                 return 0;
36                 }
37         }
38         return 1;
39 }
40
41 int elf_core_write_extra_data(struct file *file, size_t *size,
42                               unsigned long limit)
43 {
44         if ( vsyscall_ehdr ) {
45                 const struct elfhdr *const ehdrp =
46                         (struct elfhdr *) vsyscall_ehdr;
47                 const struct elf_phdr *const phdrp =
48                         (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
49                 int i;
50
51                 for (i = 0; i < ehdrp->e_phnum; ++i) {
52                         if (phdrp[i].p_type == PT_LOAD) {
53                                 void *addr = (void *) phdrp[i].p_vaddr;
54                                 size_t filesz = phdrp[i].p_filesz;
55
56                                 *size += filesz;
57                                 if (*size > limit
58                                     || !dump_write(file, addr, filesz))
59                                         return 0;
60                         }
61                 }
62         }
63         return 1;
64 }
65
66 size_t elf_core_extra_data_size(void)
67 {
68         if ( vsyscall_ehdr ) {
69                 const struct elfhdr *const ehdrp =
70                         (struct elfhdr *)vsyscall_ehdr;
71                 const struct elf_phdr *const phdrp =
72                         (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
73                 int i;
74
75                 for (i = 0; i < ehdrp->e_phnum; ++i)
76                         if (phdrp[i].p_type == PT_LOAD)
77                                 return (size_t) phdrp[i].p_filesz;
78         }
79         return 0;
80 }