... and when gcc-8 becomes a requirement, we could simply switch to generic version. Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> --- arch/x86/include/asm/checksum.h | 18 ++++++++++++++++++ arch/x86/include/asm/checksum_64.h | 16 ---------------- arch/x86/um/asm/checksum.h | 17 +++++++++++++++++ arch/x86/um/asm/checksum_64.h | 9 --------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/arch/x86/include/asm/checksum.h b/arch/x86/include/asm/checksum.h index c66fa797703a..5c0a730c7316 100644 --- a/arch/x86/include/asm/checksum.h +++ b/arch/x86/include/asm/checksum.h @@ -1,6 +1,24 @@ /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_X86_CHECKSUM_H #define _ASM_X86_CHECKSUM_H + +static inline unsigned add32_with_carry(unsigned a, unsigned b) +{ + asm("addl %2,%0\n\t" + "adcl $0,%0" + : "=r" (a) + : "0" (a), "rm" (b)); + return a; +} + +/* note: with gcc-8 or later generic csum_add() yields the same code */ +#define HAVE_ARCH_CSUM_ADD +static inline __wsum csum_add(__wsum csum, __wsum addend) +{ + return (__force __wsum)add32_with_carry((__force unsigned)csum, + (__force unsigned)addend); +} + #ifdef CONFIG_GENERIC_CSUM # include <asm-generic/checksum.h> #else diff --git a/arch/x86/include/asm/checksum_64.h b/arch/x86/include/asm/checksum_64.h index e225a12cec68..c86db605c0fd 100644 --- a/arch/x86/include/asm/checksum_64.h +++ b/arch/x86/include/asm/checksum_64.h @@ -52,20 +52,4 @@ extern __sum16 csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __u32 len, __u8 proto, __wsum sum); -static inline unsigned add32_with_carry(unsigned a, unsigned b) -{ - asm("addl %2,%0\n\t" - "adcl $0,%0" - : "=r" (a) - : "0" (a), "rm" (b)); - return a; -} - -#define HAVE_ARCH_CSUM_ADD -static inline __wsum csum_add(__wsum csum, __wsum addend) -{ - return (__force __wsum)add32_with_carry((__force unsigned)csum, - (__force unsigned)addend); -} - #endif /* _ASM_X86_CHECKSUM_64_H */ diff --git a/arch/x86/um/asm/checksum.h b/arch/x86/um/asm/checksum.h index 9ef8ef4291f4..0986c19e5ff0 100644 --- a/arch/x86/um/asm/checksum.h +++ b/arch/x86/um/asm/checksum.h @@ -6,6 +6,23 @@ #include <linux/in6.h> #include <linux/uaccess.h> +static inline unsigned add32_with_carry(unsigned a, unsigned b) +{ + asm("addl %2,%0\n\t" + "adcl $0,%0" + : "=r" (a) + : "0" (a), "rm" (b)); + return a; +} + +/* note: with gcc-8 or later generic csum_add() yields the same code */ +#define HAVE_ARCH_CSUM_ADD +static inline __wsum csum_add(__wsum csum, __wsum addend) +{ + return (__force __wsum)add32_with_carry((__force unsigned)csum, + (__force unsigned)addend); +} + /* * computes the checksum of a memory block at buff, length len, * and adds in "sum" (32-bit) diff --git a/arch/x86/um/asm/checksum_64.h b/arch/x86/um/asm/checksum_64.h index fd1ab07e4a4c..17228e4c26b6 100644 --- a/arch/x86/um/asm/checksum_64.h +++ b/arch/x86/um/asm/checksum_64.h @@ -7,13 +7,4 @@ #define _HAVE_IP_COMPUTE_CSUM -static inline unsigned add32_with_carry(unsigned a, unsigned b) -{ - asm("addl %2,%0\n\t" - "adcl $0,%0" - : "=r" (a) - : "0" (a), "r" (b)); - return a; -} - #endif -- 2.39.2