• Pierre-Clément Tosi's avatar
    KVM: arm64: Fix clobbered ELR in sync abort/SError · a8f06558
    Pierre-Clément Tosi authored
    When the hypervisor receives a SError or synchronous exception (EL2h)
    while running with the __kvm_hyp_vector and if ELR_EL2 doesn't point to
    an extable entry, it panics indirectly by overwriting ELR with the
    address of a panic handler in order for the asm routine it returns to to
    ERET into the handler.
    
    However, this clobbers ELR_EL2 for the handler itself. As a result,
    hyp_panic(), when retrieving what it believes to be the PC where the
    exception happened, actually ends up reading the address of the panic
    handler that called it! This results in an erroneous and confusing panic
    message where the source of any synchronous exception (e.g. BUG() or
    kCFI) appears to be __guest_exit_panic, making it hard to locate the
    actual BRK instruction.
    
    Therefore, store the original ELR_EL2 in the per-CPU kvm_hyp_ctxt and
    point the sysreg to a routine that first restores it to its previous
    value before running __guest_exit_panic.
    
    Fixes: 7db21530 ("KVM: arm64: Restore hyp when panicking in guest context")
    Signed-off-by: default avatarPierre-Clément Tosi <ptosi@google.com>
    Acked-by: default avatarWill Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20240610063244.2828978-2-ptosi@google.comSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    a8f06558
asm-offsets.c 10.3 KB