d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * CDDL HEADER START
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng *
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * The contents of this file are subject to the terms of the
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * Common Development and Distribution License (the "License").
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * You may not use this file except in compliance with the License.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng *
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * or http://www.opensolaris.org/os/licensing.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * See the License for the specific language governing permissions
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * and limitations under the License.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng *
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * When distributing Covered Code, include this CDDL HEADER in each
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * If applicable, add the following below this CDDL HEADER, with the
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * fields enclosed by brackets "[]" replaced with your own identifying
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * information: Portions Copyright [yyyy] [name of copyright owner]
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng *
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * CDDL HEADER END
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * Copyright (c) 2009, Intel Corporation.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * All rights reserved.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifndef _CRC_HD_H
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define _CRC_HD_H
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef __cplusplus
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengextern "C" {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#include <sys/types.h>
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef __cplusplus
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifndef INLINE
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INLINE inline
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifndef INLINE
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INLINE
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(__i386) || defined(__amd_64) || defined(__x86_64)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef _KERNEL
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla#include <sys/x86_archext.h> /* x86_featureset, X86FSET_SSE4_2 */
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#include <sys/auxv.h> /* getisax() */
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla#include <sys/auxv_386.h> /* AV_386_SSE4_2 bit */
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic INLINE uint32_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef _KERNEL
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u8(uint32_t crc, uint8_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u8(uint32_t crc, uint8_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng{
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng __asm__ __volatile__(
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m8" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x0F, 0x38, 0xF0, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "=S" (crc)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "0" (crc), "c" (*data));
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (crc);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(__amd64) || defined(__x86_64)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic INLINE uint32_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef _KERNEL
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u64(uint32_t crc, uint64_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u64(uint32_t crc, uint64_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng{
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng __asm__ __volatile__(
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m64" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x48, 0x0F, 0x38, 0xF1, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "=S" (crc)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "0" (crc), "c" (*data));
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (crc);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_ALIGN_MASK 0x7
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_SIZE 8
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_DATA_TYPE uint64_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_FUNC mm_crc32_u64
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic INLINE uint32_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef _KERNEL
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u32(uint32_t crc, uint32_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengmm_crc32_u32(uint32_t crc, uint32_t *data)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng{
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng __asm__ __volatile__(
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m32" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x0F, 0x38, 0xF1, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "=S" (crc)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng : "0" (crc), "c" (*data));
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (crc);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_ALIGN_MASK 0x3
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_SIZE 4
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_DATA_TYPE uint32_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define INTEL_CRC_FUNC mm_crc32_u32
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic INLINE uint32_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengintel_crc32c(uint8_t *address, unsigned long length, uint32_t crc)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng{
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng uint32_t i = (uintptr_t)address & INTEL_CRC_ALIGN_MASK;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng uint8_t *data = address;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* Process unaligned header data */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng while ((length > 0) && (i > 0)) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng crc = mm_crc32_u8(crc, data);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ++ data;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng -- length;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng i ++;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng i &= INTEL_CRC_ALIGN_MASK;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* aligned data part */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng while (length >= INTEL_CRC_SIZE) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /*LINTED:E_BAD_PTR_CAST_ALIGN*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng crc = INTEL_CRC_FUNC(crc, (INTEL_CRC_DATA_TYPE *)data);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng data += INTEL_CRC_SIZE;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng length -= INTEL_CRC_SIZE;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* unaligned tail data */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng while (length > 0) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng crc = mm_crc32_u8(crc, data);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ++ data;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng -- length;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (crc ^ 0xFFFFFFFF);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define HW_CRC32(buffer, length, crc) (intel_crc32c((buffer), (length), (crc)))
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define HW_CRC32_CONT(buffer, length, crc) \
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng (intel_crc32c((buffer), (length), (crc) ^ 0xFFFFFFFF))
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define HW_CRC32(buffer, length, crc) 0
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define HW_CRC32_CONT(buffer, length, crc) 0
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengstatic INLINE boolean_t
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(_KERNEL) && !defined(__i386) && !defined(__amd_64) &&\
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng !defined(__x86_64)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Menghd_crc32_avail(uint32_t *crc32_table)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Menghd_crc32_avail(uint32_t *crc32_table)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng{
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(__i386) || defined(__amd_64) || defined(__x86_64)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng int i;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* poly = 0x1EDC6F41 */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng static const uint32_t _intel_crc32_hd_table[256] = {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng };
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#ifdef _KERNEL
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla if (!is_x86_feature(x86_featureset, X86FSET_SSE4_2)) {
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng return (B_FALSE);
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng } else {
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#else
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng {
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng uint_t ui = 0;
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng (void) getisax(&ui, 1);
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng if (!(ui & AV_386_SSE4_2)) {
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng return (B_FALSE);
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng }
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng for (i = 0; i < 256; i++) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng if (crc32_table[i] != _intel_crc32_hd_table[i])
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (B_FALSE);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (B_TRUE);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng }
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#else
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng return (B_FALSE);
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#ifdef __cplusplus
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng}
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _CRC_HD_H */