^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * String handling functions for PowerPC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1996 Paul Mackerras.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/ppc_asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/kasan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifndef CONFIG_KASAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) _GLOBAL(__memset16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) rlwimi r4,r4,16,0,15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* fall through */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) _GLOBAL(__memset32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) rldimi r4,r4,32,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /* fall through */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) _GLOBAL(__memset64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) neg r0,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) andi. r0,r0,7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) cmplw cr1,r5,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) b .Lms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) EXPORT_SYMBOL(__memset16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) EXPORT_SYMBOL(__memset32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) EXPORT_SYMBOL(__memset64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) _GLOBAL_KASAN(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) neg r0,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) rlwimi r4,r4,8,16,23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) andi. r0,r0,7 /* # bytes to be 8-byte aligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) rlwimi r4,r4,16,0,15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) cmplw cr1,r5,r0 /* do we get that far? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) rldimi r4,r4,32,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .Lms: PPC_MTOCRF(1,r0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) mr r6,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) blt cr1,8f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) beq 3f /* if already 8-byte aligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) subf r5,r0,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) bf 31,1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) stb r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) addi r6,r6,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 1: bf 30,2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) sth r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) addi r6,r6,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 2: bf 29,3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) stw r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) addi r6,r6,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 3: srdi. r0,r5,6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) clrldi r5,r5,58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) mtctr r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) beq 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .balign 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 4: std r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) std r4,8(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) std r4,16(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) std r4,24(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) std r4,32(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) std r4,40(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) std r4,48(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) std r4,56(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) addi r6,r6,64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bdnz 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 5: srwi. r0,r5,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) clrlwi r5,r5,29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) PPC_MTOCRF(1,r0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) beq 8f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) bf 29,6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) std r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) std r4,8(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) std r4,16(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) std r4,24(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) addi r6,r6,32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) 6: bf 30,7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) std r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) std r4,8(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) addi r6,r6,16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 7: bf 31,8f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) std r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) addi r6,r6,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 8: cmpwi r5,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) PPC_MTOCRF(1,r5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) beqlr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) bf 29,9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) stw r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) addi r6,r6,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 9: bf 30,10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) sth r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) addi r6,r6,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 10: bflr 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) stb r4,0(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) EXPORT_SYMBOL(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EXPORT_SYMBOL_KASAN(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) _GLOBAL_TOC_KASAN(memmove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) cmplw 0,r3,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) bgt backwards_memcpy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) b memcpy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) _GLOBAL(backwards_memcpy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) add r6,r3,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) add r4,r4,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) beq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) andi. r0,r6,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) mtctr r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) bne 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .balign 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 1: lwz r7,-4(r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) lwzu r8,-8(r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) stw r7,-4(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) stwu r8,-8(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) bdnz 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) andi. r5,r5,7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 2: cmplwi 0,r5,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) blt 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) lwzu r0,-4(r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) subi r5,r5,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) stwu r0,-4(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 3: cmpwi 0,r5,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) beqlr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) mtctr r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 4: lbzu r0,-1(r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) stbu r0,-1(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) bdnz 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 5: mtctr r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 6: lbzu r7,-1(r4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) stbu r7,-1(r6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) bdnz 6b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) subf r5,r0,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) rlwinm. r7,r5,32-3,3,31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) beq 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) mtctr r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) b 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) EXPORT_SYMBOL(memmove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) EXPORT_SYMBOL_KASAN(memmove)