| From 36de10c4788efc6efe6ff9aa10d38cb7eea4c818 Mon Sep 17 00:00:00 2001 |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| Date: Wed, 13 Nov 2019 13:18:31 -0800 |
| Subject: xtensa: fix TLB sanity checker |
| |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| |
| commit 36de10c4788efc6efe6ff9aa10d38cb7eea4c818 upstream. |
| |
| Virtual and translated addresses retrieved by the xtensa TLB sanity |
| checker must be consistent, i.e. correspond to the same state of the |
| checked TLB entry. KASAN shadow memory is mapped dynamically using |
| auto-refill TLB entries and thus may change TLB state between the |
| virtual and translated address retrieval, resulting in false TLB |
| insanity report. |
| Move read_xtlb_translation close to read_xtlb_virtual to make sure that |
| read values are consistent. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: a99e07ee5e88 ("xtensa: check TLB sanity on return to userspace") |
| Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/xtensa/mm/tlb.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/xtensa/mm/tlb.c |
| +++ b/arch/xtensa/mm/tlb.c |
| @@ -218,6 +218,8 @@ static int check_tlb_entry(unsigned w, u |
| unsigned tlbidx = w | (e << PAGE_SHIFT); |
| unsigned r0 = dtlb ? |
| read_dtlb_virtual(tlbidx) : read_itlb_virtual(tlbidx); |
| + unsigned r1 = dtlb ? |
| + read_dtlb_translation(tlbidx) : read_itlb_translation(tlbidx); |
| unsigned vpn = (r0 & PAGE_MASK) | (e << PAGE_SHIFT); |
| unsigned pte = get_pte_for_vaddr(vpn); |
| unsigned mm_asid = (get_rasid_register() >> 8) & ASID_MASK; |
| @@ -233,8 +235,6 @@ static int check_tlb_entry(unsigned w, u |
| } |
| |
| if (tlb_asid == mm_asid) { |
| - unsigned r1 = dtlb ? read_dtlb_translation(tlbidx) : |
| - read_itlb_translation(tlbidx); |
| if ((pte ^ r1) & PAGE_MASK) { |
| pr_err("%cTLB: way: %u, entry: %u, mapping: %08x->%08x, PTE: %08x\n", |
| dtlb ? 'D' : 'I', w, e, r0, r1, pte); |