162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * String handling functions for PowerPC32 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/export.h> 1162306a36Sopenharmony_ci#include <asm/ppc_asm.h> 1262306a36Sopenharmony_ci#include <asm/cache.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci .text 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciCACHELINE_BYTES = L1_CACHE_BYTES 1762306a36Sopenharmony_ciLG_CACHELINE_BYTES = L1_CACHE_SHIFT 1862306a36Sopenharmony_ciCACHELINE_MASK = (L1_CACHE_BYTES-1) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci_GLOBAL(__arch_clear_user) 2162306a36Sopenharmony_ci/* 2262306a36Sopenharmony_ci * Use dcbz on the complete cache lines in the destination 2362306a36Sopenharmony_ci * to set them to zero. This requires that the destination 2462306a36Sopenharmony_ci * area is cacheable. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci cmplwi cr0, r4, 4 2762306a36Sopenharmony_ci mr r10, r3 2862306a36Sopenharmony_ci li r3, 0 2962306a36Sopenharmony_ci blt 7f 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci11: stw r3, 0(r10) 3262306a36Sopenharmony_ci beqlr 3362306a36Sopenharmony_ci andi. r0, r10, 3 3462306a36Sopenharmony_ci add r11, r0, r4 3562306a36Sopenharmony_ci subf r6, r0, r10 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci clrlwi r7, r6, 32 - LG_CACHELINE_BYTES 3862306a36Sopenharmony_ci add r8, r7, r11 3962306a36Sopenharmony_ci srwi r9, r8, LG_CACHELINE_BYTES 4062306a36Sopenharmony_ci addic. r9, r9, -1 /* total number of complete cachelines */ 4162306a36Sopenharmony_ci ble 2f 4262306a36Sopenharmony_ci xori r0, r7, CACHELINE_MASK & ~3 4362306a36Sopenharmony_ci srwi. r0, r0, 2 4462306a36Sopenharmony_ci beq 3f 4562306a36Sopenharmony_ci mtctr r0 4662306a36Sopenharmony_ci4: stwu r3, 4(r6) 4762306a36Sopenharmony_ci bdnz 4b 4862306a36Sopenharmony_ci3: mtctr r9 4962306a36Sopenharmony_ci li r7, 4 5062306a36Sopenharmony_ci10: dcbz r7, r6 5162306a36Sopenharmony_ci addi r6, r6, CACHELINE_BYTES 5262306a36Sopenharmony_ci bdnz 10b 5362306a36Sopenharmony_ci clrlwi r11, r8, 32 - LG_CACHELINE_BYTES 5462306a36Sopenharmony_ci addi r11, r11, 4 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci2: srwi r0 ,r11 ,2 5762306a36Sopenharmony_ci mtctr r0 5862306a36Sopenharmony_ci bdz 6f 5962306a36Sopenharmony_ci1: stwu r3, 4(r6) 6062306a36Sopenharmony_ci bdnz 1b 6162306a36Sopenharmony_ci6: andi. r11, r11, 3 6262306a36Sopenharmony_ci beqlr 6362306a36Sopenharmony_ci mtctr r11 6462306a36Sopenharmony_ci addi r6, r6, 3 6562306a36Sopenharmony_ci8: stbu r3, 1(r6) 6662306a36Sopenharmony_ci bdnz 8b 6762306a36Sopenharmony_ci blr 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci7: cmpwi cr0, r4, 0 7062306a36Sopenharmony_ci beqlr 7162306a36Sopenharmony_ci mtctr r4 7262306a36Sopenharmony_ci addi r6, r10, -1 7362306a36Sopenharmony_ci9: stbu r3, 1(r6) 7462306a36Sopenharmony_ci bdnz 9b 7562306a36Sopenharmony_ci blr 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci90: mr r3, r4 7862306a36Sopenharmony_ci blr 7962306a36Sopenharmony_ci91: add r3, r10, r4 8062306a36Sopenharmony_ci subf r3, r6, r3 8162306a36Sopenharmony_ci blr 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci EX_TABLE(11b, 90b) 8462306a36Sopenharmony_ci EX_TABLE(4b, 91b) 8562306a36Sopenharmony_ci EX_TABLE(10b, 91b) 8662306a36Sopenharmony_ci EX_TABLE(1b, 91b) 8762306a36Sopenharmony_ci EX_TABLE(8b, 91b) 8862306a36Sopenharmony_ci EX_TABLE(9b, 91b) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciEXPORT_SYMBOL(__arch_clear_user) 91