Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Blackfin: outs[lwb]: make sure count is greater than 0

Some devices will use the outs* funcs with a length of zero, so make sure
we do not write any data in that case.

Reported-by: Gilbert Inho <gneny@edevice.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>

+12 -4
+12 -4
arch/blackfin/lib/outs.S
··· 13 13 .align 2 14 14 15 15 ENTRY(_outsl) 16 + CC = R2 == 0; 17 + IF CC JUMP 1f; 16 18 P0 = R0; /* P0 = port */ 17 19 P1 = R1; /* P1 = address */ 18 20 P2 = R2; /* P2 = count */ ··· 22 20 LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; 23 21 .Llong_loop_s: R0 = [P1++]; 24 22 .Llong_loop_e: [P0] = R0; 25 - RTS; 23 + 1: RTS; 26 24 ENDPROC(_outsl) 27 25 28 26 ENTRY(_outsw) 27 + CC = R2 == 0; 28 + IF CC JUMP 1f; 29 29 P0 = R0; /* P0 = port */ 30 30 P1 = R1; /* P1 = address */ 31 31 P2 = R2; /* P2 = count */ ··· 35 31 LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; 36 32 .Lword_loop_s: R0 = W[P1++]; 37 33 .Lword_loop_e: W[P0] = R0; 38 - RTS; 34 + 1: RTS; 39 35 ENDPROC(_outsw) 40 36 41 37 ENTRY(_outsb) 38 + CC = R2 == 0; 39 + IF CC JUMP 1f; 42 40 P0 = R0; /* P0 = port */ 43 41 P1 = R1; /* P1 = address */ 44 42 P2 = R2; /* P2 = count */ ··· 48 42 LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; 49 43 .Lbyte_loop_s: R0 = B[P1++]; 50 44 .Lbyte_loop_e: B[P0] = R0; 51 - RTS; 45 + 1: RTS; 52 46 ENDPROC(_outsb) 53 47 54 48 ENTRY(_outsw_8) 49 + CC = R2 == 0; 50 + IF CC JUMP 1f; 55 51 P0 = R0; /* P0 = port */ 56 52 P1 = R1; /* P1 = address */ 57 53 P2 = R2; /* P2 = count */ ··· 64 56 R0 = R0 << 8; 65 57 R0 = R0 + R1; 66 58 .Lword8_loop_e: W[P0] = R0; 67 - RTS; 59 + 1: RTS; 68 60 ENDPROC(_outsw_8)