• Michael Ellerman's avatar
    powerpc/idle: Don't corrupt back chain when going idle · 496c5fe2
    Michael Ellerman authored
    In isa206_idle_insn_mayloss() we store various registers into the stack
    red zone, which is allowed.
    
    However inside the IDLE_STATE_ENTER_SEQ_NORET macro we save r2 again,
    to 0(r1), which corrupts the stack back chain.
    
    We used to do the same in isa206_idle_insn_mayloss() itself, but we
    fixed that in 73287caa ("powerpc64/idle: Fix SP offsets when saving
    GPRs"), however we missed that the macro also corrupts the back chain.
    
    Corrupting the back chain is bad for debuggability but doesn't
    necessarily cause a bug.
    
    However we recently changed the stack handling in some KVM code, and it
    now relies on the stack back chain being valid when it returns. The
    corruption causes that code to return with r1 pointing somewhere in
    kernel data, at some point LR is restored from the stack and we branch
    to NULL or somewhere else invalid.
    
    Only affects Power8 hosts running KVM guests, with dynamic_mt_modes
    enabled (which it is by default).
    
    The fixes tag below points to the commit that changed the KVM stack
    handling, exposing this bug. The actual corruption of the back chain has
    always existed since 948cf67c ("powerpc: Add NAP mode support on
    Power7 in HV mode").
    
    Fixes: 9b4416c5 ("KVM: PPC: Book3S HV: Fix stack handling in idle_kvm_start_guest()")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20211020094826.3222052-1-mpe@ellerman.id.au
    496c5fe2
idle_book3s.S 5.58 KB