diff --git a/arch/lkl/include/asm/string.h b/arch/lkl/include/asm/string.h index a525cc44a3ed49..66d13930c14ac0 100644 --- a/arch/lkl/include/asm/string.h +++ b/arch/lkl/include/asm/string.h @@ -38,8 +38,36 @@ static inline void *__memset(void *s, int c, size_t count) return s; } +#define __HAVE_ARCH_MEMMOVE +static inline void *__memmove(void *dest, const void *src, size_t count) +{ + char *tmp; + const char *s; + + if (lkl_ops->memmove) + return lkl_ops->memmove(dest, src, count); + + /* from lib/string.c */ + + if (dest <= src) { + tmp = dest; + s = src; + while (count--) + *tmp++ = *s++; + } else { + tmp = dest; + tmp += count; + s = src; + s += count; + while (count--) + *--tmp = *--s; + } + return dest; +} + #define memcpy(dst, src, len) __memcpy(dst, src, len) #define memset(s, c, n) __memset(s, c, n) +#define memmove(dst, src, len) __memmove(dst, src, len) #if defined(CONFIG_KASAN) @@ -57,8 +85,10 @@ static inline void *__memset(void *s, int c, size_t count) #undef memcpy #undef memset +#undef memmove extern void *memset(void *dst, int c, __kernel_size_t count); extern void *memcpy(void *dst, const void *src, __kernel_size_t count); +extern void *memmove(void *dest, const void *src, size_t count); #endif /* __SANITIZE_ADDRESS__ */ diff --git a/arch/lkl/include/uapi/asm/host_ops.h b/arch/lkl/include/uapi/asm/host_ops.h index c2d3a65c47d268..ac4c0f1c7075c3 100644 --- a/arch/lkl/include/uapi/asm/host_ops.h +++ b/arch/lkl/include/uapi/asm/host_ops.h @@ -184,6 +184,7 @@ struct lkl_host_operations { void* (*memcpy)(void *dest, const void *src, unsigned long count); void* (*memset)(void *s, int c, unsigned long count); + void* (*memmove)(void *dest, const void *src, unsigned long count); void* (*mmap)(void *addr, unsigned long size, enum lkl_prot prot); int (*munmap)(void *addr, unsigned long size); diff --git a/tools/lkl/lib/posix-host.c b/tools/lkl/lib/posix-host.c index 63e1a9a2796469..63d46b1fca949c 100644 --- a/tools/lkl/lib/posix-host.c +++ b/tools/lkl/lib/posix-host.c @@ -569,6 +569,11 @@ static void *posix_memset(void *s, int c, unsigned long n) return memset(s, c, (size_t)n); } +static void *posix_memmove(void *dest, const void *src, unsigned long n) +{ + return memmove(dest, src, (size_t)n); +} + struct lkl_host_operations lkl_host_ops = { .panic = panic, .thread_create = thread_create, @@ -607,6 +612,7 @@ struct lkl_host_operations lkl_host_ops = { .jmp_buf_longjmp = jmp_buf_longjmp, .memcpy = posix_memcpy, .memset = posix_memset, + .memmove = posix_memmove, .mmap = lkl_mmap, .munmap = lkl_munmap, #ifdef LKL_HOST_CONFIG_MMU