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);
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);