• Maciej W. Rozycki's avatar
    MIPS: __delay CPU_DADDI_WORKAROUNDS bug fix · 2db4bc34
    Maciej W. Rozycki authored
    With CPU_DADDI_WORKAROUNDS enabled __delay assembles with a macro in a
    branch delay slot:
    
    {standard input}: Assembler messages:
    {standard input}:18: Warning: Macro instruction expanded into multiple
    instructions in a branch delay slot
    
    and broken code results:
    
    0000000000000000 <__delay>:
       0:	1480ffff 	bnez	a0,0 <__delay>
       4:	24010001 	li	at,1
       8:	0081202f 	dsubu	a0,a0,at
       c:	03e00008 	jr	ra
      10:	00000000 	nop
      14:	00000000 	nop
    
    Consequently the function loops indefinitely, showing up prominently as a
    hang in the delay loop calibration at bootstrap.
    
    This change corrects the problem by forcing the immediate 1 into a
    register while keeping code produced identical where CPU_DADDI_WORKAROUNDS
    is disabled.
    Signed-off-by: default avatarMaciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/6669/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    2db4bc34
delay.c 1.62 KB