| .. | .. |
|---|
| 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 |
|---|