blob: 49100572c260cfbab4bd6e1af51127e899a18151 [file] [log] [blame]
// 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 1
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;
}