| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * This file contains assembly-language implementations |
|---|
| 3 | 4 | * of IP-style 1's complement checksum routines. |
|---|
| 4 | 5 | * |
|---|
| 5 | 6 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
|---|
| 6 | | - * |
|---|
| 7 | | - * This program is free software; you can redistribute it and/or |
|---|
| 8 | | - * modify it under the terms of the GNU General Public License |
|---|
| 9 | | - * as published by the Free Software Foundation; either version |
|---|
| 10 | | - * 2 of the License, or (at your option) any later version. |
|---|
| 11 | 7 | * |
|---|
| 12 | 8 | * Severely hacked about by Paul Mackerras (paulus@cs.anu.edu.au). |
|---|
| 13 | 9 | */ |
|---|
| .. | .. |
|---|
| 82 | 78 | |
|---|
| 83 | 79 | /* |
|---|
| 84 | 80 | * Computes the checksum of a memory block at src, length len, |
|---|
| 85 | | - * and adds in "sum" (32-bit), while copying the block to dst. |
|---|
| 86 | | - * If an access exception occurs on src or dst, it stores -EFAULT |
|---|
| 87 | | - * to *src_err or *dst_err respectively, and (for an error on |
|---|
| 88 | | - * src) zeroes the rest of dst. |
|---|
| 81 | + * and adds in 0xffffffff, while copying the block to dst. |
|---|
| 82 | + * If an access exception occurs it returns zero. |
|---|
| 89 | 83 | * |
|---|
| 90 | | - * csum_partial_copy_generic(src, dst, len, sum, src_err, dst_err) |
|---|
| 84 | + * csum_partial_copy_generic(src, dst, len) |
|---|
| 91 | 85 | */ |
|---|
| 92 | 86 | #define CSUM_COPY_16_BYTES_WITHEX(n) \ |
|---|
| 93 | 87 | 8 ## n ## 0: \ |
|---|
| .. | .. |
|---|
| 112 | 106 | adde r12,r12,r10 |
|---|
| 113 | 107 | |
|---|
| 114 | 108 | #define CSUM_COPY_16_BYTES_EXCODE(n) \ |
|---|
| 115 | | - EX_TABLE(8 ## n ## 0b, src_error); \ |
|---|
| 116 | | - EX_TABLE(8 ## n ## 1b, src_error); \ |
|---|
| 117 | | - EX_TABLE(8 ## n ## 2b, src_error); \ |
|---|
| 118 | | - EX_TABLE(8 ## n ## 3b, src_error); \ |
|---|
| 119 | | - EX_TABLE(8 ## n ## 4b, dst_error); \ |
|---|
| 120 | | - EX_TABLE(8 ## n ## 5b, dst_error); \ |
|---|
| 121 | | - EX_TABLE(8 ## n ## 6b, dst_error); \ |
|---|
| 122 | | - EX_TABLE(8 ## n ## 7b, dst_error); |
|---|
| 109 | + EX_TABLE(8 ## n ## 0b, fault); \ |
|---|
| 110 | + EX_TABLE(8 ## n ## 1b, fault); \ |
|---|
| 111 | + EX_TABLE(8 ## n ## 2b, fault); \ |
|---|
| 112 | + EX_TABLE(8 ## n ## 3b, fault); \ |
|---|
| 113 | + EX_TABLE(8 ## n ## 4b, fault); \ |
|---|
| 114 | + EX_TABLE(8 ## n ## 5b, fault); \ |
|---|
| 115 | + EX_TABLE(8 ## n ## 6b, fault); \ |
|---|
| 116 | + EX_TABLE(8 ## n ## 7b, fault); |
|---|
| 123 | 117 | |
|---|
| 124 | 118 | .text |
|---|
| 125 | 119 | .stabs "arch/powerpc/lib/",N_SO,0,0,0f |
|---|
| .. | .. |
|---|
| 131 | 125 | CACHELINE_MASK = (L1_CACHE_BYTES-1) |
|---|
| 132 | 126 | |
|---|
| 133 | 127 | _GLOBAL(csum_partial_copy_generic) |
|---|
| 134 | | - stwu r1,-16(r1) |
|---|
| 135 | | - stw r7,12(r1) |
|---|
| 136 | | - stw r8,8(r1) |
|---|
| 137 | | - |
|---|
| 138 | | - addic r12,r6,0 |
|---|
| 128 | + li r12,-1 |
|---|
| 129 | + addic r0,r0,0 /* clear carry */ |
|---|
| 139 | 130 | addi r6,r4,-4 |
|---|
| 140 | 131 | neg r0,r4 |
|---|
| 141 | 132 | addi r4,r3,-4 |
|---|
| .. | .. |
|---|
| 245 | 236 | slwi r0,r0,8 |
|---|
| 246 | 237 | adde r12,r12,r0 |
|---|
| 247 | 238 | 66: addze r3,r12 |
|---|
| 248 | | - addi r1,r1,16 |
|---|
| 249 | 239 | beqlr+ cr7 |
|---|
| 250 | 240 | rlwinm r3,r3,8,0,31 /* odd destination address: rotate one byte */ |
|---|
| 251 | 241 | blr |
|---|
| 252 | 242 | |
|---|
| 253 | | -/* read fault */ |
|---|
| 254 | | -src_error: |
|---|
| 255 | | - lwz r7,12(r1) |
|---|
| 256 | | - addi r1,r1,16 |
|---|
| 257 | | - cmpwi cr0,r7,0 |
|---|
| 258 | | - beqlr |
|---|
| 259 | | - li r0,-EFAULT |
|---|
| 260 | | - stw r0,0(r7) |
|---|
| 261 | | - blr |
|---|
| 262 | | -/* write fault */ |
|---|
| 263 | | -dst_error: |
|---|
| 264 | | - lwz r8,8(r1) |
|---|
| 265 | | - addi r1,r1,16 |
|---|
| 266 | | - cmpwi cr0,r8,0 |
|---|
| 267 | | - beqlr |
|---|
| 268 | | - li r0,-EFAULT |
|---|
| 269 | | - stw r0,0(r8) |
|---|
| 243 | +fault: |
|---|
| 244 | + li r3,0 |
|---|
| 270 | 245 | blr |
|---|
| 271 | 246 | |
|---|
| 272 | | - EX_TABLE(70b, src_error); |
|---|
| 273 | | - EX_TABLE(71b, dst_error); |
|---|
| 274 | | - EX_TABLE(72b, src_error); |
|---|
| 275 | | - EX_TABLE(73b, dst_error); |
|---|
| 276 | | - EX_TABLE(54b, dst_error); |
|---|
| 247 | + EX_TABLE(70b, fault); |
|---|
| 248 | + EX_TABLE(71b, fault); |
|---|
| 249 | + EX_TABLE(72b, fault); |
|---|
| 250 | + EX_TABLE(73b, fault); |
|---|
| 251 | + EX_TABLE(54b, fault); |
|---|
| 277 | 252 | |
|---|
| 278 | 253 | /* |
|---|
| 279 | 254 | * this stuff handles faults in the cacheline loop and branches to either |
|---|
| 280 | | - * src_error (if in read part) or dst_error (if in write part) |
|---|
| 255 | + * fault (if in read part) or fault (if in write part) |
|---|
| 281 | 256 | */ |
|---|
| 282 | 257 | CSUM_COPY_16_BYTES_EXCODE(0) |
|---|
| 283 | 258 | #if L1_CACHE_BYTES >= 32 |
|---|
| .. | .. |
|---|
| 294 | 269 | #endif |
|---|
| 295 | 270 | #endif |
|---|
| 296 | 271 | |
|---|
| 297 | | - EX_TABLE(30b, src_error); |
|---|
| 298 | | - EX_TABLE(31b, dst_error); |
|---|
| 299 | | - EX_TABLE(40b, src_error); |
|---|
| 300 | | - EX_TABLE(41b, dst_error); |
|---|
| 301 | | - EX_TABLE(50b, src_error); |
|---|
| 302 | | - EX_TABLE(51b, dst_error); |
|---|
| 272 | + EX_TABLE(30b, fault); |
|---|
| 273 | + EX_TABLE(31b, fault); |
|---|
| 274 | + EX_TABLE(40b, fault); |
|---|
| 275 | + EX_TABLE(41b, fault); |
|---|
| 276 | + EX_TABLE(50b, fault); |
|---|
| 277 | + EX_TABLE(51b, fault); |
|---|
| 303 | 278 | |
|---|
| 304 | 279 | EXPORT_SYMBOL(csum_partial_copy_generic) |
|---|
| 305 | 280 | |
|---|