Skip to content

Commit 4649201

Browse files
Pratyush Anandtorvalds
authored andcommitted
/proc/kcore: update physical address for kcore ram and text
Currently all the p_paddr of PT_LOAD headers are assigned to 0, which is not true and could be misleading, since 0 is a valid physical address. User space tools like makedumpfile needs to know physical address for PT_LOAD segments of direct mapped regions. Therefore this patch updates paddr for such regions. It also sets an invalid paddr (-1) for other regions, so that user space tool can know whether a physical address provided in PT_LOAD is correct or not. I do not know why it was 0, which is a valid physical address. But certainly, it might break some user space tools, and those need to be fixed. For example, see following code from kexec-tools kexec/kexec-elf.c:build_mem_phdrs() if ((phdr->p_paddr + phdr->p_memsz) < phdr->p_paddr) { /* The memory address wraps */ if (probe_debug) { fprintf(stderr, "ELF address wrap around\n"); } return -1; } We do not need to perform above check for an invalid physical address. I think, kexec-tools and makedumpfile will need fixup. I already have those fixup which will be sent upstream once this patch makes through. Pro with this approach is that, it will help to calculate variable like page_offset, phys_base from PT_LOAD even when they are randomized and therefore will reduce many variable and version specific values in user space tools. Having an ASLR offset information can help to translate an identity mapped virtual address to a physical address. But that would be an additional field in PT_LOAD header structure and an arch dependent value. Moreover, sending a valid physical address like 0 does not seem right. So, IMHO it is better to fix that and send valid physical address when available (identity mapped). Link: http://lkml.kernel.org/r/f951340d2917cdd2a329fae9837a83f2059dc3b2.1485318868.git.panand@redhat.com Signed-off-by: Pratyush Anand <[email protected]> Cc: Baoquan He <[email protected]> Cc: Dave Young <[email protected]> Cc: Dave Anderson <[email protected]> Cc: Atsushi Kumagai <[email protected]> Cc: Simon Horman <[email protected]> Cc: Kees Cook <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 0c49ad4 commit 4649201

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

fs/proc/kcore.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,10 @@ static void elf_kcore_store_hdr(char *bufp, int nphdr, int dataoff)
373373
phdr->p_flags = PF_R|PF_W|PF_X;
374374
phdr->p_offset = kc_vaddr_to_offset(m->addr) + dataoff;
375375
phdr->p_vaddr = (size_t)m->addr;
376-
phdr->p_paddr = 0;
376+
if (m->type == KCORE_RAM || m->type == KCORE_TEXT)
377+
phdr->p_paddr = __pa(m->addr);
378+
else
379+
phdr->p_paddr = (elf_addr_t)-1;
377380
phdr->p_filesz = phdr->p_memsz = m->size;
378381
phdr->p_align = PAGE_SIZE;
379382
}

0 commit comments

Comments
 (0)