• Vineet Gupta's avatar
    ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list · 42ad7663
    Vineet Gupta authored
    commit 36425cd6 upstream.
    
    commit 3c7c7a2f ("ARC: Don't use "+l" inline asm constraint")
    modified the inline assembly to setup LP_COUNT register manually and NOT
    rely on gcc to do it (with the +l inline assembler contraint hint, now
    being retired in the compiler)
    
    However the fix was flawed as we didn't add LP_COUNT to asm clobber list,
    meaning gcc doesn't know that LP_COUNT or zero-delay-loops are in action
    in the inline asm.
    
    This resulted in some fun - as nested ZOL loops were being generared
    
    | mov lp_count,250000 ;16 # tmp235,
    | lp .L__GCC__LP14 #		<======= OUTER LOOP (gcc generated)
    |   .L14:
    |   ld r2, [r5] # MEM[(volatile u32 *)prephitmp_43], w
    |   dmb 1
    |   breq r2, -1, @.L21 #, w,,
    |   bbit0 r2,1,@.L13 # w,,
    |   ld r4,[r7] ;25 # loops_per_jiffy, loops_per_jiffy
    |   mpymu r3,r4,r6 #, loops_per_jiffy, tmp234
    |
    |   mov lp_count, r3 #		 <====== INNER LOOP (from inline asm)
    |   lp 1f
    | 	 nop
    |   1:
    |   nop_s
    | .L__GCC__LP14: ; loop end, start is @.L14 #,
    
    This caused issues with drivers relying on sane behaviour of udelay
    friends.
    
    With LP_COUNT added to clobber list, gcc doesn't generate the outer
    loop in say above case.
    
    Addresses STAR 9001146134
    Reported-by: default avatarJoao Pinto <jpinto@synopsys.com>
    Fixes: 3c7c7a2f ("ARC: Don't use "+l" inline asm constraint")
    Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    42ad7663
delay.h 1.93 KB