diff options
author | James Clarke <[email protected]> | 2019-05-29 22:31:31 +0100 |
---|---|---|
committer | David S. Miller <[email protected]> | 2019-06-02 22:13:40 -0700 |
commit | d3c976c14ad8af421134c428b0a89ff8dd3bd8f8 (patch) | |
tree | 45fa45c56bd6b0f364aa8a222f92f3585a8dd94a | |
parent | f2c7c76c5d0a443053e94adb9f0918fa2fb85c3a (diff) |
sparc64: Fix regression in non-hypervisor TLB flush xcall
Previously, %g2 would end up with the value PAGE_SIZE, but after the
commit mentioned below it ends up with the value 1 due to being reused
for a different purpose. We need it to be PAGE_SIZE as we use it to step
through pages in our demap loop, otherwise we set different flags in the
low 12 bits of the address written to, thereby doing things other than a
nucleus page flush.
Fixes: a74ad5e660a9 ("sparc64: Handle extremely large kernel TLB range flushes more gracefully.")
Reported-by: Meelis Roos <[email protected]>
Tested-by: Meelis Roos <[email protected]>
Signed-off-by: James Clarke <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
-rw-r--r-- | arch/sparc/mm/ultra.S | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index d245f89d1395..d220b6848746 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S @@ -587,7 +587,7 @@ xcall_flush_tlb_kernel_range: /* 44 insns */ sub %g7, %g1, %g3 srlx %g3, 18, %g2 brnz,pn %g2, 2f - add %g2, 1, %g2 + sethi %hi(PAGE_SIZE), %g2 sub %g3, %g2, %g3 or %g1, 0x20, %g1 ! Nucleus 1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP @@ -751,7 +751,7 @@ __cheetah_xcall_flush_tlb_kernel_range: /* 44 insns */ sub %g7, %g1, %g3 srlx %g3, 18, %g2 brnz,pn %g2, 2f - add %g2, 1, %g2 + sethi %hi(PAGE_SIZE), %g2 sub %g3, %g2, %g3 or %g1, 0x20, %g1 ! Nucleus 1: stxa %g0, [%g1 + %g3] ASI_DMMU_DEMAP |