powerpc/32s: fix allow/prevent_user_access() when crossing segment boundaries.
authorChristophe Leroy <christophe.leroy@c-s.fr>
Mon, 14 Oct 2019 16:51:28 +0000 (16:51 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 16 Oct 2019 21:57:43 +0000 (08:57 +1100)
Make sure starting addr is aligned to segment boundary so that when
incrementing the segment, the starting address of the new segment is
below the end address. Otherwise the last segment might get  missed.

Fixes: a68c31fc01ef ("powerpc/32s: Implement Kernel Userspace Access Protection")
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/067a1b09f15f421d40797c2d04c22d4049a1cee8.1571071875.git.christophe.leroy@c-s.fr
arch/powerpc/include/asm/book3s/32/kup.h

index 677e9babef801305e61951244f0b32298c1725c7..f9dc597b0b86884dca4dc9c5e1814312bb34e41e 100644 (file)
@@ -91,6 +91,7 @@
 
 static inline void kuap_update_sr(u32 sr, u32 addr, u32 end)
 {
+       addr &= 0xf0000000;     /* align addr to start of segment */
        barrier();      /* make sure thread.kuap is updated before playing with SRs */
        while (addr < end) {
                mtsrin(sr, addr);