• Jann Horn's avatar
    x86/traps: Print address on #GP · 59c1dcbe
    Jann Horn authored
    A frequent cause of #GP exceptions are memory accesses to non-canonical
    addresses. Unlike #PF, #GP doesn't report a fault address in CR2, so the
    kernel doesn't currently print the fault address for a #GP.
    
    Luckily, the necessary infrastructure for decoding x86 instructions and
    computing the memory address being accessed is already present. Hook
    it up to the #GP handler so that the address operand of the faulting
    instruction can be figured out and printed.
    
    Distinguish two cases:
    
      a) (Part of) the memory range being accessed lies in the non-canonical
         address range; in this case, it is likely that the decoded address
         is actually the one that caused the #GP.
    
      b) The entire memory range of the decoded operand lies in canonical
         address space; the #GP may or may not be related in some way to the
         computed address. Print it, but with hedging language in the message.
    
    While it is already possible to compute the faulting address manually by
    disassembling the opcode dump and evaluating the instruction against the
    register dump, this should make it slightly easier to identify crashes
    at a glance.
    
    Note that the operand length which comes from the instruction decoder
    and is used to determine whether the access straddles into non-canonical
    address space, is currently somewhat unreliable; but it should be good
    enough, considering that Linux on x86-64 never maps the page directly
    before the start of the non-canonical range anyway, and therefore the
    case where a memory range begins in that page and potentially straddles
    into the non-canonical range should be fairly uncommon.
    
    In the case the address is still computed wrongly, it only influences
    whether the error message claims that the access is canonical.
    
     [ bp: Remove ambiguous "we", massage, reflow comments and spacing. ]
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Tested-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@google.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: kasan-dev@googlegroups.com
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20191218231150.12139-2-jannh@google.com
    59c1dcbe
traps.c 29.2 KB