mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 21:26:44 +07:00
479ba60358
Since 'extern inline' doesn't work correctly in the context of the Linux kernel (too many overriding defines), move the string functions to normal lib/ assembly files (like the existing mem funcs). This avoids the forced inline all over the kernel and allows us to place them constantly in L1. This also avoids some module failures when gcc inserts calls to string functions but the kernel build system doesn't fully consult the library archives. Signed-off-by: Robin Getz <robin.getz@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
53 lines
794 B
ArmAsm
53 lines
794 B
ArmAsm
/*
|
|
* Copyright 2005-2010 Analog Devices Inc.
|
|
*
|
|
* Licensed under the ADI BSD license or the GPL-2 (or later)
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
|
|
/* void *strncpy(char *dest, const char *src, size_t n);
|
|
* R0 = address (dest)
|
|
* R1 = address (src)
|
|
* R2 = size
|
|
* Returns a pointer to the destination string dest
|
|
*/
|
|
|
|
#ifdef CONFIG_STRNCPY_L1
|
|
.section .l1.text
|
|
#else
|
|
.text
|
|
#endif
|
|
|
|
.align 2
|
|
|
|
ENTRY(_strncpy)
|
|
CC = R2 == 0;
|
|
if CC JUMP 4f;
|
|
P0 = R0 ; /* dst*/
|
|
P1 = R1 ; /* src*/
|
|
|
|
1:
|
|
R1 = B [P1++] (Z);
|
|
B [P0++] = R1;
|
|
CC = R1;
|
|
if ! cc jump 2f;
|
|
R2 += -1;
|
|
CC = R2 == 0;
|
|
if ! cc jump 1b (bp);
|
|
jump 4f;
|
|
2:
|
|
/* if src is shorter than n, we need to null pad bytes in dest */
|
|
R1 = 0;
|
|
3:
|
|
R2 += -1;
|
|
CC = R2 == 0;
|
|
if cc jump 4f;
|
|
B [P0++] = R1;
|
|
jump 3b;
|
|
|
|
4:
|
|
RTS;
|
|
|
|
ENDPROC(_strncpy)
|