Path: blob/main/sys/contrib/openzfs/module/icp/algs/modes/gcm_pclmulqdq.c
48775 views
// SPDX-License-Identifier: CDDL-1.01/*2* CDDL HEADER START3*4* The contents of this file are subject to the terms of the5* Common Development and Distribution License (the "License").6* You may not use this file except in compliance with the License.7*8* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE9* or https://opensource.org/licenses/CDDL-1.0.10* See the License for the specific language governing permissions11* and limitations under the License.12*13* When distributing Covered Code, include this CDDL HEADER in each14* file and include the License file at usr/src/OPENSOLARIS.LICENSE.15* If applicable, add the following below this CDDL HEADER, with the16* fields enclosed by brackets "[]" replaced with your own identifying17* information: Portions Copyright [yyyy] [name of copyright owner]18*19* CDDL HEADER END20*/21/*22* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.23*/2425#if defined(__x86_64) && defined(HAVE_PCLMULQDQ)2627#include <sys/types.h>28#include <sys/simd.h>29#include <sys/asm_linkage.h>3031/* These functions are used to execute pclmulqdq based assembly methods */32extern void ASMABI gcm_mul_pclmulqdq(uint64_t *, uint64_t *, uint64_t *);3334#include <modes/gcm_impl.h>3536/*37* Perform a carry-less multiplication (that is, use XOR instead of the38* multiply operator) on *x_in and *y and place the result in *res.39*40* Byte swap the input (*x_in and *y) and the output (*res).41*42* Note: x_in, y, and res all point to 16-byte numbers (an array of two43* 64-bit integers).44*/45static void46gcm_pclmulqdq_mul(uint64_t *x_in, uint64_t *y, uint64_t *res)47{48kfpu_begin();49gcm_mul_pclmulqdq(x_in, y, res);50kfpu_end();51}5253static boolean_t54gcm_pclmulqdq_will_work(void)55{56return (kfpu_allowed() && zfs_pclmulqdq_available());57}5859const gcm_impl_ops_t gcm_pclmulqdq_impl = {60.mul = &gcm_pclmulqdq_mul,61.is_supported = &gcm_pclmulqdq_will_work,62.name = "pclmulqdq"63};6465#endif /* defined(__x86_64) && defined(HAVE_PCLMULQDQ) */666768