Vendor Unique iSCSI CRC32C
August 2016 Data Integrity Validation 263
if ((length = len / CRC32C_SIZE) > 0) {
#if defined(__amd64) || defined(__x86_64)
uint64_t *data = (uint64_t *)addr;
#else
uint32_t *data = (uint32_t *)addr;
#endif
for (i = 0; i < length; i++) {
__asm__ __volatile__(
/* "crc32 r32, r/m32" or "crc32 r32,
r/m64" */
".byte 0xF2, " CRC32C_INST
"0x0F, 0x38, 0xF1, 0xF1"
: "=S"(crc)
: "0"(crc), "c"(*data));
data++;
}
addr = (uint8_t *)data;
len -= length * CRC32C_SIZE;
}
/* calc crc for remaining data */
for (i = 0; i < len; i++) {
__asm__ __volatile__(
/* "crc32 r32, r/m8" */
".byte 0xF2, 0x0F, 0x38, 0xF0, 0xF1"
: "=S"(crc)
: "0"(crc), "c"(*addr));
addr++;
}
return (crc ^ CRC32C_XOR);
}
#endif
Sparc (T4 Minimum)
#if defined(__sparc)
uint32_t
calc_crc32c_sparc(char *buf, int len, uint32_t crc)
{
uint8_t *addr = (uint8_t *)buf;