hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/arch/x86/lib/csum-wrappers_64.c
....@@ -1,6 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright 2002, 2003 Andi Kleen, SuSE Labs.
3
- * Subject to the GNU Public License v.2
44 *
55 * Wrappers of assembly checksum functions for x86-64.
66 */
....@@ -10,7 +10,7 @@
1010 #include <asm/smap.h>
1111
1212 /**
13
- * csum_partial_copy_from_user - Copy and checksum from user space.
13
+ * csum_and_copy_from_user - Copy and checksum from user space.
1414 * @src: source address (user space)
1515 * @dst: destination address
1616 * @len: number of bytes to be copied.
....@@ -21,57 +21,21 @@
2121 * src and dst are best aligned to 64bits.
2222 */
2323 __wsum
24
-csum_partial_copy_from_user(const void __user *src, void *dst,
25
- int len, __wsum isum, int *errp)
24
+csum_and_copy_from_user(const void __user *src, void *dst, int len)
2625 {
26
+ __wsum sum;
27
+
2728 might_sleep();
28
- *errp = 0;
29
-
30
- if (!likely(access_ok(VERIFY_READ, src, len)))
31
- goto out_err;
32
-
33
- /*
34
- * Why 6, not 7? To handle odd addresses aligned we
35
- * would need to do considerable complications to fix the
36
- * checksum which is defined as an 16bit accumulator. The
37
- * fix alignment code is primarily for performance
38
- * compatibility with 32bit and that will handle odd
39
- * addresses slowly too.
40
- */
41
- if (unlikely((unsigned long)src & 6)) {
42
- while (((unsigned long)src & 6) && len >= 2) {
43
- __u16 val16;
44
-
45
- if (__get_user(val16, (const __u16 __user *)src))
46
- goto out_err;
47
-
48
- *(__u16 *)dst = val16;
49
- isum = (__force __wsum)add32_with_carry(
50
- (__force unsigned)isum, val16);
51
- src += 2;
52
- dst += 2;
53
- len -= 2;
54
- }
55
- }
56
- stac();
57
- isum = csum_partial_copy_generic((__force const void *)src,
58
- dst, len, isum, errp, NULL);
59
- clac();
60
- if (unlikely(*errp))
61
- goto out_err;
62
-
63
- return isum;
64
-
65
-out_err:
66
- *errp = -EFAULT;
67
- memset(dst, 0, len);
68
-
69
- return isum;
29
+ if (!user_access_begin(src, len))
30
+ return 0;
31
+ sum = csum_partial_copy_generic((__force const void *)src, dst, len);
32
+ user_access_end();
33
+ return sum;
7034 }
71
-EXPORT_SYMBOL(csum_partial_copy_from_user);
35
+EXPORT_SYMBOL(csum_and_copy_from_user);
7236
7337 /**
74
- * csum_partial_copy_to_user - Copy and checksum to user space.
38
+ * csum_and_copy_to_user - Copy and checksum to user space.
7539 * @src: source address
7640 * @dst: destination address (user space)
7741 * @len: number of bytes to be copied.
....@@ -82,41 +46,18 @@
8246 * src and dst are best aligned to 64bits.
8347 */
8448 __wsum
85
-csum_partial_copy_to_user(const void *src, void __user *dst,
86
- int len, __wsum isum, int *errp)
49
+csum_and_copy_to_user(const void *src, void __user *dst, int len)
8750 {
88
- __wsum ret;
51
+ __wsum sum;
8952
9053 might_sleep();
91
-
92
- if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) {
93
- *errp = -EFAULT;
54
+ if (!user_access_begin(dst, len))
9455 return 0;
95
- }
96
-
97
- if (unlikely((unsigned long)dst & 6)) {
98
- while (((unsigned long)dst & 6) && len >= 2) {
99
- __u16 val16 = *(__u16 *)src;
100
-
101
- isum = (__force __wsum)add32_with_carry(
102
- (__force unsigned)isum, val16);
103
- *errp = __put_user(val16, (__u16 __user *)dst);
104
- if (*errp)
105
- return isum;
106
- src += 2;
107
- dst += 2;
108
- len -= 2;
109
- }
110
- }
111
-
112
- *errp = 0;
113
- stac();
114
- ret = csum_partial_copy_generic(src, (void __force *)dst,
115
- len, isum, NULL, errp);
116
- clac();
117
- return ret;
56
+ sum = csum_partial_copy_generic(src, (void __force *)dst, len);
57
+ user_access_end();
58
+ return sum;
11859 }
119
-EXPORT_SYMBOL(csum_partial_copy_to_user);
60
+EXPORT_SYMBOL(csum_and_copy_to_user);
12061
12162 /**
12263 * csum_partial_copy_nocheck - Copy and checksum.
....@@ -128,9 +69,9 @@
12869 * Returns an 32bit unfolded checksum of the buffer.
12970 */
13071 __wsum
131
-csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
72
+csum_partial_copy_nocheck(const void *src, void *dst, int len)
13273 {
133
- return csum_partial_copy_generic(src, dst, len, sum, NULL, NULL);
74
+ return csum_partial_copy_generic(src, dst, len);
13475 }
13576 EXPORT_SYMBOL(csum_partial_copy_nocheck);
13677