aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/kcore.c
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2018-08-22 00:55:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-22 13:52:46 -0400
commit23c85094fe1895caefdd19ef624ee687ec5f4507 (patch)
tree13a0d0b93980e585384310a021b3772dc37b9e54 /fs/proc/kcore.c
parenteff4345e7fba0aac8665f00e8599b36946d9aaec (diff)
proc/kcore: add vmcoreinfo note to /proc/kcore
The vmcoreinfo information is useful for runtime debugging tools, not just for crash dumps. A lot of this information can be determined by other means, but this is much more convenient, and it only adds a page at most to the file. Link: http://lkml.kernel.org/r/fddbcd08eed76344863303878b12de1c1e2a04b6.1531953780.git.osandov@fb.com Signed-off-by: Omar Sandoval <osandov@fb.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Bhupesh Sharma <bhsharma@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: James Morse <james.morse@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc/kcore.c')
-rw-r--r--fs/proc/kcore.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 758c14e46a44..80464432dfe6 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -10,6 +10,7 @@
10 * Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar <kanoj@sgi.com> 10 * Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar <kanoj@sgi.com>
11 */ 11 */
12 12
13#include <linux/crash_core.h>
13#include <linux/mm.h> 14#include <linux/mm.h>
14#include <linux/proc_fs.h> 15#include <linux/proc_fs.h>
15#include <linux/kcore.h> 16#include <linux/kcore.h>
@@ -81,10 +82,13 @@ static size_t get_kcore_size(int *nphdr, size_t *phdrs_len, size_t *notes_len,
81 } 82 }
82 83
83 *phdrs_len = *nphdr * sizeof(struct elf_phdr); 84 *phdrs_len = *nphdr * sizeof(struct elf_phdr);
84 *notes_len = (3 * (sizeof(struct elf_note) + ALIGN(sizeof(CORE_STR), 4)) + 85 *notes_len = (4 * sizeof(struct elf_note) +
86 3 * ALIGN(sizeof(CORE_STR), 4) +
87 VMCOREINFO_NOTE_NAME_BYTES +
85 ALIGN(sizeof(struct elf_prstatus), 4) + 88 ALIGN(sizeof(struct elf_prstatus), 4) +
86 ALIGN(sizeof(struct elf_prpsinfo), 4) + 89 ALIGN(sizeof(struct elf_prpsinfo), 4) +
87 ALIGN(arch_task_struct_size, 4)); 90 ALIGN(arch_task_struct_size, 4) +
91 ALIGN(vmcoreinfo_size, 4));
88 *data_offset = PAGE_ALIGN(sizeof(struct elfhdr) + *phdrs_len + 92 *data_offset = PAGE_ALIGN(sizeof(struct elfhdr) + *phdrs_len +
89 *notes_len); 93 *notes_len);
90 return *data_offset + size; 94 return *data_offset + size;
@@ -406,6 +410,16 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos)
406 sizeof(prpsinfo)); 410 sizeof(prpsinfo));
407 append_kcore_note(notes, &i, CORE_STR, NT_TASKSTRUCT, current, 411 append_kcore_note(notes, &i, CORE_STR, NT_TASKSTRUCT, current,
408 arch_task_struct_size); 412 arch_task_struct_size);
413 /*
414 * vmcoreinfo_size is mostly constant after init time, but it
415 * can be changed by crash_save_vmcoreinfo(). Racing here with a
416 * panic on another CPU before the machine goes down is insanely
417 * unlikely, but it's better to not leave potential buffer
418 * overflows lying around, regardless.
419 */
420 append_kcore_note(notes, &i, VMCOREINFO_NOTE_NAME, 0,
421 vmcoreinfo_data,
422 min(vmcoreinfo_size, notes_len - i));
409 423
410 tsz = min_t(size_t, buflen, notes_offset + notes_len - *fpos); 424 tsz = min_t(size_t, buflen, notes_offset + notes_len - *fpos);
411 if (copy_to_user(buffer, notes + *fpos - notes_offset, tsz)) { 425 if (copy_to_user(buffer, notes + *fpos - notes_offset, tsz)) {