1 #include <sparc-ifunc.h> 2 3 #define __md5_process_block __md5_process_block_generic 4 extern void __md5_process_block_generic (const void *buffer, size_t len, 5 struct md5_ctx *ctx); 6 7 #include <crypt/md5-block.c> 8 9 #undef __md5_process_block 10 11 extern void __md5_process_block_crop (const void *buffer, size_t len, 12 struct md5_ctx *ctx); cpu_supports_md5(int hwcap)13static bool cpu_supports_md5(int hwcap) 14 { 15 unsigned long cfr; 16 17 if (!(hwcap & HWCAP_SPARC_CRYPTO)) 18 return false; 19 20 __asm__ ("rd %%asr26, %0" : "=r" (cfr)); 21 if (cfr & (1 << 4)) 22 return true; 23 24 return false; 25 } 26 27 extern void __md5_process_block (const void *buffer, size_t len, 28 struct md5_ctx *ctx); 29 sparc_libc_ifunc(__md5_process_block, cpu_supports_md5(hwcap) ? __md5_process_block_crop : __md5_process_block_generic); 30