Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/ia64/kernel/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
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
82