Skip to content

Commit 1219089

Browse files
authored
Merge pull request #580 from rodionov/memmove
Add LKL arch implementation of memmove.
2 parents 79948c5 + 1f01322 commit 1219089

3 files changed

Lines changed: 37 additions & 0 deletions

File tree

arch/lkl/include/asm/string.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,36 @@ static inline void *__memset(void *s, int c, size_t count)
3838
return s;
3939
}
4040

41+
#define __HAVE_ARCH_MEMMOVE
42+
static inline void *__memmove(void *dest, const void *src, size_t count)
43+
{
44+
char *tmp;
45+
const char *s;
46+
47+
if (lkl_ops->memmove)
48+
return lkl_ops->memmove(dest, src, count);
49+
50+
/* from lib/string.c */
51+
52+
if (dest <= src) {
53+
tmp = dest;
54+
s = src;
55+
while (count--)
56+
*tmp++ = *s++;
57+
} else {
58+
tmp = dest;
59+
tmp += count;
60+
s = src;
61+
s += count;
62+
while (count--)
63+
*--tmp = *--s;
64+
}
65+
return dest;
66+
}
67+
4168
#define memcpy(dst, src, len) __memcpy(dst, src, len)
4269
#define memset(s, c, n) __memset(s, c, n)
70+
#define memmove(dst, src, len) __memmove(dst, src, len)
4371

4472
#if defined(CONFIG_KASAN)
4573

@@ -57,8 +85,10 @@ static inline void *__memset(void *s, int c, size_t count)
5785

5886
#undef memcpy
5987
#undef memset
88+
#undef memmove
6089
extern void *memset(void *dst, int c, __kernel_size_t count);
6190
extern void *memcpy(void *dst, const void *src, __kernel_size_t count);
91+
extern void *memmove(void *dest, const void *src, size_t count);
6292

6393
#endif /* __SANITIZE_ADDRESS__ */
6494

arch/lkl/include/uapi/asm/host_ops.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ struct lkl_host_operations {
184184

185185
void* (*memcpy)(void *dest, const void *src, unsigned long count);
186186
void* (*memset)(void *s, int c, unsigned long count);
187+
void* (*memmove)(void *dest, const void *src, unsigned long count);
187188

188189
void* (*mmap)(void *addr, unsigned long size, enum lkl_prot prot);
189190
int (*munmap)(void *addr, unsigned long size);

tools/lkl/lib/posix-host.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,11 @@ static void *posix_memset(void *s, int c, unsigned long n)
569569
return memset(s, c, (size_t)n);
570570
}
571571

572+
static void *posix_memmove(void *dest, const void *src, unsigned long n)
573+
{
574+
return memmove(dest, src, (size_t)n);
575+
}
576+
572577
struct lkl_host_operations lkl_host_ops = {
573578
.panic = panic,
574579
.thread_create = thread_create,
@@ -607,6 +612,7 @@ struct lkl_host_operations lkl_host_ops = {
607612
.jmp_buf_longjmp = jmp_buf_longjmp,
608613
.memcpy = posix_memcpy,
609614
.memset = posix_memset,
615+
.memmove = posix_memmove,
610616
.mmap = lkl_mmap,
611617
.munmap = lkl_munmap,
612618
#ifdef LKL_HOST_CONFIG_MMU

0 commit comments

Comments
 (0)