Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/um/sys-i386/elfcore.c
10817 views
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 file *file, loff_t offset, size_t *size,
15
unsigned long limit)
16
{
17
if ( vsyscall_ehdr ) {
18
const struct elfhdr *const ehdrp =
19
(struct elfhdr *) vsyscall_ehdr;
20
const struct elf_phdr *const phdrp =
21
(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
22
int i;
23
Elf32_Off ofs = 0;
24
25
for (i = 0; i < ehdrp->e_phnum; ++i) {
26
struct elf_phdr phdr = phdrp[i];
27
28
if (phdr.p_type == PT_LOAD) {
29
ofs = phdr.p_offset = offset;
30
offset += phdr.p_filesz;
31
} else {
32
phdr.p_offset += ofs;
33
}
34
phdr.p_paddr = 0; /* match other core phdrs */
35
*size += sizeof(phdr);
36
if (*size > limit
37
|| !dump_write(file, &phdr, sizeof(phdr)))
38
return 0;
39
}
40
}
41
return 1;
42
}
43
44
int elf_core_write_extra_data(struct file *file, size_t *size,
45
unsigned long limit)
46
{
47
if ( vsyscall_ehdr ) {
48
const struct elfhdr *const ehdrp =
49
(struct elfhdr *) vsyscall_ehdr;
50
const struct elf_phdr *const phdrp =
51
(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
52
int i;
53
54
for (i = 0; i < ehdrp->e_phnum; ++i) {
55
if (phdrp[i].p_type == PT_LOAD) {
56
void *addr = (void *) phdrp[i].p_vaddr;
57
size_t filesz = phdrp[i].p_filesz;
58
59
*size += filesz;
60
if (*size > limit
61
|| !dump_write(file, addr, filesz))
62
return 0;
63
}
64
}
65
}
66
return 1;
67
}
68
69
size_t elf_core_extra_data_size(void)
70
{
71
if ( vsyscall_ehdr ) {
72
const struct elfhdr *const ehdrp =
73
(struct elfhdr *)vsyscall_ehdr;
74
const struct elf_phdr *const phdrp =
75
(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
76
int i;
77
78
for (i = 0; i < ehdrp->e_phnum; ++i)
79
if (phdrp[i].p_type == PT_LOAD)
80
return (size_t) phdrp[i].p_filesz;
81
}
82
return 0;
83
}
84
85