d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * See the License for the specific language governing permissions
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * and limitations under the License.
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 * CDDL HEADER END
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * Copyright (c) 2009, Intel Corporation.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng * All rights reserved.
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(__i386) || defined(__amd_64) || defined(__x86_64)
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla#include <sys/x86_archext.h> /* x86_featureset, X86FSET_SSE4_2 */
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla#include <sys/auxv_386.h> /* AV_386_SSE4_2 bit */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m8" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x0F, 0x38, 0xF0, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m64" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x48, 0x0F, 0x38, 0xF1, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* "crc32 r32, r/m32" */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng ".byte 0xF2, 0x0F, 0x38, 0xF1, 0xF1"
d4b0f84707225327c617c6838361d3cfb7762b34Jack Mengintel_crc32c(uint8_t *address, unsigned long length, uint32_t crc)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng uint32_t i = (uintptr_t)address & INTEL_CRC_ALIGN_MASK;
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* Process unaligned header data */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng while ((length > 0) && (i > 0)) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* aligned data part */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /*LINTED:E_BAD_PTR_CAST_ALIGN*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng crc = INTEL_CRC_FUNC(crc, (INTEL_CRC_DATA_TYPE *)data);
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* unaligned tail data */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng while (length > 0) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#define HW_CRC32(buffer, length, crc) (intel_crc32c((buffer), (length), (crc)))
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng (intel_crc32c((buffer), (length), (crc) ^ 0xFFFFFFFF))
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(_KERNEL) && !defined(__i386) && !defined(__amd_64) &&\
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng/*LINTED:E_FUNC_ARG_UNUSED*/
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#if defined(__i386) || defined(__amd_64) || defined(__x86_64)
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng /* poly = 0x1EDC6F41 */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng static const uint32_t _intel_crc32_hd_table[256] = {
7417cfdecea1902cef03c0d61a72df97d945925dKuriakose Kuruvilla if (!is_x86_feature(x86_featureset, X86FSET_SSE4_2)) {
2a910fbb92dbaed71db5d7843518f08d02ebb922Jack Meng#endif /* _KERNEL */
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng for (i = 0; i < 256; i++) {
d4b0f84707225327c617c6838361d3cfb7762b34Jack Meng#endif /* _CRC_HD_H */