• David S. Miller's avatar
    sparc64: Fix corrupted thread fault code. · 84bd6d8b
    David S. Miller authored
    Every path that ends up at do_sparc64_fault() must install a valid
    FAULT_CODE_* bitmask in the per-thread fault code byte.
    
    Two paths leading to the label winfix_trampoline (which expects the
    FAULT_CODE_* mask in register %g4) were not doing so:
    
    1) For pre-hypervisor TLB protection violation traps, if we took
       the 'winfix_trampoline' path we wouldn't have %g4 initialized
       with the FAULT_CODE_* value yet.  Resulting in using the
       TLB_TAG_ACCESS register address value instead.
    
    2) In the TSB miss path, when we notice that we are going to use a
       hugepage mapping, but we haven't allocated the hugepage TSB yet, we
       still have to take the window fixup case into consideration and
       in that particular path we leave %g4 not setup properly.
    
    Errors on this sort were largely invisible previously, but after
    commit 4ccb9272 ("sparc64: sun4v TLB
    error power off events") we now have a fault_code mask bit
    (FAULT_CODE_BAD_RA) that triggers due to this bug.
    
    FAULT_CODE_BAD_RA triggers because this bit is set in TLB_TAG_ACCESS
    (see #1 above) and thus we get seemingly random bus errors triggered
    for user processes.
    
    Fixes: 4ccb9272 ("sparc64: sun4v TLB error power off events")
    Reported-by: default avatarMeelis Roos <mroos@linux.ee>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    84bd6d8b
dtlb_prot.S 1.24 KB