.. | .. |
---|
1 | | -/* $Id: checksum.S,v 1.10 2001/07/06 13:11:32 gniibe Exp $ |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0+ |
---|
| 2 | + * |
---|
| 3 | + * $Id: checksum.S,v 1.10 2001/07/06 13:11:32 gniibe Exp $ |
---|
2 | 4 | * |
---|
3 | 5 | * INET An implementation of the TCP/IP protocol suite for the LINUX |
---|
4 | 6 | * operating system. INET is implemented using the BSD Socket |
---|
.. | .. |
---|
21 | 23 | * converted to pure assembler |
---|
22 | 24 | * |
---|
23 | 25 | * SuperH version: Copyright (C) 1999 Niibe Yutaka |
---|
24 | | - * |
---|
25 | | - * This program is free software; you can redistribute it and/or |
---|
26 | | - * modify it under the terms of the GNU General Public License |
---|
27 | | - * as published by the Free Software Foundation; either version |
---|
28 | | - * 2 of the License, or (at your option) any later version. |
---|
29 | 26 | */ |
---|
30 | 27 | |
---|
31 | 28 | #include <asm/errno.h> |
---|
.. | .. |
---|
176 | 173 | mov r6, r0 |
---|
177 | 174 | |
---|
178 | 175 | /* |
---|
179 | | -unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, |
---|
180 | | - int sum, int *src_err_ptr, int *dst_err_ptr) |
---|
| 176 | +unsigned int csum_partial_copy_generic (const char *src, char *dst, int len) |
---|
181 | 177 | */ |
---|
182 | 178 | |
---|
183 | 179 | /* |
---|
184 | | - * Copy from ds while checksumming, otherwise like csum_partial |
---|
185 | | - * |
---|
186 | | - * The macros SRC and DST specify the type of access for the instruction. |
---|
187 | | - * thus we can call a custom exception handler for all access types. |
---|
188 | | - * |
---|
189 | | - * FIXME: could someone double-check whether I haven't mixed up some SRC and |
---|
190 | | - * DST definitions? It's damn hard to trigger all cases. I hope I got |
---|
191 | | - * them all but there's no guarantee. |
---|
| 180 | + * Copy from ds while checksumming, otherwise like csum_partial with initial |
---|
| 181 | + * sum being ~0U |
---|
192 | 182 | */ |
---|
193 | 183 | |
---|
194 | | -#define SRC(...) \ |
---|
| 184 | +#define EXC(...) \ |
---|
195 | 185 | 9999: __VA_ARGS__ ; \ |
---|
196 | 186 | .section __ex_table, "a"; \ |
---|
197 | 187 | .long 9999b, 6001f ; \ |
---|
198 | | - .previous |
---|
199 | | - |
---|
200 | | -#define DST(...) \ |
---|
201 | | - 9999: __VA_ARGS__ ; \ |
---|
202 | | - .section __ex_table, "a"; \ |
---|
203 | | - .long 9999b, 6002f ; \ |
---|
204 | 188 | .previous |
---|
205 | 189 | |
---|
206 | 190 | ! |
---|
207 | 191 | ! r4: const char *SRC |
---|
208 | 192 | ! r5: char *DST |
---|
209 | 193 | ! r6: int LEN |
---|
210 | | -! r7: int SUM |
---|
211 | | -! |
---|
212 | | -! on stack: |
---|
213 | | -! int *SRC_ERR_PTR |
---|
214 | | -! int *DST_ERR_PTR |
---|
215 | 194 | ! |
---|
216 | 195 | ENTRY(csum_partial_copy_generic) |
---|
217 | | - mov.l r5,@-r15 |
---|
218 | | - mov.l r6,@-r15 |
---|
219 | | - |
---|
| 196 | + mov #-1,r7 |
---|
220 | 197 | mov #3,r0 ! Check src and dest are equally aligned |
---|
221 | 198 | mov r4,r1 |
---|
222 | 199 | and r0,r1 |
---|
.. | .. |
---|
246 | 223 | clrt |
---|
247 | 224 | .align 2 |
---|
248 | 225 | 5: |
---|
249 | | -SRC( mov.b @r4+,r1 ) |
---|
250 | | -SRC( mov.b @r4+,r0 ) |
---|
| 226 | +EXC( mov.b @r4+,r1 ) |
---|
| 227 | +EXC( mov.b @r4+,r0 ) |
---|
251 | 228 | extu.b r1,r1 |
---|
252 | | -DST( mov.b r1,@r5 ) |
---|
253 | | -DST( mov.b r0,@(1,r5) ) |
---|
| 229 | +EXC( mov.b r1,@r5 ) |
---|
| 230 | +EXC( mov.b r0,@(1,r5) ) |
---|
254 | 231 | extu.b r0,r0 |
---|
255 | 232 | add #2,r5 |
---|
256 | 233 | |
---|
.. | .. |
---|
279 | 256 | ! Handle first two bytes as a special case |
---|
280 | 257 | .align 2 |
---|
281 | 258 | 1: |
---|
282 | | -SRC( mov.w @r4+,r0 ) |
---|
283 | | -DST( mov.w r0,@r5 ) |
---|
| 259 | +EXC( mov.w @r4+,r0 ) |
---|
| 260 | +EXC( mov.w r0,@r5 ) |
---|
284 | 261 | add #2,r5 |
---|
285 | 262 | extu.w r0,r0 |
---|
286 | 263 | addc r0,r7 |
---|
.. | .. |
---|
295 | 272 | clrt |
---|
296 | 273 | .align 2 |
---|
297 | 274 | 1: |
---|
298 | | -SRC( mov.l @r4+,r0 ) |
---|
299 | | -SRC( mov.l @r4+,r1 ) |
---|
| 275 | +EXC( mov.l @r4+,r0 ) |
---|
| 276 | +EXC( mov.l @r4+,r1 ) |
---|
300 | 277 | addc r0,r7 |
---|
301 | | -DST( mov.l r0,@r5 ) |
---|
302 | | -DST( mov.l r1,@(4,r5) ) |
---|
| 278 | +EXC( mov.l r0,@r5 ) |
---|
| 279 | +EXC( mov.l r1,@(4,r5) ) |
---|
303 | 280 | addc r1,r7 |
---|
304 | 281 | |
---|
305 | | -SRC( mov.l @r4+,r0 ) |
---|
306 | | -SRC( mov.l @r4+,r1 ) |
---|
| 282 | +EXC( mov.l @r4+,r0 ) |
---|
| 283 | +EXC( mov.l @r4+,r1 ) |
---|
307 | 284 | addc r0,r7 |
---|
308 | | -DST( mov.l r0,@(8,r5) ) |
---|
309 | | -DST( mov.l r1,@(12,r5) ) |
---|
| 285 | +EXC( mov.l r0,@(8,r5) ) |
---|
| 286 | +EXC( mov.l r1,@(12,r5) ) |
---|
310 | 287 | addc r1,r7 |
---|
311 | 288 | |
---|
312 | | -SRC( mov.l @r4+,r0 ) |
---|
313 | | -SRC( mov.l @r4+,r1 ) |
---|
| 289 | +EXC( mov.l @r4+,r0 ) |
---|
| 290 | +EXC( mov.l @r4+,r1 ) |
---|
314 | 291 | addc r0,r7 |
---|
315 | | -DST( mov.l r0,@(16,r5) ) |
---|
316 | | -DST( mov.l r1,@(20,r5) ) |
---|
| 292 | +EXC( mov.l r0,@(16,r5) ) |
---|
| 293 | +EXC( mov.l r1,@(20,r5) ) |
---|
317 | 294 | addc r1,r7 |
---|
318 | 295 | |
---|
319 | | -SRC( mov.l @r4+,r0 ) |
---|
320 | | -SRC( mov.l @r4+,r1 ) |
---|
| 296 | +EXC( mov.l @r4+,r0 ) |
---|
| 297 | +EXC( mov.l @r4+,r1 ) |
---|
321 | 298 | addc r0,r7 |
---|
322 | | -DST( mov.l r0,@(24,r5) ) |
---|
323 | | -DST( mov.l r1,@(28,r5) ) |
---|
| 299 | +EXC( mov.l r0,@(24,r5) ) |
---|
| 300 | +EXC( mov.l r1,@(28,r5) ) |
---|
324 | 301 | addc r1,r7 |
---|
325 | 302 | add #32,r5 |
---|
326 | 303 | movt r0 |
---|
.. | .. |
---|
338 | 315 | clrt |
---|
339 | 316 | shlr2 r6 |
---|
340 | 317 | 3: |
---|
341 | | -SRC( mov.l @r4+,r0 ) |
---|
| 318 | +EXC( mov.l @r4+,r0 ) |
---|
342 | 319 | addc r0,r7 |
---|
343 | | -DST( mov.l r0,@r5 ) |
---|
| 320 | +EXC( mov.l r0,@r5 ) |
---|
344 | 321 | add #4,r5 |
---|
345 | 322 | movt r0 |
---|
346 | 323 | dt r6 |
---|
.. | .. |
---|
356 | 333 | mov #2,r1 |
---|
357 | 334 | cmp/hs r1,r6 |
---|
358 | 335 | bf 5f |
---|
359 | | -SRC( mov.w @r4+,r0 ) |
---|
360 | | -DST( mov.w r0,@r5 ) |
---|
| 336 | +EXC( mov.w @r4+,r0 ) |
---|
| 337 | +EXC( mov.w r0,@r5 ) |
---|
361 | 338 | extu.w r0,r0 |
---|
362 | 339 | add #2,r5 |
---|
363 | 340 | cmp/eq r1,r6 |
---|
.. | .. |
---|
366 | 343 | shll16 r0 |
---|
367 | 344 | addc r0,r7 |
---|
368 | 345 | 5: |
---|
369 | | -SRC( mov.b @r4+,r0 ) |
---|
370 | | -DST( mov.b r0,@r5 ) |
---|
| 346 | +EXC( mov.b @r4+,r0 ) |
---|
| 347 | +EXC( mov.b r0,@r5 ) |
---|
371 | 348 | extu.b r0,r0 |
---|
372 | 349 | #ifndef __LITTLE_ENDIAN__ |
---|
373 | 350 | shll8 r0 |
---|
.. | .. |
---|
376 | 353 | mov #0,r0 |
---|
377 | 354 | addc r0,r7 |
---|
378 | 355 | 7: |
---|
379 | | -5000: |
---|
380 | 356 | |
---|
381 | 357 | # Exception handler: |
---|
382 | 358 | .section .fixup, "ax" |
---|
383 | 359 | |
---|
384 | 360 | 6001: |
---|
385 | | - mov.l @(8,r15),r0 ! src_err_ptr |
---|
386 | | - mov #-EFAULT,r1 |
---|
387 | | - mov.l r1,@r0 |
---|
388 | | - |
---|
389 | | - ! zero the complete destination - computing the rest |
---|
390 | | - ! is too much work |
---|
391 | | - mov.l @(4,r15),r5 ! dst |
---|
392 | | - mov.l @r15,r6 ! len |
---|
393 | | - mov #0,r7 |
---|
394 | | -1: mov.b r7,@r5 |
---|
395 | | - dt r6 |
---|
396 | | - bf/s 1b |
---|
397 | | - add #1,r5 |
---|
398 | | - mov.l 8000f,r0 |
---|
399 | | - jmp @r0 |
---|
400 | | - nop |
---|
401 | | - .align 2 |
---|
402 | | -8000: .long 5000b |
---|
403 | | - |
---|
404 | | -6002: |
---|
405 | | - mov.l @(12,r15),r0 ! dst_err_ptr |
---|
406 | | - mov #-EFAULT,r1 |
---|
407 | | - mov.l r1,@r0 |
---|
408 | | - mov.l 8001f,r0 |
---|
409 | | - jmp @r0 |
---|
410 | | - nop |
---|
411 | | - .align 2 |
---|
412 | | -8001: .long 5000b |
---|
413 | | - |
---|
| 361 | + rts |
---|
| 362 | + mov #0,r0 |
---|
414 | 363 | .previous |
---|
415 | | - add #8,r15 |
---|
416 | 364 | rts |
---|
417 | 365 | mov r7,r0 |
---|