|
@@ -204,36 +204,15 @@ static struct vmcore* __init get_new_element(void)
|
|
|
return kzalloc(sizeof(struct vmcore), GFP_KERNEL);
|
|
|
}
|
|
|
|
|
|
-static u64 __init get_vmcore_size_elf64(char *elfptr, size_t elfsz)
|
|
|
+static u64 __init get_vmcore_size(size_t elfsz, size_t elfnotesegsz,
|
|
|
+ struct list_head *vc_list)
|
|
|
{
|
|
|
- int i;
|
|
|
u64 size;
|
|
|
- Elf64_Ehdr *ehdr_ptr;
|
|
|
- Elf64_Phdr *phdr_ptr;
|
|
|
-
|
|
|
- ehdr_ptr = (Elf64_Ehdr *)elfptr;
|
|
|
- phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
|
|
|
- size = elfsz;
|
|
|
- for (i = 0; i < ehdr_ptr->e_phnum; i++) {
|
|
|
- size += phdr_ptr->p_memsz;
|
|
|
- phdr_ptr++;
|
|
|
- }
|
|
|
- return size;
|
|
|
-}
|
|
|
-
|
|
|
-static u64 __init get_vmcore_size_elf32(char *elfptr, size_t elfsz)
|
|
|
-{
|
|
|
- int i;
|
|
|
- u64 size;
|
|
|
- Elf32_Ehdr *ehdr_ptr;
|
|
|
- Elf32_Phdr *phdr_ptr;
|
|
|
+ struct vmcore *m;
|
|
|
|
|
|
- ehdr_ptr = (Elf32_Ehdr *)elfptr;
|
|
|
- phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
|
|
|
- size = elfsz;
|
|
|
- for (i = 0; i < ehdr_ptr->e_phnum; i++) {
|
|
|
- size += phdr_ptr->p_memsz;
|
|
|
- phdr_ptr++;
|
|
|
+ size = elfsz + elfnotesegsz;
|
|
|
+ list_for_each_entry(m, vc_list, list) {
|
|
|
+ size += m->size;
|
|
|
}
|
|
|
return size;
|
|
|
}
|
|
@@ -856,20 +835,19 @@ static int __init parse_crash_elf_headers(void)
|
|
|
rc = parse_crash_elf64_headers();
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
-
|
|
|
- /* Determine vmcore size. */
|
|
|
- vmcore_size = get_vmcore_size_elf64(elfcorebuf, elfcorebuf_sz);
|
|
|
} else if (e_ident[EI_CLASS] == ELFCLASS32) {
|
|
|
rc = parse_crash_elf32_headers();
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
-
|
|
|
- /* Determine vmcore size. */
|
|
|
- vmcore_size = get_vmcore_size_elf32(elfcorebuf, elfcorebuf_sz);
|
|
|
} else {
|
|
|
pr_warn("Warning: Core image elf header is not sane\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+
|
|
|
+ /* Determine vmcore size. */
|
|
|
+ vmcore_size = get_vmcore_size(elfcorebuf_sz, elfnotes_sz,
|
|
|
+ &vmcore_list);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|