• Nicholas Piggin's avatar
    KVM: PPC: Book3S HV: Prevent POWER7/8 TLB flush flushing SLB · cf0b0e37
    Nicholas Piggin authored
    The POWER9 ERAT flush instruction is a SLBIA with IH=7, which is a
    reserved value on POWER7/8. On POWER8 this invalidates the SLB entries
    above index 0, similarly to SLBIA IH=0.
    
    If the SLB entries are invalidated, and then the guest is bypassed, the
    host SLB does not get re-loaded, so the bolted entries above 0 will be
    lost. This can result in kernel stack access causing a SLB fault.
    
    Kernel stack access causing a SLB fault was responsible for the infamous
    mega bug (search "Fix SLB reload bug"). Although since commit
    48e7b769 ("powerpc/64s/hash: Convert SLB miss handlers to C") that
    starts using the kernel stack in the SLB miss handler, it might only
    result in an infinite loop of SLB faults. In any case it's a bug.
    
    Fix this by only executing the instruction on >= POWER9 where IH=7 is
    defined not to invalidate the SLB. POWER7/8 don't require this ERAT
    flush.
    
    Fixes: 50087112 ("KVM: PPC: Book3S HV: Invalidate ERAT when flushing guest TLB entries")
    Cc: stable@vger.kernel.org # v5.2+
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Reviewed-by: default avatarFabiano Rosas <farosas@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20211119031627.577853-1-npiggin@gmail.com
    cf0b0e37
book3s_hv_builtin.c 18.7 KB