diff options
author | David S. Miller <davem@davemloft.net> | 2014-10-18 23:03:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-18 23:03:09 -0400 |
commit | 84bd6d8b9c0f06b3f188efb479c77e20f05e9a8a (patch) | |
tree | cd2253bd51ef69d5dd85f23325c4711ca0c9717f /include/video/pmag-ba-fb.h | |
parent | 52d589a01d4545ce1dc5c3892bb8c7b55edfe714 (diff) | |
download | op-kernel-dev-84bd6d8b9c0f06b3f188efb479c77e20f05e9a8a.zip op-kernel-dev-84bd6d8b9c0f06b3f188efb479c77e20f05e9a8a.tar.gz |
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 4ccb9272892c33ef1c19a783cfa87103b30c2784 ("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: 4ccb9272892c ("sparc64: sun4v TLB error power off events")
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/video/pmag-ba-fb.h')
0 files changed, 0 insertions, 0 deletions