]> git.baikalelectronics.ru Git - kernel.git/commit
sparc64: Fix corrupted thread fault code.
authorDavid S. Miller <davem@davemloft.net>
Sun, 19 Oct 2014 03:03:09 +0000 (23:03 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Oct 2014 03:03:09 +0000 (23:03 -0400)
commit453b27e4ba1f497ddb0a8c0e0b8f060c8c23752a
treecd2253bd51ef69d5dd85f23325c4711ca0c9717f
parentef2a45b3955995bdb743a1c84ecb7b2a24c0eb83
sparc64: Fix corrupted thread fault code.

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 1f8af230c05015d82bfeee60d0e5f661012cf230 ("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: 1f8af230c050 ("sparc64: sun4v TLB error power off events")
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/dtlb_prot.S
arch/sparc/kernel/tsb.S