• Adrian Hunter's avatar
    x86: Add entry trampolines to kcore · 6855dc41
    Adrian Hunter authored
    Without program headers for PTI entry trampoline pages, the trampoline
    virtual addresses do not map to anything.
    
    Example before:
    
     sudo gdb --quiet vmlinux /proc/kcore
     Reading symbols from vmlinux...done.
     [New process 1]
     Core was generated by `BOOT_IMAGE=/boot/vmlinuz-4.16.0 root=UUID=a6096b83-b763-4101-807e-f33daff63233'.
     #0  0x0000000000000000 in irq_stack_union ()
     (gdb) x /21ib 0xfffffe0000006000
        0xfffffe0000006000:  Cannot access memory at address 0xfffffe0000006000
     (gdb) quit
    
    After:
    
     sudo gdb --quiet vmlinux /proc/kcore
     [sudo] password for ahunter:
     Reading symbols from vmlinux...done.
     [New process 1]
     Core was generated by `BOOT_IMAGE=/boot/vmlinuz-4.16.0-fix-4-00005-gd6e65a8b4072 root=UUID=a6096b83-b7'.
     #0  0x0000000000000000 in irq_stack_union ()
     (gdb) x /21ib 0xfffffe0000006000
        0xfffffe0000006000:  swapgs
        0xfffffe0000006003:  mov    %rsp,-0x3e12(%rip)        # 0xfffffe00000021f8
        0xfffffe000000600a:  xchg   %ax,%ax
        0xfffffe000000600c:  mov    %cr3,%rsp
        0xfffffe000000600f:  bts    $0x3f,%rsp
        0xfffffe0000006014:  and    $0xffffffffffffe7ff,%rsp
        0xfffffe000000601b:  mov    %rsp,%cr3
        0xfffffe000000601e:  mov    -0x3019(%rip),%rsp        # 0xfffffe000000300c
        0xfffffe0000006025:  pushq  $0x2b
        0xfffffe0000006027:  pushq  -0x3e35(%rip)        # 0xfffffe00000021f8
        0xfffffe000000602d:  push   %r11
        0xfffffe000000602f:  pushq  $0x33
        0xfffffe0000006031:  push   %rcx
        0xfffffe0000006032:  push   %rdi
        0xfffffe0000006033:  mov    $0xffffffff91a00010,%rdi
        0xfffffe000000603a:  callq  0xfffffe0000006046
        0xfffffe000000603f:  pause
        0xfffffe0000006041:  lfence
        0xfffffe0000006044:  jmp    0xfffffe000000603f
        0xfffffe0000006046:  mov    %rdi,(%rsp)
        0xfffffe000000604a:  retq
     (gdb) quit
    
    In addition, entry trampolines all map to the same page.  Represent that
    by giving the corresponding program headers in kcore the same offset.
    
    This has the benefit that, when perf tools uses /proc/kcore as a source
    for kernel object code, samples from different CPU trampolines are
    aggregated together.  Note, such aggregation is normal for profiling
    i.e. people want to profile the object code, not every different virtual
    address the object code might be mapped to (across different processes
    for example).
    
    Notes by PeterZ:
    
    This also adds the KCORE_REMAP functionality.
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Acked-by: default avatarAndi Kleen <ak@linux.intel.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: x86@kernel.org
    Link: http://lkml.kernel.org/r/1528289651-4113-4-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    6855dc41
kcore.c 15.9 KB