Skip to content
  • David Daney's avatar
    MIPS: tlbex: Properly fix HUGE TLB Refill exception handler · b0de6ef3
    David Daney authored
    
    
    commit 9e0f162a36914937a937358fcb45e0609ef2bfc4 upstream.
    
    In commit 8393c524a25609 (MIPS: tlbex: Fix a missing statement for
    HUGETLB), the TLB Refill handler was fixed so that non-OCTEON targets
    would work properly with huge pages.  The change was incorrect in that
    it broke the OCTEON case.
    
    The problem is shown here:
    
        xxx0:	df7a0000 	ld	k0,0(k1)
        .
        .
        .
        xxxc0:	df610000 	ld	at,0(k1)
        xxxc4:	335a0ff0 	andi	k0,k0,0xff0
        xxxc8:	e825ffcd 	bbit1	at,0x5,0x0
        xxxcc:	003ad82d 	daddu	k1,at,k0
        .
        .
        .
    
    In the non-octeon case there is a destructive test for the huge PTE
    bit, and then at 0, $k0 is reloaded (that is what the 8393c524a25609
    patch added).
    
    In the octeon case, we modify k1 in the branch delay slot, but we
    never need k0 again, so the new load is not needed, but since k1 is
    modified, if we do the load, we load from a garbage location and then
    get a nested TLB Refill, which is seen in userspace as either SIGBUS
    or SIGSEGV (depending on the garbage).
    
    The real fix is to only do this reloading if it is needed, and never
    where it is harmful.
    
    Signed-off-by: default avatarDavid Daney <david.daney@cavium.com>
    Cc: Huacai Chen <chenhc@lemote.com>
    Cc: Fuxin Zhang <zhangfx@lemote.com>
    Cc: Zhangjin Wu <wuzhangjin@gmail.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/8151/
    
    
    Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b0de6ef3