Skip to content

Commit 36425cd

Browse files
committed
ARC: udelay: fix inline assembler by adding LP_COUNT to clobber list
commit 3c7c7a2 ("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: Joao Pinto <[email protected]> Fixes: 3c7c7a2 ("ARC: Don't use "+l" inline asm constraint") Cc: [email protected] Signed-off-by: Vineet Gupta <[email protected]>
1 parent 92fdb52 commit 36425cd

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

arch/arc/include/asm/delay.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ static inline void __delay(unsigned long loops)
2626
" lp 1f \n"
2727
" nop \n"
2828
"1: \n"
29-
: : "r"(loops));
29+
:
30+
: "r"(loops)
31+
: "lp_count");
3032
}
3133

3234
extern void __bad_udelay(void);

0 commit comments

Comments
 (0)