On Wed, May 29, 2024 at 01:12:07PM +0100, Pierre-Clément Tosi wrote: > 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: 7db21530479f ("KVM: arm64: Restore hyp when panicking in guest context") > Signed-off-by: Pierre-Clément Tosi <ptosi@xxxxxxxxxx> > --- > arch/arm64/kernel/asm-offsets.c | 1 + > arch/arm64/kvm/hyp/entry.S | 8 ++++++++ > arch/arm64/kvm/hyp/include/hyp/switch.h | 5 +++-- > 3 files changed, 12 insertions(+), 2 deletions(-) Acked-by: Will Deacon <will@xxxxxxxxxx> Will