cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/lib/csum-wrappers_64.c

Directory: arch/x86/lib
/*
 * Copyright 2002, 2003 Andi Kleen, SuSE Labs.
 * Subject to the GNU Public License v.2
 *
 * Wrappers of assembly checksum functions for x86-64.
 */
#include <asm/checksum.h>
#include <linux/export.h>
#include <linux/uaccess.h>
#include <asm/smap.h>

/**
 * csum_partial_copy_from_user - Copy and checksum from user space.
 * @src: source address (user space)
 * @dst: destination address
 * @len: number of bytes to be copied.
 * @isum: initial sum that is added into the result (32bit unfolded)
 * @errp: set to -EFAULT for an bad source address.
 *
 * Returns an 32bit unfolded checksum of the buffer.
 * src and dst are best aligned to 64bits.
 */

__wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum isum, int *errp) { might_sleep(); *errp = 0; if (!likely(access_ok(VERIFY_READ, src, len))) goto out_err; /* * Why 6, not 7? To handle odd addresses aligned we * would need to do considerable complications to fix the * checksum which is defined as an 16bit accumulator. The * fix alignment code is primarily for performance * compatibility with 32bit and that will handle odd * addresses slowly too. */ if (unlikely((unsigned long)src & 6)) { while (((unsigned long)src & 6) && len >= 2) { __u16 val16; if (__get_user(val16, (const __u16 __user *)src)) goto out_err; *(__u16 *)dst = val16; isum = (__force __wsum)add32_with_carry( (__force unsigned)isum, val16); src += 2; dst += 2; len -= 2; } } stac(); isum = csum_partial_copy_generic((__force const void *)src, dst, len, isum, errp, NULL); clac(); if (unlikely(*errp)) goto out_err; return isum; out_err: *errp = -EFAULT; memset(dst, 0, len); return isum; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen16479.23%333.33%
Al Viro2110.14%333.33%
Ingo Molnar115.31%111.11%
H. Peter Anvin62.90%111.11%
Linus Torvalds52.42%111.11%
Total207100.00%9100.00%

EXPORT_SYMBOL(csum_partial_copy_from_user); /** * csum_partial_copy_to_user - Copy and checksum to user space. * @src: source address * @dst: destination address (user space) * @len: number of bytes to be copied. * @isum: initial sum that is added into the result (32bit unfolded) * @errp: set to -EFAULT for an bad destination address. * * Returns an 32bit unfolded checksum of the buffer. * src and dst are best aligned to 64bits. */
__wsum csum_partial_copy_to_user(const void *src, void __user *dst, int len, __wsum isum, int *errp) { __wsum ret; might_sleep(); if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) { *errp = -EFAULT; return 0; } if (unlikely((unsigned long)dst & 6)) { while (((unsigned long)dst & 6) && len >= 2) { __u16 val16 = *(__u16 *)src; isum = (__force __wsum)add32_with_carry( (__force unsigned)isum, val16); *errp = __put_user(val16, (__u16 __user *)dst); if (*errp) return isum; src += 2; dst += 2; len -= 2; } } *errp = 0; stac(); ret = csum_partial_copy_generic(src, (void __force *)dst, len, isum, NULL, errp); clac(); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen15582.45%342.86%
Al Viro1910.11%342.86%
H. Peter Anvin147.45%114.29%
Total188100.00%7100.00%

EXPORT_SYMBOL(csum_partial_copy_to_user); /** * csum_partial_copy_nocheck - Copy and checksum. * @src: source address * @dst: destination address * @len: number of bytes to be copied. * @sum: initial sum that is added into the result (32bit unfolded) * * Returns an 32bit unfolded checksum of the buffer. */
__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) { return csum_partial_copy_generic(src, dst, len, sum, NULL, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen3288.89%150.00%
Al Viro411.11%150.00%
Total36100.00%2100.00%

EXPORT_SYMBOL(csum_partial_copy_nocheck);
__sum16 csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __u32 len, __u8 proto, __wsum sum) { __u64 rest, sum64; rest = (__force __u64)htonl(len) + (__force __u64)htons(proto) + (__force __u64)sum; asm(" addq (%[saddr]),%[sum]\n" " adcq 8(%[saddr]),%[sum]\n" " adcq (%[daddr]),%[sum]\n" " adcq 8(%[daddr]),%[sum]\n" " adcq $0,%[sum]\n" : [sum] "=r" (sum64) : "[sum]" (rest), [saddr] "r" (saddr), [daddr] "r" (daddr)); return csum_fold( (__force __wsum)add32_with_carry(sum64 & 0xffffffff, sum64>>32)); }

Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen6483.12%240.00%
Al Viro1114.29%120.00%
Alexander Duyck11.30%120.00%
Ingo Molnar11.30%120.00%
Total77100.00%5100.00%

EXPORT_SYMBOL(csum_ipv6_magic);

Overall Contributors

PersonTokensPropCommitsCommitProp
Andi Kleen44080.88%426.67%
Al Viro5510.11%320.00%
H. Peter Anvin234.23%16.67%
Ingo Molnar132.39%16.67%
Linus Torvalds50.92%16.67%
Andrew Lutomirski30.55%16.67%
Paolo Ciarrocchi20.37%16.67%
Alexander Duyck10.18%16.67%
Wanpeng Li10.18%16.67%
Paul Gortmaker10.18%16.67%
Total544100.00%15100.00%
Directory: arch/x86/lib
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.