forked from Minki/linux
2874c5fd28
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 3029 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
143 lines
2.2 KiB
ArmAsm
143 lines
2.2 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* String handling functions for PowerPC.
|
|
*
|
|
* Copyright (C) 1996 Paul Mackerras.
|
|
*/
|
|
#include <asm/processor.h>
|
|
#include <asm/errno.h>
|
|
#include <asm/ppc_asm.h>
|
|
#include <asm/export.h>
|
|
#include <asm/kasan.h>
|
|
|
|
#ifndef CONFIG_KASAN
|
|
_GLOBAL(__memset16)
|
|
rlwimi r4,r4,16,0,15
|
|
/* fall through */
|
|
|
|
_GLOBAL(__memset32)
|
|
rldimi r4,r4,32,0
|
|
/* fall through */
|
|
|
|
_GLOBAL(__memset64)
|
|
neg r0,r3
|
|
andi. r0,r0,7
|
|
cmplw cr1,r5,r0
|
|
b .Lms
|
|
EXPORT_SYMBOL(__memset16)
|
|
EXPORT_SYMBOL(__memset32)
|
|
EXPORT_SYMBOL(__memset64)
|
|
#endif
|
|
|
|
_GLOBAL_KASAN(memset)
|
|
neg r0,r3
|
|
rlwimi r4,r4,8,16,23
|
|
andi. r0,r0,7 /* # bytes to be 8-byte aligned */
|
|
rlwimi r4,r4,16,0,15
|
|
cmplw cr1,r5,r0 /* do we get that far? */
|
|
rldimi r4,r4,32,0
|
|
.Lms: PPC_MTOCRF(1,r0)
|
|
mr r6,r3
|
|
blt cr1,8f
|
|
beq 3f /* if already 8-byte aligned */
|
|
subf r5,r0,r5
|
|
bf 31,1f
|
|
stb r4,0(r6)
|
|
addi r6,r6,1
|
|
1: bf 30,2f
|
|
sth r4,0(r6)
|
|
addi r6,r6,2
|
|
2: bf 29,3f
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
3: srdi. r0,r5,6
|
|
clrldi r5,r5,58
|
|
mtctr r0
|
|
beq 5f
|
|
.balign 16
|
|
4: std r4,0(r6)
|
|
std r4,8(r6)
|
|
std r4,16(r6)
|
|
std r4,24(r6)
|
|
std r4,32(r6)
|
|
std r4,40(r6)
|
|
std r4,48(r6)
|
|
std r4,56(r6)
|
|
addi r6,r6,64
|
|
bdnz 4b
|
|
5: srwi. r0,r5,3
|
|
clrlwi r5,r5,29
|
|
PPC_MTOCRF(1,r0)
|
|
beq 8f
|
|
bf 29,6f
|
|
std r4,0(r6)
|
|
std r4,8(r6)
|
|
std r4,16(r6)
|
|
std r4,24(r6)
|
|
addi r6,r6,32
|
|
6: bf 30,7f
|
|
std r4,0(r6)
|
|
std r4,8(r6)
|
|
addi r6,r6,16
|
|
7: bf 31,8f
|
|
std r4,0(r6)
|
|
addi r6,r6,8
|
|
8: cmpwi r5,0
|
|
PPC_MTOCRF(1,r5)
|
|
beqlr
|
|
bf 29,9f
|
|
stw r4,0(r6)
|
|
addi r6,r6,4
|
|
9: bf 30,10f
|
|
sth r4,0(r6)
|
|
addi r6,r6,2
|
|
10: bflr 31
|
|
stb r4,0(r6)
|
|
blr
|
|
EXPORT_SYMBOL(memset)
|
|
EXPORT_SYMBOL_KASAN(memset)
|
|
|
|
_GLOBAL_TOC_KASAN(memmove)
|
|
cmplw 0,r3,r4
|
|
bgt backwards_memcpy
|
|
b memcpy
|
|
|
|
_GLOBAL(backwards_memcpy)
|
|
rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
|
|
add r6,r3,r5
|
|
add r4,r4,r5
|
|
beq 2f
|
|
andi. r0,r6,3
|
|
mtctr r7
|
|
bne 5f
|
|
.balign 16
|
|
1: lwz r7,-4(r4)
|
|
lwzu r8,-8(r4)
|
|
stw r7,-4(r6)
|
|
stwu r8,-8(r6)
|
|
bdnz 1b
|
|
andi. r5,r5,7
|
|
2: cmplwi 0,r5,4
|
|
blt 3f
|
|
lwzu r0,-4(r4)
|
|
subi r5,r5,4
|
|
stwu r0,-4(r6)
|
|
3: cmpwi 0,r5,0
|
|
beqlr
|
|
mtctr r5
|
|
4: lbzu r0,-1(r4)
|
|
stbu r0,-1(r6)
|
|
bdnz 4b
|
|
blr
|
|
5: mtctr r0
|
|
6: lbzu r7,-1(r4)
|
|
stbu r7,-1(r6)
|
|
bdnz 6b
|
|
subf r5,r0,r5
|
|
rlwinm. r7,r5,32-3,3,31
|
|
beq 2b
|
|
mtctr r7
|
|
b 1b
|
|
EXPORT_SYMBOL(memmove)
|
|
EXPORT_SYMBOL_KASAN(memmove)
|