18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * String handling functions for PowerPC. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <asm/processor.h> 88c2ecf20Sopenharmony_ci#include <asm/errno.h> 98c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h> 108c2ecf20Sopenharmony_ci#include <asm/export.h> 118c2ecf20Sopenharmony_ci#include <asm/kasan.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#ifndef CONFIG_KASAN 148c2ecf20Sopenharmony_ci_GLOBAL(__memset16) 158c2ecf20Sopenharmony_ci rlwimi r4,r4,16,0,15 168c2ecf20Sopenharmony_ci /* fall through */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci_GLOBAL(__memset32) 198c2ecf20Sopenharmony_ci rldimi r4,r4,32,0 208c2ecf20Sopenharmony_ci /* fall through */ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci_GLOBAL(__memset64) 238c2ecf20Sopenharmony_ci neg r0,r3 248c2ecf20Sopenharmony_ci andi. r0,r0,7 258c2ecf20Sopenharmony_ci cmplw cr1,r5,r0 268c2ecf20Sopenharmony_ci b .Lms 278c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__memset16) 288c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__memset32) 298c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__memset64) 308c2ecf20Sopenharmony_ci#endif 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci_GLOBAL_KASAN(memset) 338c2ecf20Sopenharmony_ci neg r0,r3 348c2ecf20Sopenharmony_ci rlwimi r4,r4,8,16,23 358c2ecf20Sopenharmony_ci andi. r0,r0,7 /* # bytes to be 8-byte aligned */ 368c2ecf20Sopenharmony_ci rlwimi r4,r4,16,0,15 378c2ecf20Sopenharmony_ci cmplw cr1,r5,r0 /* do we get that far? */ 388c2ecf20Sopenharmony_ci rldimi r4,r4,32,0 398c2ecf20Sopenharmony_ci.Lms: PPC_MTOCRF(1,r0) 408c2ecf20Sopenharmony_ci mr r6,r3 418c2ecf20Sopenharmony_ci blt cr1,8f 428c2ecf20Sopenharmony_ci beq 3f /* if already 8-byte aligned */ 438c2ecf20Sopenharmony_ci subf r5,r0,r5 448c2ecf20Sopenharmony_ci bf 31,1f 458c2ecf20Sopenharmony_ci stb r4,0(r6) 468c2ecf20Sopenharmony_ci addi r6,r6,1 478c2ecf20Sopenharmony_ci1: bf 30,2f 488c2ecf20Sopenharmony_ci sth r4,0(r6) 498c2ecf20Sopenharmony_ci addi r6,r6,2 508c2ecf20Sopenharmony_ci2: bf 29,3f 518c2ecf20Sopenharmony_ci stw r4,0(r6) 528c2ecf20Sopenharmony_ci addi r6,r6,4 538c2ecf20Sopenharmony_ci3: srdi. r0,r5,6 548c2ecf20Sopenharmony_ci clrldi r5,r5,58 558c2ecf20Sopenharmony_ci mtctr r0 568c2ecf20Sopenharmony_ci beq 5f 578c2ecf20Sopenharmony_ci .balign 16 588c2ecf20Sopenharmony_ci4: std r4,0(r6) 598c2ecf20Sopenharmony_ci std r4,8(r6) 608c2ecf20Sopenharmony_ci std r4,16(r6) 618c2ecf20Sopenharmony_ci std r4,24(r6) 628c2ecf20Sopenharmony_ci std r4,32(r6) 638c2ecf20Sopenharmony_ci std r4,40(r6) 648c2ecf20Sopenharmony_ci std r4,48(r6) 658c2ecf20Sopenharmony_ci std r4,56(r6) 668c2ecf20Sopenharmony_ci addi r6,r6,64 678c2ecf20Sopenharmony_ci bdnz 4b 688c2ecf20Sopenharmony_ci5: srwi. r0,r5,3 698c2ecf20Sopenharmony_ci clrlwi r5,r5,29 708c2ecf20Sopenharmony_ci PPC_MTOCRF(1,r0) 718c2ecf20Sopenharmony_ci beq 8f 728c2ecf20Sopenharmony_ci bf 29,6f 738c2ecf20Sopenharmony_ci std r4,0(r6) 748c2ecf20Sopenharmony_ci std r4,8(r6) 758c2ecf20Sopenharmony_ci std r4,16(r6) 768c2ecf20Sopenharmony_ci std r4,24(r6) 778c2ecf20Sopenharmony_ci addi r6,r6,32 788c2ecf20Sopenharmony_ci6: bf 30,7f 798c2ecf20Sopenharmony_ci std r4,0(r6) 808c2ecf20Sopenharmony_ci std r4,8(r6) 818c2ecf20Sopenharmony_ci addi r6,r6,16 828c2ecf20Sopenharmony_ci7: bf 31,8f 838c2ecf20Sopenharmony_ci std r4,0(r6) 848c2ecf20Sopenharmony_ci addi r6,r6,8 858c2ecf20Sopenharmony_ci8: cmpwi r5,0 868c2ecf20Sopenharmony_ci PPC_MTOCRF(1,r5) 878c2ecf20Sopenharmony_ci beqlr 888c2ecf20Sopenharmony_ci bf 29,9f 898c2ecf20Sopenharmony_ci stw r4,0(r6) 908c2ecf20Sopenharmony_ci addi r6,r6,4 918c2ecf20Sopenharmony_ci9: bf 30,10f 928c2ecf20Sopenharmony_ci sth r4,0(r6) 938c2ecf20Sopenharmony_ci addi r6,r6,2 948c2ecf20Sopenharmony_ci10: bflr 31 958c2ecf20Sopenharmony_ci stb r4,0(r6) 968c2ecf20Sopenharmony_ci blr 978c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memset) 988c2ecf20Sopenharmony_ciEXPORT_SYMBOL_KASAN(memset) 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci_GLOBAL_TOC_KASAN(memmove) 1018c2ecf20Sopenharmony_ci cmplw 0,r3,r4 1028c2ecf20Sopenharmony_ci bgt backwards_memcpy 1038c2ecf20Sopenharmony_ci b memcpy 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci_GLOBAL(backwards_memcpy) 1068c2ecf20Sopenharmony_ci rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 1078c2ecf20Sopenharmony_ci add r6,r3,r5 1088c2ecf20Sopenharmony_ci add r4,r4,r5 1098c2ecf20Sopenharmony_ci beq 2f 1108c2ecf20Sopenharmony_ci andi. r0,r6,3 1118c2ecf20Sopenharmony_ci mtctr r7 1128c2ecf20Sopenharmony_ci bne 5f 1138c2ecf20Sopenharmony_ci .balign 16 1148c2ecf20Sopenharmony_ci1: lwz r7,-4(r4) 1158c2ecf20Sopenharmony_ci lwzu r8,-8(r4) 1168c2ecf20Sopenharmony_ci stw r7,-4(r6) 1178c2ecf20Sopenharmony_ci stwu r8,-8(r6) 1188c2ecf20Sopenharmony_ci bdnz 1b 1198c2ecf20Sopenharmony_ci andi. r5,r5,7 1208c2ecf20Sopenharmony_ci2: cmplwi 0,r5,4 1218c2ecf20Sopenharmony_ci blt 3f 1228c2ecf20Sopenharmony_ci lwzu r0,-4(r4) 1238c2ecf20Sopenharmony_ci subi r5,r5,4 1248c2ecf20Sopenharmony_ci stwu r0,-4(r6) 1258c2ecf20Sopenharmony_ci3: cmpwi 0,r5,0 1268c2ecf20Sopenharmony_ci beqlr 1278c2ecf20Sopenharmony_ci mtctr r5 1288c2ecf20Sopenharmony_ci4: lbzu r0,-1(r4) 1298c2ecf20Sopenharmony_ci stbu r0,-1(r6) 1308c2ecf20Sopenharmony_ci bdnz 4b 1318c2ecf20Sopenharmony_ci blr 1328c2ecf20Sopenharmony_ci5: mtctr r0 1338c2ecf20Sopenharmony_ci6: lbzu r7,-1(r4) 1348c2ecf20Sopenharmony_ci stbu r7,-1(r6) 1358c2ecf20Sopenharmony_ci bdnz 6b 1368c2ecf20Sopenharmony_ci subf r5,r0,r5 1378c2ecf20Sopenharmony_ci rlwinm. r7,r5,32-3,3,31 1388c2ecf20Sopenharmony_ci beq 2b 1398c2ecf20Sopenharmony_ci mtctr r7 1408c2ecf20Sopenharmony_ci b 1b 1418c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memmove) 1428c2ecf20Sopenharmony_ciEXPORT_SYMBOL_KASAN(memmove) 143