diff --git a/arch/x86/kernel/include/arch-string.h b/arch/x86/kernel/include/arch-string.h index c80ab1ea..8ce2a537 100644 --- a/arch/x86/kernel/include/arch-string.h +++ b/arch/x86/kernel/include/arch-string.h @@ -20,4 +20,23 @@ static inline void *__inline_memcpy(void *to, const void *from, size_t n) return to; } +#define ARCH_FAST_MEMSET + +static inline void *__inline_memset(void *s, unsigned long c, size_t count) +{ + int d0, d1; + asm volatile("rep ; stosl\n\t" + "testb $2,%b3\n\t" + "je 1f\n\t" + "stosw\n" + "1:\ttestb $1,%b3\n\t" + "je 2f\n\t" + "stosb\n" + "2:" + : "=&c" (d0), "=&D" (d1) + : "a" (c), "q" (count), "0" (count/4), "1" ((long)s) + : "memory"); + return s; +} + #endif diff --git a/lib/include/string.h b/lib/include/string.h index 948eecb5..e26a13ab 100644 --- a/lib/include/string.h +++ b/lib/include/string.h @@ -36,6 +36,10 @@ void *memset(void *s, int n, size_t l); #define fast_memcpy memcpy #endif +#ifdef ARCH_FAST_MEMSET +#define memset __inline_memset +#endif + extern int snprintf(char * buf, size_t size, const char *fmt, ...); extern int sprintf(char * buf, const char *fmt, ...); extern int sscanf(const char * buf, const char * fmt, ...); diff --git a/lib/string.c b/lib/string.c index 03c1dfe7..8977747f 100644 --- a/lib/string.c +++ b/lib/string.c @@ -13,6 +13,7 @@ #include #include #include +#include size_t strlen(const char *p) { @@ -153,6 +154,7 @@ void *memcpy_long(void *dest, const void *src, size_t n) return dest; } +#ifndef ARCH_FAST_MEMSET void *memset(void *s, int c, size_t n) { char *s_aligned = (void *)(((unsigned long)s + 7) & ~7); @@ -187,6 +189,7 @@ void *memset(void *s, int c, size_t n) return s; } +#endif int memcmp(const void *s1, const void *s2, size_t n) {