cregit-Linux how code gets into the kernel

Release 4.14 arch/mips/include/asm/checksum.h

/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1995, 96, 97, 98, 99, 2001 by Ralf Baechle
 * Copyright (C) 1999 Silicon Graphics, Inc.
 * Copyright (C) 2001 Thiemo Seufer.
 * Copyright (C) 2002 Maciej W. Rozycki
 * Copyright (C) 2014 Imagination Technologies Ltd.
 */
#ifndef _ASM_CHECKSUM_H

#define _ASM_CHECKSUM_H

#ifdef CONFIG_GENERIC_CSUM
#include <asm-generic/checksum.h>
#else

#include <linux/in6.h>

#include <linux/uaccess.h>

/*
 * computes the checksum of a memory block at buff, length len,
 * and adds in "sum" (32-bit)
 *
 * returns a 32-bit number suitable for feeding into itself
 * or csum_tcpudp_magic
 *
 * this function must be called with even lengths, except
 * for the last fragment, which may be odd
 *
 * it's best to have buff aligned on a 32-bit boundary
 */
__wsum csum_partial(const void *buff, int len, __wsum sum);

__wsum __csum_partial_copy_kernel(const void *src, void *dst,
				  int len, __wsum sum, int *err_ptr);

__wsum __csum_partial_copy_from_user(const void *src, void *dst,
				     int len, __wsum sum, int *err_ptr);
__wsum __csum_partial_copy_to_user(const void *src, void *dst,
				   int len, __wsum sum, int *err_ptr);
/*
 * this is a new version of the above that records errors it finds in *errp,
 * but continues and zeros the rest of the buffer.
 */

static inline __wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr) { might_fault(); if (uaccess_kernel()) return __csum_partial_copy_kernel((__force void *)src, dst, len, sum, err_ptr); else return __csum_partial_copy_from_user((__force void *)src, dst, len, sum, err_ptr); }

Contributors

PersonTokensPropCommitsCommitProp
Leonid Yegoshin2533.78%220.00%
Atsushi Nemoto2432.43%110.00%
Linus Torvalds (pre-git)1722.97%220.00%
Al Viro56.76%220.00%
Ralf Bächle22.70%220.00%
Markos Chandras11.35%110.00%
Total74100.00%10100.00%

#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
static inline __wsum csum_and_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr) { if (access_ok(VERIFY_READ, src, len)) return csum_partial_copy_from_user(src, dst, len, sum, err_ptr); if (len) *err_ptr = -EFAULT; return sum; }

Contributors

PersonTokensPropCommitsCommitProp
Leonid Yegoshin6498.46%150.00%
Atsushi Nemoto11.54%150.00%
Total65100.00%2100.00%

/* * Copy and checksum to user */ #define HAVE_CSUM_COPY_USER
static inline __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len, __wsum sum, int *err_ptr) { might_fault(); if (access_ok(VERIFY_WRITE, dst, len)) { if (uaccess_kernel()) return __csum_partial_copy_kernel(src, (__force void *)dst, len, sum, err_ptr); else return __csum_partial_copy_to_user(src, (__force void *)dst, len, sum, err_ptr); } if (len) *err_ptr = -EFAULT; return (__force __wsum)-1; /* invalid checksum */ }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4239.62%430.77%
Leonid Yegoshin2624.53%17.69%
Atsushi Nemoto2321.70%17.69%
Al Viro98.49%215.38%
Ralf Bächle43.77%323.08%
Stephen Hemminger10.94%17.69%
Markos Chandras10.94%17.69%
Total106100.00%13100.00%

/* * the same as csum_partial, but copies from user space (but on MIPS * we have just one address space, so this is identical to the above) */ __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum); #define csum_partial_copy_nocheck csum_partial_copy_nocheck /* * Fold a partial checksum without adding pseudo headers */
static inline __sum16 csum_fold(__wsum csum) { u32 sum = (__force u32)csum;; sum += (sum << 16); csum = (sum < csum); sum >>= 16; sum += csum; return (__force __sum16)~sum; }

Contributors

PersonTokensPropCommitsCommitProp
Ralf Bächle3669.23%125.00%
Linus Torvalds (pre-git)1019.23%250.00%
Al Viro611.54%125.00%
Total52100.00%4100.00%

#define csum_fold csum_fold /* * This is a version of ip_compute_csum() optimized for IP headers, * which always checksum on 4 octet boundaries. * * By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by * Arnt Gulbrandsen. */
static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl) { const unsigned int *word = iph; const unsigned int *stop = word + ihl; unsigned int csum; int carry; csum = word[0]; csum += word[1]; carry = (csum < word[1]); csum += carry; csum += word[2]; carry = (csum < word[2]); csum += carry; csum += word[3]; carry = (csum < word[3]); csum += carry; word += 4; do { csum += *word; carry = (csum < *word); csum += carry; word++; } while (word != stop); return csum_fold(csum); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton12983.23%125.00%
Linus Torvalds (pre-git)2113.55%250.00%
Al Viro53.23%125.00%
Total155100.00%4100.00%

#define ip_fast_csum ip_fast_csum
static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len, __u8 proto, __wsum sum) { __asm__( " .set push # csum_tcpudp_nofold\n" " .set noat \n" #ifdef CONFIG_32BIT " addu %0, %2 \n" " sltu $1, %0, %2 \n" " addu %0, $1 \n" " addu %0, %3 \n" " sltu $1, %0, %3 \n" " addu %0, $1 \n" " addu %0, %4 \n" " sltu $1, %0, %4 \n" " addu %0, $1 \n" #endif #ifdef CONFIG_64BIT " daddu %0, %2 \n" " daddu %0, %3 \n" " daddu %0, %4 \n" " dsll32 $1, %0, 0 \n" " daddu %0, $1 \n" " sltu $1, %0, $1 \n" " dsra32 %0, %0, 0 \n" " addu %0, $1 \n" #endif " .set pop" : "=r" (sum) : "0" ((__force unsigned long)daddr), "r" ((__force unsigned long)saddr), #ifdef __MIPSEL__ "r" ((proto + len) << 8), #else "r" (proto + len), #endif "r" ((__force unsigned long)sum)); return sum; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2653.06%327.27%
Ralf Bächle1122.45%327.27%
Al Viro612.24%19.09%
Thiemo Seufer24.08%19.09%
Alexander Duyck24.08%19.09%
Atsushi Nemoto12.04%19.09%
Dave Johnson12.04%19.09%
Total49100.00%11100.00%

#define csum_tcpudp_nofold csum_tcpudp_nofold /* * this routine is used for miscellaneous IP-like checksums, mainly * in icmp.c */
static inline __sum16 ip_compute_csum(const void *buff, int len) { return csum_fold(csum_partial(buff, len, 0)); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2589.29%375.00%
Al Viro310.71%125.00%
Total28100.00%4100.00%

#define _HAVE_ARCH_IPV6_CSUM
static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __u32 len, __u8 proto, __wsum sum) { __wsum tmp; __asm__( " .set push # csum_ipv6_magic\n" " .set noreorder \n" " .set noat \n" " addu %0, %5 # proto (long in network byte order)\n" " sltu $1, %0, %5 \n" " addu %0, $1 \n" " addu %0, %6 # csum\n" " sltu $1, %0, %6 \n" " lw %1, 0(%2) # four words source address\n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 4(%2) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 8(%2) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 12(%2) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 0(%3) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 4(%3) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 8(%3) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " lw %1, 12(%3) \n" " addu %0, $1 \n" " addu %0, %1 \n" " sltu $1, %0, %1 \n" " addu %0, $1 # Add final carry\n" " .set pop" : "=&r" (sum), "=&r" (tmp) : "r" (saddr), "r" (daddr), "0" (htonl(len)), "r" (htonl(proto)), "r" (sum)); return csum_fold(sum); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2976.32%240.00%
Daniel Sanders410.53%120.00%
Al Viro410.53%120.00%
Alexander Duyck12.63%120.00%
Total38100.00%5100.00%

#include <asm-generic/checksum.h> #endif /* CONFIG_GENERIC_CSUM */ #endif /* _ASM_CHECKSUM_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)21929.92%925.71%
Andrew Morton12917.62%12.86%
Leonid Yegoshin11816.12%25.71%
Ralf Bächle7510.25%925.71%
Atsushi Nemoto719.70%25.71%
Markos Chandras618.33%25.71%
Al Viro456.15%25.71%
Daniel Sanders40.55%12.86%
Alexander Duyck30.41%25.71%
David S. Miller20.27%12.86%
Thiemo Seufer20.27%12.86%
Linus Torvalds10.14%12.86%
Dave Johnson10.14%12.86%
Stephen Hemminger10.14%12.86%
Total732100.00%35100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.