[prev in list] [next in list] [prev in thread] [next in thread] 

List:       git-commits-head
Subject:    MIPS: strnlen_user.S: Fix a CPU_DADDI_WORKAROUNDS regression
From:       "Linux Kernel Mailing List" <linux-kernel () vger ! kernel ! org>
Date:       2015-05-31 19:06:11
Message-ID: 20150531190611.D9475660ED8 () gitolite ! kernel ! org
[Download RAW message or body]

Gitweb:     http://git.kernel.org/linus/;a=commit;h=c4fca4fdea940bda2cff6b844cda6af8ef1c79cc
                
Commit:     c4fca4fdea940bda2cff6b844cda6af8ef1c79cc
Parent:     57b41758230b567218cb5bc3da9068aabc496fc9
Refname:    refs/heads/master
Author:     Maciej W. Rozycki <macro@linux-mips.org>
AuthorDate: Thu May 28 17:46:49 2015 +0100
Committer:  Ralf Baechle <ralf@linux-mips.org>
CommitDate: Fri May 29 20:23:58 2015 +0200

    MIPS: strnlen_user.S: Fix a CPU_DADDI_WORKAROUNDS regression
    
    Correct a regression introduced with 8453eebd [MIPS: Fix strnlen_user()
    return value in case of overlong strings.] causing assembler warnings
    and broken code generated in __strnlen_kernel_nocheck_asm:
    
    arch/mips/lib/strnlen_user.S: Assembler messages:
    arch/mips/lib/strnlen_user.S:64: Warning: Macro instruction expanded into \
multiple instructions in a branch delay slot  
    with the CPU_DADDI_WORKAROUNDS option set, resulting in the function
    looping indefinitely upon mounting NFS root.
    
    Use conditional assembly to avoid a microMIPS code size regression.
    Using $at unconditionally would cause such a regression as there are no
    16-bit instruction encodings available for ALU operations using this
    register.  Using $v1 unconditionally would produce short microMIPS
    encodings, but would prevent this register from being used across calls
    to this function.
    
    The extra LI operation introduced is free, replacing a NOP originally
    scheduled into the delay slot of the branch that follows.
    
    Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/10205/
    Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
---
 arch/mips/lib/strnlen_user.S | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/arch/mips/lib/strnlen_user.S b/arch/mips/lib/strnlen_user.S
index 7d12c0d..77e6494 100644
--- a/arch/mips/lib/strnlen_user.S
+++ b/arch/mips/lib/strnlen_user.S
@@ -34,7 +34,12 @@ LEAF(__strnlen_\func\()_asm)
 FEXPORT(__strnlen_\func\()_nocheck_asm)
 	move		v0, a0
 	PTR_ADDU	a1, a0			# stop pointer
-1:	beq		v0, a1, 1f		# limit reached?
+1:
+#ifdef CONFIG_CPU_DADDI_WORKAROUNDS
+	.set		noat
+	li		AT, 1
+#endif
+	beq		v0, a1, 1f		# limit reached?
 .ifeqs "\func", "kernel"
 	EX(lb, t0, (v0), .Lfault\@)
 .else
@@ -42,7 +47,13 @@ FEXPORT(__strnlen_\func\()_nocheck_asm)
 .endif
 	.set		noreorder
 	bnez		t0, 1b
-1:	 PTR_ADDIU	v0, 1
+1:
+#ifndef CONFIG_CPU_DADDI_WORKAROUNDS
+	 PTR_ADDIU	v0, 1
+#else
+	 PTR_ADDU	v0, AT
+	.set		at
+#endif
 	.set		reorder
 	PTR_SUBU	v0, a0
 	jr		ra
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic