diff options
Diffstat (limited to 'arch/ia64/lib')
-rw-r--r-- | arch/ia64/lib/checksum.c | 38 | ||||
-rw-r--r-- | arch/ia64/lib/csum_partial_copy.c | 31 | ||||
-rw-r--r-- | arch/ia64/lib/ip_fast_csum.S | 58 |
3 files changed, 82 insertions, 45 deletions
diff --git a/arch/ia64/lib/checksum.c b/arch/ia64/lib/checksum.c index beb11721d9f5..4411d9baeb21 100644 --- a/arch/ia64/lib/checksum.c +++ b/arch/ia64/lib/checksum.c | |||
@@ -33,32 +33,32 @@ from64to16 (unsigned long x) | |||
33 | * computes the checksum of the TCP/UDP pseudo-header | 33 | * computes the checksum of the TCP/UDP pseudo-header |
34 | * returns a 16-bit checksum, already complemented. | 34 | * returns a 16-bit checksum, already complemented. |
35 | */ | 35 | */ |
36 | unsigned short int | 36 | __sum16 |
37 | csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len, | 37 | csum_tcpudp_magic (__be32 saddr, __be32 daddr, unsigned short len, |
38 | unsigned short proto, unsigned int sum) | 38 | unsigned short proto, __wsum sum) |
39 | { | 39 | { |
40 | return ~from64to16(saddr + daddr + sum + ((unsigned long) ntohs(len) << 16) + | 40 | return (__force __sum16)~from64to16( |
41 | ((unsigned long) proto << 8)); | 41 | (__force u64)saddr + (__force u64)daddr + |
42 | (__force u64)sum + ((len + proto) << 8)); | ||
42 | } | 43 | } |
43 | 44 | ||
44 | EXPORT_SYMBOL(csum_tcpudp_magic); | 45 | EXPORT_SYMBOL(csum_tcpudp_magic); |
45 | 46 | ||
46 | unsigned int | 47 | __wsum |
47 | csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len, | 48 | csum_tcpudp_nofold (__be32 saddr, __be32 daddr, unsigned short len, |
48 | unsigned short proto, unsigned int sum) | 49 | unsigned short proto, __wsum sum) |
49 | { | 50 | { |
50 | unsigned long result; | 51 | unsigned long result; |
51 | 52 | ||
52 | result = (saddr + daddr + sum + | 53 | result = (__force u64)saddr + (__force u64)daddr + |
53 | ((unsigned long) ntohs(len) << 16) + | 54 | (__force u64)sum + ((len + proto) << 8); |
54 | ((unsigned long) proto << 8)); | ||
55 | 55 | ||
56 | /* Fold down to 32-bits so we don't lose in the typedef-less network stack. */ | 56 | /* Fold down to 32-bits so we don't lose in the typedef-less network stack. */ |
57 | /* 64 to 33 */ | 57 | /* 64 to 33 */ |
58 | result = (result & 0xffffffff) + (result >> 32); | 58 | result = (result & 0xffffffff) + (result >> 32); |
59 | /* 33 to 32 */ | 59 | /* 33 to 32 */ |
60 | result = (result & 0xffffffff) + (result >> 32); | 60 | result = (result & 0xffffffff) + (result >> 32); |
61 | return result; | 61 | return (__force __wsum)result; |
62 | } | 62 | } |
63 | 63 | ||
64 | extern unsigned long do_csum (const unsigned char *, long); | 64 | extern unsigned long do_csum (const unsigned char *, long); |
@@ -75,16 +75,15 @@ extern unsigned long do_csum (const unsigned char *, long); | |||
75 | * | 75 | * |
76 | * it's best to have buff aligned on a 32-bit boundary | 76 | * it's best to have buff aligned on a 32-bit boundary |
77 | */ | 77 | */ |
78 | unsigned int | 78 | __wsum csum_partial(const void *buff, int len, __wsum sum) |
79 | csum_partial (const unsigned char * buff, int len, unsigned int sum) | ||
80 | { | 79 | { |
81 | unsigned long result = do_csum(buff, len); | 80 | u64 result = do_csum(buff, len); |
82 | 81 | ||
83 | /* add in old sum, and carry.. */ | 82 | /* add in old sum, and carry.. */ |
84 | result += sum; | 83 | result += (__force u32)sum; |
85 | /* 32+c bits -> 32 bits */ | 84 | /* 32+c bits -> 32 bits */ |
86 | result = (result & 0xffffffff) + (result >> 32); | 85 | result = (result & 0xffffffff) + (result >> 32); |
87 | return result; | 86 | return (__force __wsum)result; |
88 | } | 87 | } |
89 | 88 | ||
90 | EXPORT_SYMBOL(csum_partial); | 89 | EXPORT_SYMBOL(csum_partial); |
@@ -93,10 +92,9 @@ EXPORT_SYMBOL(csum_partial); | |||
93 | * this routine is used for miscellaneous IP-like checksums, mainly | 92 | * this routine is used for miscellaneous IP-like checksums, mainly |
94 | * in icmp.c | 93 | * in icmp.c |
95 | */ | 94 | */ |
96 | unsigned short | 95 | __sum16 ip_compute_csum (const void *buff, int len) |
97 | ip_compute_csum (unsigned char * buff, int len) | ||
98 | { | 96 | { |
99 | return ~do_csum(buff,len); | 97 | return (__force __sum16)~do_csum(buff,len); |
100 | } | 98 | } |
101 | 99 | ||
102 | EXPORT_SYMBOL(ip_compute_csum); | 100 | EXPORT_SYMBOL(ip_compute_csum); |
diff --git a/arch/ia64/lib/csum_partial_copy.c b/arch/ia64/lib/csum_partial_copy.c index 36866e8a5d2b..503dfe6d1450 100644 --- a/arch/ia64/lib/csum_partial_copy.c +++ b/arch/ia64/lib/csum_partial_copy.c | |||
@@ -104,9 +104,9 @@ out: | |||
104 | */ | 104 | */ |
105 | extern unsigned long do_csum(const unsigned char *, long); | 105 | extern unsigned long do_csum(const unsigned char *, long); |
106 | 106 | ||
107 | static unsigned int | 107 | __wsum |
108 | do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst, | 108 | csum_partial_copy_from_user(const void __user *src, void *dst, |
109 | int len, unsigned int psum, int *errp) | 109 | int len, __wsum psum, int *errp) |
110 | { | 110 | { |
111 | unsigned long result; | 111 | unsigned long result; |
112 | 112 | ||
@@ -122,30 +122,17 @@ do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char * | |||
122 | result = do_csum(dst, len); | 122 | result = do_csum(dst, len); |
123 | 123 | ||
124 | /* add in old sum, and carry.. */ | 124 | /* add in old sum, and carry.. */ |
125 | result += psum; | 125 | result += (__force u32)psum; |
126 | /* 32+c bits -> 32 bits */ | 126 | /* 32+c bits -> 32 bits */ |
127 | result = (result & 0xffffffff) + (result >> 32); | 127 | result = (result & 0xffffffff) + (result >> 32); |
128 | return result; | 128 | return (__force __wsum)result; |
129 | } | ||
130 | |||
131 | unsigned int | ||
132 | csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst, | ||
133 | int len, unsigned int sum, int *errp) | ||
134 | { | ||
135 | if (!access_ok(VERIFY_READ, src, len)) { | ||
136 | *errp = -EFAULT; | ||
137 | memset(dst, 0, len); | ||
138 | return sum; | ||
139 | } | ||
140 | |||
141 | return do_csum_partial_copy_from_user(src, dst, len, sum, errp); | ||
142 | } | 129 | } |
143 | 130 | ||
144 | unsigned int | 131 | __wsum |
145 | csum_partial_copy_nocheck(const unsigned char __user *src, unsigned char *dst, | 132 | csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) |
146 | int len, unsigned int sum) | ||
147 | { | 133 | { |
148 | return do_csum_partial_copy_from_user(src, dst, len, sum, NULL); | 134 | return csum_partial_copy_from_user((__force const void __user *)src, |
135 | dst, len, sum, NULL); | ||
149 | } | 136 | } |
150 | 137 | ||
151 | EXPORT_SYMBOL(csum_partial_copy_nocheck); | 138 | EXPORT_SYMBOL(csum_partial_copy_nocheck); |
diff --git a/arch/ia64/lib/ip_fast_csum.S b/arch/ia64/lib/ip_fast_csum.S index 19674ca2acfc..1f86aeb2c948 100644 --- a/arch/ia64/lib/ip_fast_csum.S +++ b/arch/ia64/lib/ip_fast_csum.S | |||
@@ -8,8 +8,8 @@ | |||
8 | * in0: address of buffer to checksum (char *) | 8 | * in0: address of buffer to checksum (char *) |
9 | * in1: length of the buffer (int) | 9 | * in1: length of the buffer (int) |
10 | * | 10 | * |
11 | * Copyright (C) 2002 Intel Corp. | 11 | * Copyright (C) 2002, 2006 Intel Corp. |
12 | * Copyright (C) 2002 Ken Chen <kenneth.w.chen@intel.com> | 12 | * Copyright (C) 2002, 2006 Ken Chen <kenneth.w.chen@intel.com> |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <asm/asmmacro.h> | 15 | #include <asm/asmmacro.h> |
@@ -25,6 +25,9 @@ | |||
25 | 25 | ||
26 | #define in0 r32 | 26 | #define in0 r32 |
27 | #define in1 r33 | 27 | #define in1 r33 |
28 | #define in2 r34 | ||
29 | #define in3 r35 | ||
30 | #define in4 r36 | ||
28 | #define ret0 r8 | 31 | #define ret0 r8 |
29 | 32 | ||
30 | GLOBAL_ENTRY(ip_fast_csum) | 33 | GLOBAL_ENTRY(ip_fast_csum) |
@@ -65,8 +68,9 @@ GLOBAL_ENTRY(ip_fast_csum) | |||
65 | zxt2 r20=r20 | 68 | zxt2 r20=r20 |
66 | ;; | 69 | ;; |
67 | add r20=ret0,r20 | 70 | add r20=ret0,r20 |
71 | mov r9=0xffff | ||
68 | ;; | 72 | ;; |
69 | andcm ret0=-1,r20 | 73 | andcm ret0=r9,r20 |
70 | .restore sp // reset frame state | 74 | .restore sp // reset frame state |
71 | br.ret.sptk.many b0 | 75 | br.ret.sptk.many b0 |
72 | ;; | 76 | ;; |
@@ -88,3 +92,51 @@ GLOBAL_ENTRY(ip_fast_csum) | |||
88 | mov b0=r34 | 92 | mov b0=r34 |
89 | br.ret.sptk.many b0 | 93 | br.ret.sptk.many b0 |
90 | END(ip_fast_csum) | 94 | END(ip_fast_csum) |
95 | |||
96 | GLOBAL_ENTRY(csum_ipv6_magic) | ||
97 | ld4 r20=[in0],4 | ||
98 | ld4 r21=[in1],4 | ||
99 | dep r15=in3,in2,32,16 | ||
100 | ;; | ||
101 | ld4 r22=[in0],4 | ||
102 | ld4 r23=[in1],4 | ||
103 | mux1 r15=r15,@rev | ||
104 | ;; | ||
105 | ld4 r24=[in0],4 | ||
106 | ld4 r25=[in1],4 | ||
107 | shr.u r15=r15,16 | ||
108 | add r16=r20,r21 | ||
109 | add r17=r22,r23 | ||
110 | ;; | ||
111 | ld4 r26=[in0],4 | ||
112 | ld4 r27=[in1],4 | ||
113 | add r18=r24,r25 | ||
114 | add r8=r16,r17 | ||
115 | ;; | ||
116 | add r19=r26,r27 | ||
117 | add r8=r8,r18 | ||
118 | ;; | ||
119 | add r8=r8,r19 | ||
120 | add r15=r15,in4 | ||
121 | ;; | ||
122 | add r8=r8,r15 | ||
123 | ;; | ||
124 | shr.u r10=r8,32 // now fold sum into short | ||
125 | zxt4 r11=r8 | ||
126 | ;; | ||
127 | add r8=r10,r11 | ||
128 | ;; | ||
129 | shr.u r10=r8,16 // yeah, keep it rolling | ||
130 | zxt2 r11=r8 | ||
131 | ;; | ||
132 | add r8=r10,r11 | ||
133 | ;; | ||
134 | shr.u r10=r8,16 // three times lucky | ||
135 | zxt2 r11=r8 | ||
136 | ;; | ||
137 | add r8=r10,r11 | ||
138 | mov r9=0xffff | ||
139 | ;; | ||
140 | andcm r8=r9,r8 | ||
141 | br.ret.sptk.many b0 | ||
142 | END(csum_ipv6_magic) | ||