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)13 static 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