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