]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
vmcore: round-up offset of vmcore object in page-size boundary
authorHATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Wed, 20 Mar 2013 04:08:38 +0000 (15:08 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 20 Mar 2013 04:23:30 +0000 (15:23 +1100)
To satisfy mmap()'s page-size bounary requirement, round-up offset of each
vmcore objects in page-size boundary; each offset is connected to
user-space virtual address through mapping of mmap().

Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/vmcore.c

index 0077a9a880ce81dc593aa1daf6c7350f210cf87f..f15c8817dcc45e8a26bf3e0dbc66e3655b0fd58e 100644 (file)
@@ -698,7 +698,7 @@ static int __init process_ptload_program_headers_elf32(char *elfptr,
 }
 
 /* Sets offset fields of vmcore elements. */
-static void __init set_vmcore_list_offsets_elf64(char *elfptr,
+static void __init set_vmcore_list_offsets_elf64(char *elfptr, size_t elfsz,
                                                struct list_head *vc_list)
 {
        loff_t vmcore_off;
@@ -708,17 +708,16 @@ static void __init set_vmcore_list_offsets_elf64(char *elfptr,
        ehdr_ptr = (Elf64_Ehdr *)elfptr;
 
        /* Skip Elf header and program headers. */
-       vmcore_off = ehdr_ptr->e_phoff +
-                       (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr);
+       vmcore_off = elfsz;
 
        list_for_each_entry(m, vc_list, list) {
                m->offset = vmcore_off;
-               vmcore_off += m->size;
+               vmcore_off += roundup(m->size, PAGE_SIZE);
        }
 }
 
 /* Sets offset fields of vmcore elements. */
-static void __init set_vmcore_list_offsets_elf32(char *elfptr,
+static void __init set_vmcore_list_offsets_elf32(char *elfptr, size_t elfsz,
                                                struct list_head *vc_list)
 {
        loff_t vmcore_off;
@@ -728,12 +727,11 @@ static void __init set_vmcore_list_offsets_elf32(char *elfptr,
        ehdr_ptr = (Elf32_Ehdr *)elfptr;
 
        /* Skip Elf header and program headers. */
-       vmcore_off = ehdr_ptr->e_phoff +
-                       (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr);
+       vmcore_off = elfsz;
 
        list_for_each_entry(m, vc_list, list) {
                m->offset = vmcore_off;
-               vmcore_off += m->size;
+               vmcore_off += roundup(m->size, PAGE_SIZE);
        }
 }
 
@@ -801,7 +799,7 @@ static int __init parse_crash_elf64_headers(void)
                           get_order(elfcorebuf_sz_orig));
                return rc;
        }
-       set_vmcore_list_offsets_elf64(elfcorebuf, &vmcore_list);
+       set_vmcore_list_offsets_elf64(elfcorebuf, elfcorebuf_sz, &vmcore_list);
        return 0;
 }
 
@@ -869,7 +867,7 @@ static int __init parse_crash_elf32_headers(void)
                           get_order(elfcorebuf_sz_orig));
                return rc;
        }
-       set_vmcore_list_offsets_elf32(elfcorebuf, &vmcore_list);
+       set_vmcore_list_offsets_elf32(elfcorebuf, elfcorebuf_sz, &vmcore_list);
        return 0;
 }