MIPS: strnlen_user.S: Fix a CPU_DADDI_WORKAROUNDS regression
authorMaciej W. Rozycki <macro@linux-mips.org>
Thu, 28 May 2015 16:46:49 +0000 (17:46 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 29 May 2015 18:23:58 +0000 (20:23 +0200)
commitc4fca4fdea940bda2cff6b844cda6af8ef1c79cc
treef66a7522cade4d4a883f4597b29f00dd258cdf7a
parent57b41758230b567218cb5bc3da9068aabc496fc9
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