diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch-x86_64.h index aece7d8951535a363e685ef221b48023304a8967..68609f42193485d015409b37af7ff91a53fc625d 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -179,6 +179,9 @@ void *memmove(void *dst, const void *src, size_t len); #define NOLIBC_ARCH_HAS_MEMCPY void *memcpy(void *dst, const void *src, size_t len); +#define NOLIBC_ARCH_HAS_MEMSET +void *memset(void *dst, int c, size_t len); + __asm__ ( ".section .text.nolibc_memmove_memcpy\n" ".weak memmove\n" @@ -200,6 +203,16 @@ __asm__ ( "rep movsb\n\t" "cld\n\t" "retq\n" + +".section .text.nolibc_memset\n" +".weak memset\n" +"memset:\n" + "xchgl %eax, %esi\n\t" + "movq %rdx, %rcx\n\t" + "pushq %rdi\n\t" + "rep stosb\n\t" + "popq %rax\n\t" + "retq\n" ); #endif /* _NOLIBC_ARCH_X86_64_H */ diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h index 6eca267ec6fa717712a2fd0d9e930f95a293da52..1bad6121ef8c4ab536569e5ba92f501c095fe341 100644 --- a/tools/include/nolibc/string.h +++ b/tools/include/nolibc/string.h @@ -84,6 +84,7 @@ void *memcpy(void *dst, const void *src, size_t len) } #endif /* #ifndef NOLIBC_ARCH_HAS_MEMCPY */ +#ifndef NOLIBC_ARCH_HAS_MEMSET /* might be ignored by the compiler without -ffreestanding, then found as * missing. */ @@ -99,6 +100,7 @@ void *memset(void *dst, int b, size_t len) } return dst; } +#endif /* #ifndef NOLIBC_ARCH_HAS_MEMSET */ static __attribute__((unused)) char *strchr(const char *s, int c)