123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * String handling functions for PowerPC32
- *
- * Copyright (C) 1996 Paul Mackerras.
- *
- */
- #include <asm/ppc_asm.h>
- #include <asm/export.h>
- #include <asm/cache.h>
- .text
- CACHELINE_BYTES = L1_CACHE_BYTES
- LG_CACHELINE_BYTES = L1_CACHE_SHIFT
- CACHELINE_MASK = (L1_CACHE_BYTES-1)
- _GLOBAL(__arch_clear_user)
- /*
- * Use dcbz on the complete cache lines in the destination
- * to set them to zero. This requires that the destination
- * area is cacheable.
- */
- cmplwi cr0, r4, 4
- mr r10, r3
- li r3, 0
- blt 7f
- 11: stw r3, 0(r10)
- beqlr
- andi. r0, r10, 3
- add r11, r0, r4
- subf r6, r0, r10
- clrlwi r7, r6, 32 - LG_CACHELINE_BYTES
- add r8, r7, r11
- srwi r9, r8, LG_CACHELINE_BYTES
- addic. r9, r9, -1 /* total number of complete cachelines */
- ble 2f
- xori r0, r7, CACHELINE_MASK & ~3
- srwi. r0, r0, 2
- beq 3f
- mtctr r0
- 4: stwu r3, 4(r6)
- bdnz 4b
- 3: mtctr r9
- li r7, 4
- 10: dcbz r7, r6
- addi r6, r6, CACHELINE_BYTES
- bdnz 10b
- clrlwi r11, r8, 32 - LG_CACHELINE_BYTES
- addi r11, r11, 4
- 2: srwi r0 ,r11 ,2
- mtctr r0
- bdz 6f
- 1: stwu r3, 4(r6)
- bdnz 1b
- 6: andi. r11, r11, 3
- beqlr
- mtctr r11
- addi r6, r6, 3
- 8: stbu r3, 1(r6)
- bdnz 8b
- blr
- 7: cmpwi cr0, r4, 0
- beqlr
- mtctr r4
- addi r6, r10, -1
- 9: stbu r3, 1(r6)
- bdnz 9b
- blr
- 90: mr r3, r4
- blr
- 91: add r3, r10, r4
- subf r3, r6, r3
- blr
- EX_TABLE(11b, 90b)
- EX_TABLE(4b, 91b)
- EX_TABLE(10b, 91b)
- EX_TABLE(1b, 91b)
- EX_TABLE(8b, 91b)
- EX_TABLE(9b, 91b)
- EXPORT_SYMBOL(__arch_clear_user)
|