.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * INET An implementation of the TCP/IP protocol suite for the LINUX |
---|
3 | 4 | * operating system. INET is implemented using the BSD Socket |
---|
.. | .. |
---|
7 | 8 | * |
---|
8 | 9 | * Xtensa version: Copyright (C) 2001 Tensilica, Inc. by Kevin Chea |
---|
9 | 10 | * Optimized by Joe Taylor |
---|
10 | | - * |
---|
11 | | - * This program is free software; you can redistribute it and/or |
---|
12 | | - * modify it under the terms of the GNU General Public License |
---|
13 | | - * as published by the Free Software Foundation; either version |
---|
14 | | - * 2 of the License, or (at your option) any later version. |
---|
15 | 11 | */ |
---|
16 | 12 | |
---|
17 | 13 | #include <linux/errno.h> |
---|
18 | 14 | #include <linux/linkage.h> |
---|
19 | | -#include <variant/core.h> |
---|
20 | 15 | #include <asm/asmmacro.h> |
---|
| 16 | +#include <asm/core.h> |
---|
21 | 17 | |
---|
22 | 18 | /* |
---|
23 | 19 | * computes a partial checksum, e.g. for TCP/UDP fragments |
---|
.. | .. |
---|
47 | 43 | * Experiments with Ethernet and SLIP connections show that buf |
---|
48 | 44 | * is aligned on either a 2-byte or 4-byte boundary. |
---|
49 | 45 | */ |
---|
50 | | - entry sp, 32 |
---|
| 46 | + abi_entry_default |
---|
51 | 47 | extui a5, a2, 0, 2 |
---|
52 | 48 | bnez a5, 8f /* branch if 2-byte aligned */ |
---|
53 | 49 | /* Fall-through on common case, 4-byte alignment */ |
---|
.. | .. |
---|
111 | 107 | ONES_ADD(a4, a6) |
---|
112 | 108 | 7: |
---|
113 | 109 | mov a2, a4 |
---|
114 | | - retw |
---|
| 110 | + abi_ret_default |
---|
115 | 111 | |
---|
116 | 112 | /* uncommon case, buf is 2-byte aligned */ |
---|
117 | 113 | 8: |
---|
.. | .. |
---|
179 | 175 | */ |
---|
180 | 176 | |
---|
181 | 177 | /* |
---|
182 | | -unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, |
---|
183 | | - int sum, int *src_err_ptr, int *dst_err_ptr) |
---|
| 178 | +unsigned int csum_partial_copy_generic (const char *src, char *dst, int len) |
---|
184 | 179 | a2 = src |
---|
185 | 180 | a3 = dst |
---|
186 | 181 | a4 = len |
---|
187 | 182 | a5 = sum |
---|
188 | | - a6 = src_err_ptr |
---|
189 | | - a7 = dst_err_ptr |
---|
190 | 183 | a8 = temp |
---|
191 | 184 | a9 = temp |
---|
192 | 185 | a10 = temp |
---|
193 | | - a11 = original len for exception handling |
---|
194 | | - a12 = original dst for exception handling |
---|
195 | 186 | |
---|
196 | 187 | This function is optimized for 4-byte aligned addresses. Other |
---|
197 | 188 | alignments work, but not nearly as efficiently. |
---|
.. | .. |
---|
199 | 190 | |
---|
200 | 191 | ENTRY(csum_partial_copy_generic) |
---|
201 | 192 | |
---|
202 | | - entry sp, 32 |
---|
203 | | - mov a12, a3 |
---|
204 | | - mov a11, a4 |
---|
| 193 | + abi_entry_default |
---|
| 194 | + movi a5, -1 |
---|
205 | 195 | or a10, a2, a3 |
---|
206 | 196 | |
---|
207 | 197 | /* We optimize the following alignment tests for the 4-byte |
---|
.. | .. |
---|
232 | 222 | #endif |
---|
233 | 223 | EX(10f) l32i a9, a2, 0 |
---|
234 | 224 | EX(10f) l32i a8, a2, 4 |
---|
235 | | -EX(11f) s32i a9, a3, 0 |
---|
236 | | -EX(11f) s32i a8, a3, 4 |
---|
| 225 | +EX(10f) s32i a9, a3, 0 |
---|
| 226 | +EX(10f) s32i a8, a3, 4 |
---|
237 | 227 | ONES_ADD(a5, a9) |
---|
238 | 228 | ONES_ADD(a5, a8) |
---|
239 | 229 | EX(10f) l32i a9, a2, 8 |
---|
240 | 230 | EX(10f) l32i a8, a2, 12 |
---|
241 | | -EX(11f) s32i a9, a3, 8 |
---|
242 | | -EX(11f) s32i a8, a3, 12 |
---|
| 231 | +EX(10f) s32i a9, a3, 8 |
---|
| 232 | +EX(10f) s32i a8, a3, 12 |
---|
243 | 233 | ONES_ADD(a5, a9) |
---|
244 | 234 | ONES_ADD(a5, a8) |
---|
245 | 235 | EX(10f) l32i a9, a2, 16 |
---|
246 | 236 | EX(10f) l32i a8, a2, 20 |
---|
247 | | -EX(11f) s32i a9, a3, 16 |
---|
248 | | -EX(11f) s32i a8, a3, 20 |
---|
| 237 | +EX(10f) s32i a9, a3, 16 |
---|
| 238 | +EX(10f) s32i a8, a3, 20 |
---|
249 | 239 | ONES_ADD(a5, a9) |
---|
250 | 240 | ONES_ADD(a5, a8) |
---|
251 | 241 | EX(10f) l32i a9, a2, 24 |
---|
252 | 242 | EX(10f) l32i a8, a2, 28 |
---|
253 | | -EX(11f) s32i a9, a3, 24 |
---|
254 | | -EX(11f) s32i a8, a3, 28 |
---|
| 243 | +EX(10f) s32i a9, a3, 24 |
---|
| 244 | +EX(10f) s32i a8, a3, 28 |
---|
255 | 245 | ONES_ADD(a5, a9) |
---|
256 | 246 | ONES_ADD(a5, a8) |
---|
257 | 247 | addi a2, a2, 32 |
---|
.. | .. |
---|
271 | 261 | .Loop6: |
---|
272 | 262 | #endif |
---|
273 | 263 | EX(10f) l32i a9, a2, 0 |
---|
274 | | -EX(11f) s32i a9, a3, 0 |
---|
| 264 | +EX(10f) s32i a9, a3, 0 |
---|
275 | 265 | ONES_ADD(a5, a9) |
---|
276 | 266 | addi a2, a2, 4 |
---|
277 | 267 | addi a3, a3, 4 |
---|
.. | .. |
---|
302 | 292 | .Loop7: |
---|
303 | 293 | #endif |
---|
304 | 294 | EX(10f) l16ui a9, a2, 0 |
---|
305 | | -EX(11f) s16i a9, a3, 0 |
---|
| 295 | +EX(10f) s16i a9, a3, 0 |
---|
306 | 296 | ONES_ADD(a5, a9) |
---|
307 | 297 | addi a2, a2, 2 |
---|
308 | 298 | addi a3, a3, 2 |
---|
.. | .. |
---|
313 | 303 | /* This section processes a possible trailing odd byte. */ |
---|
314 | 304 | _bbci.l a4, 0, 8f /* 1-byte chunk */ |
---|
315 | 305 | EX(10f) l8ui a9, a2, 0 |
---|
316 | | -EX(11f) s8i a9, a3, 0 |
---|
| 306 | +EX(10f) s8i a9, a3, 0 |
---|
317 | 307 | #ifdef __XTENSA_EB__ |
---|
318 | 308 | slli a9, a9, 8 /* shift byte to bits 8..15 */ |
---|
319 | 309 | #endif |
---|
320 | 310 | ONES_ADD(a5, a9) |
---|
321 | 311 | 8: |
---|
322 | 312 | mov a2, a5 |
---|
323 | | - retw |
---|
| 313 | + abi_ret_default |
---|
324 | 314 | |
---|
325 | 315 | 5: |
---|
326 | 316 | /* Control branch to here when either src or dst is odd. We |
---|
.. | .. |
---|
338 | 328 | #endif |
---|
339 | 329 | EX(10f) l8ui a9, a2, 0 |
---|
340 | 330 | EX(10f) l8ui a8, a2, 1 |
---|
341 | | -EX(11f) s8i a9, a3, 0 |
---|
342 | | -EX(11f) s8i a8, a3, 1 |
---|
| 331 | +EX(10f) s8i a9, a3, 0 |
---|
| 332 | +EX(10f) s8i a8, a3, 1 |
---|
343 | 333 | #ifdef __XTENSA_EB__ |
---|
344 | 334 | slli a9, a9, 8 /* combine into a single 16-bit value */ |
---|
345 | 335 | #else /* for checksum computation */ |
---|
.. | .. |
---|
360 | 350 | |
---|
361 | 351 | # Exception handler: |
---|
362 | 352 | .section .fixup, "ax" |
---|
363 | | -/* |
---|
364 | | - a6 = src_err_ptr |
---|
365 | | - a7 = dst_err_ptr |
---|
366 | | - a11 = original len for exception handling |
---|
367 | | - a12 = original dst for exception handling |
---|
368 | | -*/ |
---|
369 | | - |
---|
370 | 353 | 10: |
---|
371 | | - _movi a2, -EFAULT |
---|
372 | | - s32i a2, a6, 0 /* src_err_ptr */ |
---|
373 | | - |
---|
374 | | - # clear the complete destination - computing the rest |
---|
375 | | - # is too much work |
---|
376 | 354 | movi a2, 0 |
---|
377 | | -#if XCHAL_HAVE_LOOPS |
---|
378 | | - loopgtz a11, 2f |
---|
379 | | -#else |
---|
380 | | - beqz a11, 2f |
---|
381 | | - add a11, a11, a12 /* a11 = ending address */ |
---|
382 | | -.Leloop: |
---|
383 | | -#endif |
---|
384 | | - s8i a2, a12, 0 |
---|
385 | | - addi a12, a12, 1 |
---|
386 | | -#if !XCHAL_HAVE_LOOPS |
---|
387 | | - blt a12, a11, .Leloop |
---|
388 | | -#endif |
---|
389 | | -2: |
---|
390 | | - retw |
---|
391 | | - |
---|
392 | | -11: |
---|
393 | | - movi a2, -EFAULT |
---|
394 | | - s32i a2, a7, 0 /* dst_err_ptr */ |
---|
395 | | - movi a2, 0 |
---|
396 | | - retw |
---|
| 355 | + abi_ret_default |
---|
397 | 356 | |
---|
398 | 357 | .previous |
---|