Re: [PATCH] MIPS: strnlen_user.S: Fix a CPU_DADDI_WORKAROUNDS regression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 28, 2015 at 05:46:49PM +0100, Maciej W. Rozycki wrote:

> 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@xxxxxxxxxxxxxx>
> ---
> Ralf,
> 
>  The jump to the delay slot combined with the unusual register usage 
> convention taken here made it trickier than it would normally be to make a 
> fix that does not regress -- in terms of code size -- unaffected microMIPS 
> systems.  I tried several versions and eventually I came up with this one 
> that I believe produces the best code in all cases, at the cost of these 
> #ifdefs.  I hope they are acceptable.

I think it's all a hint to rewrite the thing in a language that
transparently handles the DADDIU issue.  Such as C.  Which would also
make using a better algorithm easier.

  Ralf





[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux