]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
vmcore: allow user process to remap ELF note segment buffer
authorHATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Wed, 19 Jun 2013 00:06:08 +0000 (10:06 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 19 Jun 2013 07:13:06 +0000 (17:13 +1000)
Now ELF note segment has been copied in the buffer on vmalloc memory.  To
allow user process to remap the ELF note segment buffer with
remap_vmalloc_page, the corresponding VM area object has to have
VM_USERMAP flag set.

Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>
Cc: Lisa Mitchell <lisa.mitchell@hp.com>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/vmcore.c

index 9b9270eb0599938303490f45eac87e26f6ff6b44..dbf91c2138cfecd01cd8feaad00360e95415ca8c 100644 (file)
@@ -369,6 +369,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
        Elf64_Ehdr *ehdr_ptr;
        Elf64_Phdr phdr;
        u64 phdr_sz = 0, note_off;
+       struct vm_struct *vm;
 
        ehdr_ptr = (Elf64_Ehdr *)elfptr;
 
@@ -385,6 +386,12 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
        if (!*notes_buf)
                return -ENOMEM;
 
+       /* Allow users to remap ELF note segment buffer on vmalloc
+        * memory using remap_vmalloc_range. */
+       vm = find_vm_area(*notes_buf);
+       BUG_ON(!vm);
+       vm->flags |= VM_USERMAP;
+
        rc = copy_notes_elf64(ehdr_ptr, *notes_buf);
        if (rc < 0)
                return rc;
@@ -548,6 +555,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
        Elf32_Ehdr *ehdr_ptr;
        Elf32_Phdr phdr;
        u64 phdr_sz = 0, note_off;
+       struct vm_struct *vm;
 
        ehdr_ptr = (Elf32_Ehdr *)elfptr;
 
@@ -564,6 +572,12 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
        if (!*notes_buf)
                return -ENOMEM;
 
+       /* Allow users to remap ELF note segment buffer on vmalloc
+        * memory using remap_vmalloc_range. */
+       vm = find_vm_area(*notes_buf);
+       BUG_ON(!vm);
+       vm->flags |= VM_USERMAP;
+
        rc = copy_notes_elf32(ehdr_ptr, *notes_buf);
        if (rc < 0)
                return rc;