81 lines
1.5 KiB
C
81 lines
1.5 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <linux/types.h>
|
|
#include <linux/string.h>
|
|
#include <linux/ctype.h>
|
|
#include <malloc.h>
|
|
|
|
/* version for uasan without check */
|
|
|
|
void *__memset(void *s, int c, size_t count)
|
|
{
|
|
unsigned long *sl = (unsigned long *)s;
|
|
char *s8;
|
|
|
|
#if !CONFIG_IS_ENABLED(TINY_MEMSET)
|
|
unsigned long cl = 0;
|
|
int i;
|
|
|
|
/* do it one word at a time (32 bits or 64 bits) while possible */
|
|
if (((ulong)s & (sizeof(*sl) - 1)) == 0) {
|
|
for (i = 0; i < sizeof(*sl); i++) {
|
|
cl <<= 8;
|
|
cl |= c & 0xff;
|
|
}
|
|
while (count >= sizeof(*sl)) {
|
|
*sl++ = cl;
|
|
count -= sizeof(*sl);
|
|
}
|
|
}
|
|
#endif /* fill 8 bits at a time */
|
|
s8 = (char *)sl;
|
|
while (count--)
|
|
*s8++ = c;
|
|
|
|
return s;
|
|
}
|
|
|
|
void *__memcpy(void *dest, const void *src, size_t count)
|
|
{
|
|
unsigned long *dl = (unsigned long *)dest, *sl = (unsigned long *)src;
|
|
char *d8, *s8;
|
|
|
|
if (src == dest)
|
|
return dest;
|
|
|
|
/* while all data is aligned (common case), copy a word at a time */
|
|
if ((((ulong)dest | (ulong)src) & (sizeof(*dl) - 1)) == 0) {
|
|
while (count >= sizeof(*dl)) {
|
|
*dl++ = *sl++;
|
|
count -= sizeof(*dl);
|
|
}
|
|
}
|
|
/* copy the reset one byte at a time */
|
|
d8 = (char *)dl;
|
|
s8 = (char *)sl;
|
|
while (count--)
|
|
*d8++ = *s8++;
|
|
|
|
return dest;
|
|
}
|
|
|
|
void *__memmove(void *dest, const void *src, size_t count)
|
|
{
|
|
char *tmp, *s;
|
|
|
|
if (dest <= src) {
|
|
memcpy(dest, src, count);
|
|
} else {
|
|
tmp = (char *)dest + count;
|
|
s = (char *)src + count;
|
|
while (count--)
|
|
*--tmp = *--s;
|
|
}
|
|
|
|
return dest;
|
|
}
|