commit 8aa14b8b5b4bd8a65015c638812ae19af6f79980 Author: Mateusz Guzik Date: Mon Oct 1 23:38:22 2018 +0200 demo ifuncs for libc diff --git a/lib/libc/amd64/Makefile.inc b/lib/libc/amd64/Makefile.inc index cd8f0f121ea..d590353ee7e 100644 --- a/lib/libc/amd64/Makefile.inc +++ b/lib/libc/amd64/Makefile.inc @@ -7,3 +7,5 @@ GDTOASRCS+=strtorx.c SRCS+=machdep_ldisx.c SYM_MAPS+=${LIBC_SRCTOP}/amd64/Symbol.map + +SRCS+=amd64/ifunc.c diff --git a/lib/libc/amd64/ifunc.c b/lib/libc/amd64/ifunc.c new file mode 100644 index 00000000000..4338a78762a --- /dev/null +++ b/lib/libc/amd64/ifunc.c @@ -0,0 +1,48 @@ +#include +#include +#include + +void *memset_std(void *buf, int c, size_t len); +void *memset_erms(void *buf, int c, size_t len); +DEFINE_UIFUNC(, void *, memset, (void *, int, size_t), static) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + memset_erms : memset_std); +} + +void bzero_std(void *buf, size_t len); +void bzero_erms(void *buf, size_t len); +DEFINE_UIFUNC(, void , bzero, (void *, size_t), static) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + bzero_erms : bzero_std); +} + +void *memmove_std(void * _Nonnull dst, const void * _Nonnull src, size_t len); +void *memmove_erms(void * _Nonnull dst, const void * _Nonnull src, size_t len); +DEFINE_UIFUNC(, void *, memmove, (void * _Nonnull, const void * _Nonnull, size_t), static) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + memmove_erms : memmove_std); +} + +void *memcpy_std(void * _Nonnull dst, const void * _Nonnull src, size_t len); +void *memcpy_erms(void * _Nonnull dst, const void * _Nonnull src, size_t len); +DEFINE_UIFUNC(, void *, memcpy, (void * _Nonnull, const void * _Nonnull, size_t), static) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + memcpy_erms : memcpy_std); +} + +void *bcopy_std(void * _Nonnull src, const void * _Nonnull dst, size_t len); +void *bcopy_erms(void * _Nonnull src, const void * _Nonnull dst, size_t len); +DEFINE_UIFUNC(, void *, bcopy, (void * _Nonnull, const void * _Nonnull, size_t), static) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + bcopy_erms : bcopy_std); +} diff --git a/lib/libc/amd64/string/bcopy.S b/lib/libc/amd64/string/bcopy.S index 9446e75b805..c1dc3a34de8 100644 --- a/lib/libc/amd64/string/bcopy.S +++ b/lib/libc/amd64/string/bcopy.S @@ -42,12 +42,16 @@ __FBSDID("$FreeBSD$"); */ #ifdef MEMCOPY -ENTRY(memcpy) +ENTRY(memcpy_std) +ENTRY(memcpy_erms) + #else #ifdef MEMMOVE -ENTRY(memmove) +ENTRY(memmove_std) +ENTRY(memmove_erms) #else -ENTRY(bcopy) +ENTRY(bcopy_std) +ENTRY(bcopy_erms) #endif #endif #if defined(MEMCOPY) || defined(MEMMOVE) @@ -91,12 +95,15 @@ ENTRY(bcopy) cld ret #ifdef MEMCOPY -END(memcpy) +END(memcpy_erms) +END(memcpy_std) #else #ifdef MEMMOVE -END(memmove) +END(memmove_erms) +END(memmove_std) #else -END(bcopy) +END(bcopy_std) +END(bcopy_erms) #endif #endif diff --git a/lib/libc/amd64/string/memset.S b/lib/libc/amd64/string/memset.S index 06c9869c2d6..754e3c5d7bf 100644 --- a/lib/libc/amd64/string/memset.S +++ b/lib/libc/amd64/string/memset.S @@ -65,13 +65,31 @@ __FBSDID("$FreeBSD$"); .endm #ifndef BZERO -ENTRY(memset) +ENTRY(memset_std) MEMSET bzero=0 -END(memset) +END(memset_std) + +ENTRY(memset_erms) + movq %rdi,%r9 + movq %rdx,%rcx + movb %sil,%al + rep + stosb + movq %r9,%rax + ret +END(memset_erms) #else -ENTRY(bzero) +ENTRY(bzero_std) MEMSET bzero=1 -END(bzero) +END(bzero_std) + +ENTRY(bzero_erms) + movq %rsi,%rcx + xorl %eax,%eax + rep + stosb + ret +END(bzero_erms) #endif .section .note.GNU-stack,"",%progbits