Lines Matching defs:ehdr

24 static inline bool elf_is_elf_file(const struct elfhdr *ehdr)
26 return memcmp(ehdr->e_ident, ELFMAG, SELFMAG) == 0;
29 static uint64_t elf64_to_cpu(const struct elfhdr *ehdr, uint64_t value)
31 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
33 else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
39 static uint32_t elf32_to_cpu(const struct elfhdr *ehdr, uint32_t value)
41 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
43 else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
49 static uint16_t elf16_to_cpu(const struct elfhdr *ehdr, uint16_t value)
51 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
53 else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
63 static bool elf_is_ehdr_sane(const struct elfhdr *ehdr, size_t buf_len)
65 if (ehdr->e_phnum > 0 && ehdr->e_phentsize != sizeof(struct elf_phdr)) {
68 } else if (ehdr->e_shnum > 0 &&
69 ehdr->e_shentsize != sizeof(struct elf_shdr)) {
72 } else if (ehdr->e_ident[EI_VERSION] != EV_CURRENT ||
73 ehdr->e_version != EV_CURRENT) {
78 if (ehdr->e_phoff > 0 && ehdr->e_phnum > 0) {
85 phdr_size = sizeof(struct elf_phdr) * ehdr->e_phnum;
88 if (ehdr->e_phoff + phdr_size < ehdr->e_phoff) {
91 } else if (ehdr->e_phoff + phdr_size > buf_len) {
97 if (ehdr->e_shoff > 0 && ehdr->e_shnum > 0) {
104 shdr_size = sizeof(struct elf_shdr) * ehdr->e_shnum;
107 if (ehdr->e_shoff + shdr_size < ehdr->e_shoff) {
110 } else if (ehdr->e_shoff + shdr_size > buf_len) {
119 static int elf_read_ehdr(const char *buf, size_t len, struct elfhdr *ehdr)
128 memset(ehdr, 0, sizeof(*ehdr));
129 memcpy(ehdr->e_ident, buf, sizeof(ehdr->e_ident));
130 if (!elf_is_elf_file(ehdr)) {
135 if (ehdr->e_ident[EI_CLASS] != ELF_CLASS) {
138 } else if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB &&
139 ehdr->e_ident[EI_DATA] != ELFDATA2MSB) {
145 if (elf16_to_cpu(ehdr, buf_ehdr->e_ehsize) != sizeof(*buf_ehdr)) {
150 ehdr->e_type = elf16_to_cpu(ehdr, buf_ehdr->e_type);
151 ehdr->e_machine = elf16_to_cpu(ehdr, buf_ehdr->e_machine);
152 ehdr->e_version = elf32_to_cpu(ehdr, buf_ehdr->e_version);
153 ehdr->e_flags = elf32_to_cpu(ehdr, buf_ehdr->e_flags);
154 ehdr->e_phentsize = elf16_to_cpu(ehdr, buf_ehdr->e_phentsize);
155 ehdr->e_phnum = elf16_to_cpu(ehdr, buf_ehdr->e_phnum);
156 ehdr->e_shentsize = elf16_to_cpu(ehdr, buf_ehdr->e_shentsize);
157 ehdr->e_shnum = elf16_to_cpu(ehdr, buf_ehdr->e_shnum);
158 ehdr->e_shstrndx = elf16_to_cpu(ehdr, buf_ehdr->e_shstrndx);
160 switch (ehdr->e_ident[EI_CLASS]) {
162 ehdr->e_entry = elf64_to_cpu(ehdr, buf_ehdr->e_entry);
163 ehdr->e_phoff = elf64_to_cpu(ehdr, buf_ehdr->e_phoff);
164 ehdr->e_shoff = elf64_to_cpu(ehdr, buf_ehdr->e_shoff);
168 ehdr->e_entry = elf32_to_cpu(ehdr, buf_ehdr->e_entry);
169 ehdr->e_phoff = elf32_to_cpu(ehdr, buf_ehdr->e_phoff);
170 ehdr->e_shoff = elf32_to_cpu(ehdr, buf_ehdr->e_shoff);
178 return elf_is_ehdr_sane(ehdr, len) ? 0 : -ENOEXEC;
208 const struct elfhdr *ehdr = elf_info->ehdr;
212 pbuf = buf + elf_info->ehdr->e_phoff + (idx * sizeof(*buf_phdr));
215 phdr->p_type = elf32_to_cpu(elf_info->ehdr, buf_phdr->p_type);
216 phdr->p_flags = elf32_to_cpu(elf_info->ehdr, buf_phdr->p_flags);
218 switch (ehdr->e_ident[EI_CLASS]) {
220 phdr->p_offset = elf64_to_cpu(ehdr, buf_phdr->p_offset);
221 phdr->p_paddr = elf64_to_cpu(ehdr, buf_phdr->p_paddr);
222 phdr->p_vaddr = elf64_to_cpu(ehdr, buf_phdr->p_vaddr);
223 phdr->p_filesz = elf64_to_cpu(ehdr, buf_phdr->p_filesz);
224 phdr->p_memsz = elf64_to_cpu(ehdr, buf_phdr->p_memsz);
225 phdr->p_align = elf64_to_cpu(ehdr, buf_phdr->p_align);
229 phdr->p_offset = elf32_to_cpu(ehdr, buf_phdr->p_offset);
230 phdr->p_paddr = elf32_to_cpu(ehdr, buf_phdr->p_paddr);
231 phdr->p_vaddr = elf32_to_cpu(ehdr, buf_phdr->p_vaddr);
232 phdr->p_filesz = elf32_to_cpu(ehdr, buf_phdr->p_filesz);
233 phdr->p_memsz = elf32_to_cpu(ehdr, buf_phdr->p_memsz);
234 phdr->p_align = elf32_to_cpu(ehdr, buf_phdr->p_align);
255 const struct elfhdr *ehdr = elf_info->ehdr;
261 phdr_size = sizeof(struct elf_phdr) * ehdr->e_phnum;
267 for (i = 0; i < ehdr->e_phnum; i++) {
285 * @ehdr: Pointer to existing struct which will be populated.
297 struct elfhdr *ehdr,
302 ret = elf_read_ehdr(buf, len, ehdr);
307 elf_info->ehdr = ehdr;
308 if (ehdr->e_phoff > 0 && ehdr->e_phnum > 0) {
327 int kexec_build_elf_info(const char *buf, size_t len, struct elfhdr *ehdr,
333 ret = elf_read_from_buffer(buf, len, ehdr, elf_info);
338 if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) {
346 for (i = 0; i < ehdr->e_phnum; i++) {
367 struct elfhdr ehdr;
371 ret = kexec_build_elf_info(buf, len, &ehdr, &elf_info);
377 return elf_check_arch(&ehdr) ? 0 : -ENOEXEC;
388 int kexec_elf_load(struct kimage *image, struct elfhdr *ehdr,
398 for (i = 0; i < ehdr->e_phnum; i++) {