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

MIPS: Add 'memory' clobber to csum_ipv6_magic() inline assembler

After 'lib: checksum: Use aligned accesses for ip_fast_csum and
csum_ipv6_magic tests' was applied, the test_csum_ipv6_magic unit test
started failing for all mips platforms, both little and bit endian.
Oddly enough, adding debug code into test_csum_ipv6_magic() made the
problem disappear.

The gcc manual says:

"The "memory" clobber tells the compiler that the assembly code performs
memory reads or writes to items other than those listed in the input
and output operands (for example, accessing the memory pointed to by one
of the input parameters)
"

This is definitely the case for csum_ipv6_magic(). Indeed, adding the
'memory' clobber fixes the problem.

Cc: Charlie Jenkins <charlie@rivosinc.com>
Cc: Palmer Dabbelt <palmer@rivosinc.com>
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>

authored by

Guenter Roeck and committed by
Thomas Bogendoerfer
d55347bf 841c3516

+2 -1
+2 -1
arch/mips/include/asm/checksum.h
··· 241 241 " .set pop" 242 242 : "=&r" (sum), "=&r" (tmp) 243 243 : "r" (saddr), "r" (daddr), 244 - "0" (htonl(len)), "r" (htonl(proto)), "r" (sum)); 244 + "0" (htonl(len)), "r" (htonl(proto)), "r" (sum) 245 + : "memory"); 245 246 246 247 return csum_fold(sum); 247 248 }