From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="mstM7xO4" Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3253E98 for ; Tue, 5 Dec 2023 01:28:22 -0800 (PST) Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-6ce5f4b3eefso1207595b3a.3 for ; Tue, 05 Dec 2023 01:28:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701768501; x=1702373301; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RBuedL2MVaDCSRXtoqXWbAJ3hnegLt9N4TQwD0//bFg=; b=mstM7xO4k5v2OPKpNLZfV9FXtpl+XDt4i24c2zKZZtVcHW/xcVPRDpbeCMg0qbwhs8 R25McSJQRST64gOQdeS2UmGTfEAz2P6ryEh4+6KV5UfwAmxxpubpnLVoRLO+Bgmi+l3w iG6OHloWZuDhhUyVRwCsRblFlUWyPzo259ktoZXuz1cFFr5G4WApJwbKRGAyRy14bz88 RwHWQt3ly8PhYLWWzSsCDsx/65pdvG32X7vAiRrR+rMz8y4HkBTmJ5zoDYsCGkF8FZod TM9Bnno8sV885H0EC5gJqRBsiSbFvXh0ZXgrUaHjhVqdu6XhxKFMV7BRFHAfIXgb4p3+ HLfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701768501; x=1702373301; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RBuedL2MVaDCSRXtoqXWbAJ3hnegLt9N4TQwD0//bFg=; b=glM1FFIYMhJzAHRiXmVVd9LjoRMIjDYb+AOkfXRPCCCwUHxz3ZZQUWBwRTYpJwJkb9 V/0LxemizaYkGMhdQsVlNMtBN+3wkSrCFJCRvp9p9zP6qbXLF6eIZQCSRgR7YZd7YrOe X30YpHjqKicJ9cF04hReDz93YzgU5wsq5GRwxX+9tPz84FiCx5p66HQqZ1y4DbU2Ov/p T8TS9cXRmxTZew6MNbBMq4oTdYn9C2kG0MG6F5SWURIES2mw51imU3S6jB61QA+757o+ IKo+Y49VCJbRcxsxvooBETeZOaWNCv4Eo9jcgc+55vUGhM10Kx4ni+ewH6NorFMrgOjG 2S3g== X-Gm-Message-State: AOJu0Yyu31nYwWTwixhGNTcS5n7qfYkOikGDJhXkM/PU8GORtcawntW/ vbbMjlmnDYLAkpKf/52EN5B6lvNhWpgHCQ8gJ+Q= X-Google-Smtp-Source: AGHT+IFr4dGGyEyZHIGPv5AWO9ts4wPN/yPzSbmCzmCq7FmwKS1IxwoO4xI+C5TPbBu3ZHb04zstKg== X-Received: by 2002:a05:6a00:a90:b0:6ce:54c4:b514 with SMTP id b16-20020a056a000a9000b006ce54c4b514mr731370pfl.50.1701768501556; Tue, 05 Dec 2023 01:28:21 -0800 (PST) Received: from localhost.localdomain ([101.10.93.135]) by smtp.gmail.com with ESMTPSA id l6-20020a056a00140600b006cdd723bb6fsm8858788pfu.115.2023.12.05.01.28.18 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Dec 2023 01:28:21 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org, conor@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v3 03/12] RISC-V: crypto: add OpenSSL perl module for vector instructions Date: Tue, 5 Dec 2023 17:27:52 +0800 Message-Id: <20231205092801.1335-4-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231205092801.1335-1-jerry.shih@sifive.com> References: <20231205092801.1335-1-jerry.shih@sifive.com> Precedence: bulk X-Mailing-List: linux-crypto@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OpenSSL has some RISC-V vector cryptography implementations which could be reused for kernel. These implementations use a number of perl helpers for handling vector-crypto-extension instructions. This patch take these perl helpers from OpenSSL(openssl/openssl#21923). The unused scalar crypto instructions in the original perl module are skipped. Co-developed-by: Christoph Müllner Signed-off-by: Christoph Müllner Co-developed-by: Heiko Stuebner Signed-off-by: Heiko Stuebner Co-developed-by: Phoebe Chen Signed-off-by: Phoebe Chen Signed-off-by: Jerry Shih --- Changelog v3: - Only use opcodes for vector crypto extensions. We use the asm mnemonics for all instructions in RVV 1.0 extension which are already supported in kernel. --- arch/riscv/crypto/riscv.pm | 359 +++++++++++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 arch/riscv/crypto/riscv.pm diff --git a/arch/riscv/crypto/riscv.pm b/arch/riscv/crypto/riscv.pm new file mode 100644 index 000000000000..d91ad902ca04 --- /dev/null +++ b/arch/riscv/crypto/riscv.pm @@ -0,0 +1,359 @@ +#! /usr/bin/env perl +# SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause +# +# This file is dual-licensed, meaning that you can use it under your +# choice of either of the following two licenses: +# +# Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You can obtain +# a copy in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html +# +# or +# +# Copyright (c) 2023, Christoph Müllner +# Copyright (c) 2023, Jerry Shih +# Copyright (c) 2023, Phoebe Chen +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use strict; +use warnings; + +# Set $have_stacktrace to 1 if we have Devel::StackTrace +my $have_stacktrace = 0; +if (eval {require Devel::StackTrace;1;}) { + $have_stacktrace = 1; +} + +my @regs = map("x$_",(0..31)); +# Mapping from the RISC-V psABI ABI mnemonic names to the register number. +my @regaliases = ('zero','ra','sp','gp','tp','t0','t1','t2','s0','s1', + map("a$_",(0..7)), + map("s$_",(2..11)), + map("t$_",(3..6)) +); + +my %reglookup; +@reglookup{@regs} = @regs; +@reglookup{@regaliases} = @regs; + +# Takes a register name, possibly an alias, and converts it to a register index +# from 0 to 31 +sub read_reg { + my $reg = lc shift; + if (!exists($reglookup{$reg})) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unknown register ".$reg."\n".$trace); + } + my $regstr = $reglookup{$reg}; + if (!($regstr =~ /^x([0-9]+)$/)) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Could not process register ".$reg."\n".$trace); + } + return $1; +} + +my @vregs = map("v$_",(0..31)); +my %vreglookup; +@vreglookup{@vregs} = @vregs; + +sub read_vreg { + my $vreg = lc shift; + if (!exists($vreglookup{$vreg})) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unknown vector register ".$vreg."\n".$trace); + } + if (!($vreg =~ /^v([0-9]+)$/)) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Could not process vector register ".$vreg."\n".$trace); + } + return $1; +} + +# Read the vm settings and convert to mask encoding. +sub read_mask_vreg { + my $vreg = shift; + # The default value is unmasked. + my $mask_bit = 1; + + if (defined($vreg)) { + my $reg_id = read_vreg $vreg; + if ($reg_id == 0) { + $mask_bit = 0; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("The ".$vreg." is not the mask register v0.\n".$trace); + } + } + return $mask_bit; +} + +# Vector crypto instructions + +## Zvbb and Zvkb instructions +## +## vandn (also in zvkb) +## vbrev +## vbrev8 (also in zvkb) +## vrev8 (also in zvkb) +## vclz +## vctz +## vcpop +## vrol (also in zvkb) +## vror (also in zvkb) +## vwsll + +sub vbrev8_v { + # vbrev8.v vd, vs2, vm + my $template = 0b010010_0_00000_01000_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +sub vrev8_v { + # vrev8.v vd, vs2, vm + my $template = 0b010010_0_00000_01001_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +sub vror_vi { + # vror.vi vd, vs2, uimm + my $template = 0b01010_0_1_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + my $uimm_i5 = $uimm >> 5; + my $uimm_i4_0 = $uimm & 0b11111; + + return ".word ".($template | ($uimm_i5 << 26) | ($vs2 << 20) | ($uimm_i4_0 << 15) | ($vd << 7)); +} + +sub vwsll_vv { + # vwsll.vv vd, vs2, vs1, vm + my $template = 0b110101_0_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +## Zvbc instructions + +sub vclmulh_vx { + # vclmulh.vx vd, vs2, rs1 + my $template = 0b0011011_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vclmul_vx_v0t { + # vclmul.vx vd, vs2, rs1, v0.t + my $template = 0b0011000_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vclmul_vx { + # vclmul.vx vd, vs2, rs1 + my $template = 0b0011001_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +## Zvkg instructions + +sub vghsh_vv { + # vghsh.vv vd, vs2, vs1 + my $template = 0b1011001_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vgmul_vv { + # vgmul.vv vd, vs2 + my $template = 0b1010001_00000_10001_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## Zvkned instructions + +sub vaesdf_vs { + # vaesdf.vs vd, vs2 + my $template = 0b101001_1_00000_00001_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesdm_vs { + # vaesdm.vs vd, vs2 + my $template = 0b101001_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesef_vs { + # vaesef.vs vd, vs2 + my $template = 0b101001_1_00000_00011_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesem_vs { + # vaesem.vs vd, vs2 + my $template = 0b101001_1_00000_00010_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaeskf1_vi { + # vaeskf1.vi vd, vs2, uimmm + my $template = 0b100010_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($uimm << 15) | ($vs2 << 20) | ($vd << 7)); +} + +sub vaeskf2_vi { + # vaeskf2.vi vd, vs2, uimm + my $template = 0b101010_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vaesz_vs { + # vaesz.vs vd, vs2 + my $template = 0b101001_1_00000_00111_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## Zvknha and Zvknhb instructions + +sub vsha2ms_vv { + # vsha2ms.vv vd, vs2, vs1 + my $template = 0b1011011_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +sub vsha2ch_vv { + # vsha2ch.vv vd, vs2, vs1 + my $template = 0b101110_10000_00000_001_00000_01110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +sub vsha2cl_vv { + # vsha2cl.vv vd, vs2, vs1 + my $template = 0b101111_10000_00000_001_00000_01110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +## Zvksed instructions + +sub vsm4k_vi { + # vsm4k.vi vd, vs2, uimm + my $template = 0b1000011_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vsm4r_vs { + # vsm4r.vs vd, vs2 + my $template = 0b1010011_00000_10000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## zvksh instructions + +sub vsm3c_vi { + # vsm3c.vi vd, vs2, uimm + my $template = 0b1010111_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15 ) | ($vd << 7)); +} + +sub vsm3me_vv { + # vsm3me.vv vd, vs2, vs1 + my $template = 0b1000001_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15 ) | ($vd << 7)); +} + +1; -- 2.28.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AF611C4167B for ; Tue, 5 Dec 2023 09:28:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=wvq4K6Hb6QGGeJ/DoTvRpBeAk7luLzilc5HAr90tRE4=; b=cjZx7llk1EVILZ W17O0ACW/rMrhPOBrvoGCUg9CHrQw22NkPZgWETGEpOkR9bCe+EZ0uIvHoCvPEWa6a8QqxZS5z/kA Iv9MU94OjrO2O/TgmMd50rP5ni+5q0P2RZKlPo3P+sHyffoCi653v3ZwmCKm/7lNokNL0zYJA2O91 QUsKe+NhD6rVH4+imgYnYo4Lr0AkXiALXVhhYE2KTo2AXY3cd3b8v6tEXBpqKe53ZCO8wHK6XDHMr wPG30mmDzZee+epf7ryixo+Rc0oIBVuY5ZrRkxjDhe84d1/GvsBim7LuxCxufuzl5gjXLVFZziYR6 T+HWMRbBLbH8X09eKklQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rARj9-006neg-0x; Tue, 05 Dec 2023 09:28:27 +0000 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rARj4-006nba-3D for linux-riscv@lists.infradead.org; Tue, 05 Dec 2023 09:28:25 +0000 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-6cdea2f5918so3611557b3a.2 for ; Tue, 05 Dec 2023 01:28:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701768501; x=1702373301; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RBuedL2MVaDCSRXtoqXWbAJ3hnegLt9N4TQwD0//bFg=; b=frAzMDVMOYA1oQWm0l5U+UIN5BV2nYLmgfyujM0xbXvo4GLdBjr7B8OV/aQAHoK7B6 8AXH3SdNIsmkJh8yYrF6oQn/XRSn3WXVPP1XJaCR6rd7jwVpFpjYf+wYgLPgQZf8xBRd 86v64/u1tp1vvYk4EQmVAs+QaSsWoNyWWjHVmSKYIutmdHQNArYO9KOKR7bwX/SWmgB2 zbgj8Ksje+O7nq0zrg0YiGYQrg1qa+hBn4+uTwyNKJK+KUwd5frVqqRmW61l4bwfseCD lmyDu5+VH4vXYX3FBRiJPEk34ZYf2STIJoG0P8rNuMN6zrWZlnzMAUyV9z45BfZEKWx6 1ZiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701768501; x=1702373301; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RBuedL2MVaDCSRXtoqXWbAJ3hnegLt9N4TQwD0//bFg=; b=DNSTUE1a0NcX0yxWyifn44GzuOR8Pb4zyakyYFtyNXjVtXNC0/6vkRmEIocdssyvDp 0uTct2z2/bpDXni2bUzSmydsXlklfPmZ8t5zACd3NCiRMVlCTT0F2Ykv409fAot5IltE Gb06nUs/hxlBfxMeT7wZe07j3m3IHYlMPNAUAAPQSW7XnCEhS2IJ3UMxW0VzjqvVcEyR dXySlUmZyLXU16WkAnSFE1pf4U/KhzMQdIGF7MjPvHsVt5Xdj5/Z1WJ+dDS2RlfNND0K ZVEeyHH+v4kQ8AmJQnWfqb6CnW1rAZpjgUukFJnn16KP0QT6Rv9fUaff+E0UBepoQg46 sWow== X-Gm-Message-State: AOJu0YycyI4qnAbqyNfGBoRqK76n5omifYEaAM1s68qD2DDEwo5mw5ze 8oIJAsB89DjffpY65/ssj9610A== X-Google-Smtp-Source: AGHT+IFr4dGGyEyZHIGPv5AWO9ts4wPN/yPzSbmCzmCq7FmwKS1IxwoO4xI+C5TPbBu3ZHb04zstKg== X-Received: by 2002:a05:6a00:a90:b0:6ce:54c4:b514 with SMTP id b16-20020a056a000a9000b006ce54c4b514mr731370pfl.50.1701768501556; Tue, 05 Dec 2023 01:28:21 -0800 (PST) Received: from localhost.localdomain ([101.10.93.135]) by smtp.gmail.com with ESMTPSA id l6-20020a056a00140600b006cdd723bb6fsm8858788pfu.115.2023.12.05.01.28.18 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Dec 2023 01:28:21 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org, conor@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v3 03/12] RISC-V: crypto: add OpenSSL perl module for vector instructions Date: Tue, 5 Dec 2023 17:27:52 +0800 Message-Id: <20231205092801.1335-4-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231205092801.1335-1-jerry.shih@sifive.com> References: <20231205092801.1335-1-jerry.shih@sifive.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231205_012823_035104_90840C80 X-CRM114-Status: GOOD ( 23.23 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org VGhlIE9wZW5TU0wgaGFzIHNvbWUgUklTQy1WIHZlY3RvciBjcnlwdG9ncmFwaHkgaW1wbGVtZW50 YXRpb25zIHdoaWNoCmNvdWxkIGJlIHJldXNlZCBmb3Iga2VybmVsLiBUaGVzZSBpbXBsZW1lbnRh dGlvbnMgdXNlIGEgbnVtYmVyIG9mIHBlcmwKaGVscGVycyBmb3IgaGFuZGxpbmcgdmVjdG9yLWNy eXB0by1leHRlbnNpb24gaW5zdHJ1Y3Rpb25zLgpUaGlzIHBhdGNoIHRha2UgdGhlc2UgcGVybCBo ZWxwZXJzIGZyb20gT3BlblNTTChvcGVuc3NsL29wZW5zc2wjMjE5MjMpLgpUaGUgdW51c2VkIHNj YWxhciBjcnlwdG8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBvcmlnaW5hbCBwZXJsIG1vZHVsZSBhcmUK c2tpcHBlZC4KCkNvLWRldmVsb3BlZC1ieTogQ2hyaXN0b3BoIE3DvGxsbmVyIDxjaHJpc3RvcGgu bXVlbGxuZXJAdnJ1bGwuZXU+ClNpZ25lZC1vZmYtYnk6IENocmlzdG9waCBNw7xsbG5lciA8Y2hy aXN0b3BoLm11ZWxsbmVyQHZydWxsLmV1PgpDby1kZXZlbG9wZWQtYnk6IEhlaWtvIFN0dWVibmVy IDxoZWlrby5zdHVlYm5lckB2cnVsbC5ldT4KU2lnbmVkLW9mZi1ieTogSGVpa28gU3R1ZWJuZXIg PGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PgpDby1kZXZlbG9wZWQtYnk6IFBob2ViZSBDaGVuIDxw aG9lYmUuY2hlbkBzaWZpdmUuY29tPgpTaWduZWQtb2ZmLWJ5OiBQaG9lYmUgQ2hlbiA8cGhvZWJl LmNoZW5Ac2lmaXZlLmNvbT4KU2lnbmVkLW9mZi1ieTogSmVycnkgU2hpaCA8amVycnkuc2hpaEBz aWZpdmUuY29tPgotLS0KQ2hhbmdlbG9nIHYzOgogLSBPbmx5IHVzZSBvcGNvZGVzIGZvciB2ZWN0 b3IgY3J5cHRvIGV4dGVuc2lvbnMuCiBXZSB1c2UgdGhlIGFzbSBtbmVtb25pY3MgZm9yIGFsbCBp bnN0cnVjdGlvbnMgaW4gUlZWIDEuMCBleHRlbnNpb24gd2hpY2gKIGFyZSBhbHJlYWR5IHN1cHBv cnRlZCBpbiBrZXJuZWwuCi0tLQogYXJjaC9yaXNjdi9jcnlwdG8vcmlzY3YucG0gfCAzNTkgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQsIDM1OSBp bnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9jcnlwdG8vcmlzY3Yu cG0KCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9yaXNjdi5wbSBiL2FyY2gvcmlzY3Yv Y3J5cHRvL3Jpc2N2LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4u ZDkxYWQ5MDJjYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9yaXNjdi9jcnlwdG8vcmlzY3Yu cG0KQEAgLTAsMCArMSwzNTkgQEAKKyMhIC91c3IvYmluL2VudiBwZXJsCisjIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIE9SIEJTRC0yLUNsYXVzZQorIworIyBUaGlzIGZpbGUg aXMgZHVhbC1saWNlbnNlZCwgbWVhbmluZyB0aGF0IHlvdSBjYW4gdXNlIGl0IHVuZGVyIHlvdXIK KyMgY2hvaWNlIG9mIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKKyMKKyMg Q29weXJpZ2h0IDIwMjMgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmlnaHRzIFJl c2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wICh0aGUg IkxpY2Vuc2UiKS4gWW91IGNhbiBvYnRhaW4KKyMgYSBjb3B5IGluIHRoZSBmaWxlIExJQ0VOU0Ug aW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKKyMgaHR0cHM6Ly93d3cub3BlbnNzbC5v cmcvc291cmNlL2xpY2Vuc2UuaHRtbAorIworIyBvcgorIworIyBDb3B5cmlnaHQgKGMpIDIwMjMs IENocmlzdG9waCBNw7xsbG5lciA8Y2hyaXN0b3BoLm11ZWxsbmVyQHZydWxsLmV1PgorIyBDb3B5 cmlnaHQgKGMpIDIwMjMsIEplcnJ5IFNoaWggPGplcnJ5LnNoaWhAc2lmaXZlLmNvbT4KKyMgQ29w eXJpZ2h0IChjKSAyMDIzLCBQaG9lYmUgQ2hlbiA8cGhvZWJlLmNoZW5Ac2lmaXZlLmNvbT4KKyMg QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg bWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwg dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0 aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkg RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1J VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU TkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1Q TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElN SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T UyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor IyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G IFNVQ0ggREFNQUdFLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCisjIFNldCAkaGF2 ZV9zdGFja3RyYWNlIHRvIDEgaWYgd2UgaGF2ZSBEZXZlbDo6U3RhY2tUcmFjZQorbXkgJGhhdmVf c3RhY2t0cmFjZSA9IDA7CitpZiAoZXZhbCB7cmVxdWlyZSBEZXZlbDo6U3RhY2tUcmFjZTsxO30p IHsKKyAgICAkaGF2ZV9zdGFja3RyYWNlID0gMTsKK30KKworbXkgQHJlZ3MgPSBtYXAoIngkXyIs KDAuLjMxKSk7CisjIE1hcHBpbmcgZnJvbSB0aGUgUklTQy1WIHBzQUJJIEFCSSBtbmVtb25pYyBu YW1lcyB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLgorbXkgQHJlZ2FsaWFzZXMgPSAoJ3plcm8nLCdy YScsJ3NwJywnZ3AnLCd0cCcsJ3QwJywndDEnLCd0MicsJ3MwJywnczEnLAorICAgIG1hcCgiYSRf IiwoMC4uNykpLAorICAgIG1hcCgicyRfIiwoMi4uMTEpKSwKKyAgICBtYXAoInQkXyIsKDMuLjYp KQorKTsKKworbXkgJXJlZ2xvb2t1cDsKK0ByZWdsb29rdXB7QHJlZ3N9ID0gQHJlZ3M7CitAcmVn bG9va3Vwe0ByZWdhbGlhc2VzfSA9IEByZWdzOworCisjIFRha2VzIGEgcmVnaXN0ZXIgbmFtZSwg cG9zc2libHkgYW4gYWxpYXMsIGFuZCBjb252ZXJ0cyBpdCB0byBhIHJlZ2lzdGVyIGluZGV4Cisj IGZyb20gMCB0byAzMQorc3ViIHJlYWRfcmVnIHsKKyAgICBteSAkcmVnID0gbGMgc2hpZnQ7Cisg ICAgaWYgKCFleGlzdHMoJHJlZ2xvb2t1cHskcmVnfSkpIHsKKyAgICAgICAgbXkgJHRyYWNlID0g IiI7CisgICAgICAgIGlmICgkaGF2ZV9zdGFja3RyYWNlKSB7CisgICAgICAgICAgICAkdHJhY2Ug PSBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAgIH0KKyAgICAgICAg ZGllKCJVbmtub3duIHJlZ2lzdGVyICIuJHJlZy4iXG4iLiR0cmFjZSk7CisgICAgfQorICAgIG15 ICRyZWdzdHIgPSAkcmVnbG9va3VweyRyZWd9OworICAgIGlmICghKCRyZWdzdHIgPX4gL154KFsw LTldKykkLykpIHsKKyAgICAgICAgbXkgJHRyYWNlID0gIiI7CisgICAgICAgIGlmICgkaGF2ZV9z dGFja3RyYWNlKSB7CisgICAgICAgICAgICAkdHJhY2UgPSBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3 LT5hc19zdHJpbmc7CisgICAgICAgIH0KKyAgICAgICAgZGllKCJDb3VsZCBub3QgcHJvY2VzcyBy ZWdpc3RlciAiLiRyZWcuIlxuIi4kdHJhY2UpOworICAgIH0KKyAgICByZXR1cm4gJDE7Cit9CisK K215IEB2cmVncyA9IG1hcCgidiRfIiwoMC4uMzEpKTsKK215ICV2cmVnbG9va3VwOworQHZyZWds b29rdXB7QHZyZWdzfSA9IEB2cmVnczsKKworc3ViIHJlYWRfdnJlZyB7CisgICAgbXkgJHZyZWcg PSBsYyBzaGlmdDsKKyAgICBpZiAoIWV4aXN0cygkdnJlZ2xvb2t1cHskdnJlZ30pKSB7CisgICAg ICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICBpZiAoJGhhdmVfc3RhY2t0cmFjZSkgeworICAg ICAgICAgICAgJHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldy0+YXNfc3RyaW5nOworICAg ICAgICB9CisgICAgICAgIGRpZSgiVW5rbm93biB2ZWN0b3IgcmVnaXN0ZXIgIi4kdnJlZy4iXG4i LiR0cmFjZSk7CisgICAgfQorICAgIGlmICghKCR2cmVnID1+IC9edihbMC05XSspJC8pKSB7Cisg ICAgICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICBpZiAoJGhhdmVfc3RhY2t0cmFjZSkgewor ICAgICAgICAgICAgJHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldy0+YXNfc3RyaW5nOwor ICAgICAgICB9CisgICAgICAgIGRpZSgiQ291bGQgbm90IHByb2Nlc3MgdmVjdG9yIHJlZ2lzdGVy ICIuJHZyZWcuIlxuIi4kdHJhY2UpOworICAgIH0KKyAgICByZXR1cm4gJDE7Cit9CisKKyMgUmVh ZCB0aGUgdm0gc2V0dGluZ3MgYW5kIGNvbnZlcnQgdG8gbWFzayBlbmNvZGluZy4KK3N1YiByZWFk X21hc2tfdnJlZyB7CisgICAgbXkgJHZyZWcgPSBzaGlmdDsKKyAgICAjIFRoZSBkZWZhdWx0IHZh bHVlIGlzIHVubWFza2VkLgorICAgIG15ICRtYXNrX2JpdCA9IDE7CisKKyAgICBpZiAoZGVmaW5l ZCgkdnJlZykpIHsKKyAgICAgICAgbXkgJHJlZ19pZCA9IHJlYWRfdnJlZyAkdnJlZzsKKyAgICAg ICAgaWYgKCRyZWdfaWQgPT0gMCkgeworICAgICAgICAgICAgJG1hc2tfYml0ID0gMDsKKyAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICAgICAgaWYg KCRoYXZlX3N0YWNrdHJhY2UpIHsKKyAgICAgICAgICAgICAgICAkdHJhY2UgPSBEZXZlbDo6U3Rh Y2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWUo IlRoZSAiLiR2cmVnLiIgaXMgbm90IHRoZSBtYXNrIHJlZ2lzdGVyIHYwLlxuIi4kdHJhY2UpOwor ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkbWFza19iaXQ7Cit9CisKKyMgVmVjdG9yIGNy eXB0byBpbnN0cnVjdGlvbnMKKworIyMgWnZiYiBhbmQgWnZrYiBpbnN0cnVjdGlvbnMKKyMjCisj IyB2YW5kbiAoYWxzbyBpbiB6dmtiKQorIyMgdmJyZXYKKyMjIHZicmV2OCAoYWxzbyBpbiB6dmti KQorIyMgdnJldjggKGFsc28gaW4genZrYikKKyMjIHZjbHoKKyMjIHZjdHoKKyMjIHZjcG9wCisj IyB2cm9sIChhbHNvIGluIHp2a2IpCisjIyB2cm9yIChhbHNvIGluIHp2a2IpCisjIyB2d3NsbAor CitzdWIgdmJyZXY4X3YgeworICAgICMgdmJyZXY4LnYgdmQsIHZzMiwgdm0KKyAgICBteSAkdGVt cGxhdGUgPSAwYjAxMDAxMF8wXzAwMDAwXzAxMDAwXzAxMF8wMDAwMF8xMDEwMTExOworICAgIG15 ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0Owor ICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4o JHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30K Kworc3ViIHZyZXY4X3YgeworICAgICMgdnJldjgudiB2ZCwgdnMyLCB2bQorICAgIG15ICR0ZW1w bGF0ZSA9IDBiMDEwMDEwXzBfMDAwMDBfMDEwMDFfMDEwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkg JHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7Cisg ICAgbXkgJHZtID0gcmVhZF9tYXNrX3ZyZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigk dGVtcGxhdGUgfCAoJHZtIDw8IDI1KSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwgNykpOworfQor CitzdWIgdnJvcl92aSB7CisgICAgIyB2cm9yLnZpIHZkLCB2czIsIHVpbW0KKyAgICBteSAkdGVt cGxhdGUgPSAwYjAxMDEwXzBfMV8wMDAwMF8wMDAwMF8wMTFfMDAwMDBfMTAxMDExMTsKKyAgICBt eSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICBteSAkdWltbSA9IHNoaWZ0OworICAgIG15ICR1aW1tX2k1ID0gJHVpbW0gPj4gNTsKKyAg ICBteSAkdWltbV9pNF8wID0gJHVpbW0gJiAwYjExMTExOworCisgICAgcmV0dXJuICIud29yZCAi LigkdGVtcGxhdGUgfCAoJHVpbW1faTUgPDwgMjYpIHwgKCR2czIgPDwgMjApIHwgKCR1aW1tX2k0 XzAgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2d3NsbF92diB7CisgICAgIyB2d3Ns bC52diB2ZCwgdnMyLCB2czEsIHZtCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMTAxMDFfMF8wMDAw MF8wMDAwMF8wMDBfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7 CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMxID0gcmVhZF92cmVn IHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAi LndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAoJHZzMiA8PCAyMCkgfCAoJHZzMSA8 PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworIyMgWnZiYyBpbnN0cnVjdGlvbnMKKworc3ViIHZj bG11bGhfdnggeworICAgICMgdmNsbXVsaC52eCB2ZCwgdnMyLCByczEKKyAgICBteSAkdGVtcGxh dGUgPSAwYjAwMTEwMTFfMDAwMDBfMDAwMDBfMTEwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZk ID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAg bXkgJHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRl IHwgKCR2czIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2 Y2xtdWxfdnhfdjB0IHsKKyAgICAjIHZjbG11bC52eCB2ZCwgdnMyLCByczEsIHYwLnQKKyAgICBt eSAkdGVtcGxhdGUgPSAwYjAwMTEwMDBfMDAwMDBfMDAwMDBfMTEwXzAwMDAwXzEwMTAxMTE7Cisg ICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hp ZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4o JHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9 CisKK3N1YiB2Y2xtdWxfdnggeworICAgICMgdmNsbXVsLnZ4IHZkLCB2czIsIHJzMQorICAgIG15 ICR0ZW1wbGF0ZSA9IDBiMDAxMTAwMV8wMDAwMF8wMDAwMF8xMTBfMDAwMDBfMTAxMDExMTsKKyAg ICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlm dDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigk dGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30K KworIyMgWnZrZyBpbnN0cnVjdGlvbnMKKworc3ViIHZnaHNoX3Z2IHsKKyAgICAjIHZnaHNoLnZ2 IHZkLCB2czIsIHZzMQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAxMTAwMV8wMDAwMF8wMDAwMF8w MTBfMDAwMDBfMTExMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkg JHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMxID0gcmVhZF92cmVnIHNoaWZ0Owor ICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCR2czEgPDwg MTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2Z211bF92diB7CisgICAgIyB2Z211bC52diB2 ZCwgdnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDEwMDAxXzAwMDAwXzEwMDAxXzAxMF8wMDAw MF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0g cmVhZF92cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIg PDwgMjApIHwgKCR2ZCA8PCA3KSk7Cit9CisKKyMjIFp2a25lZCBpbnN0cnVjdGlvbnMKKworc3Vi IHZhZXNkZl92cyB7CisgICAgIyB2YWVzZGYudnMgdmQsIHZzMgorICAgIG15ICR0ZW1wbGF0ZSA9 IDBiMTAxMDAxXzFfMDAwMDBfMDAwMDFfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0g cmVhZF92cmVnICBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnICBzaGlmdDsKKyAgICBy ZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwgNykpOwor fQorCitzdWIgdmFlc2RtX3ZzIHsKKyAgICAjIHZhZXNkbS52cyB2ZCwgdnMyCisgICAgbXkgJHRl bXBsYXRlID0gMGIxMDEwMDFfMV8wMDAwMF8wMDAwMF8wMTBfMDAwMDBfMTExMDExMTsKKyAgICBt eSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwg NykpOworfQorCitzdWIgdmFlc2VmX3ZzIHsKKyAgICAjIHZhZXNlZi52cyB2ZCwgdnMyCisgICAg bXkgJHRlbXBsYXRlID0gMGIxMDEwMDFfMV8wMDAwMF8wMDAxMV8wMTBfMDAwMDBfMTExMDExMTsK KyAgICBteSAkdmQgPSByZWFkX3ZyZWcgIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcg IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwg KCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2YWVzZW1fdnMgeworICAgICMgdmFlc2VtLnZzIHZkLCB2 czIKKyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMTAwMV8xXzAwMDAwXzAwMDEwXzAxMF8wMDAwMF8x MTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyAgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJl YWRfdnJlZyAgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8 PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZhZXNrZjFfdmkgeworICAgICMgdmFlc2tm MS52aSB2ZCwgdnMyLCB1aW1tbQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAwMDEwXzFfMDAwMDBf MDAwMDBfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnICBzaGlmdDsK KyAgICBteSAkdnMyID0gcmVhZF92cmVnICBzaGlmdDsKKyAgICBteSAkdWltbSA9IHNoaWZ0Owor ICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR1aW1tIDw8IDE1KSB8ICgkdnMyIDw8 IDIwKSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdmFlc2tmMl92aSB7CisgICAgIyB2YWVza2Yy LnZpIHZkLCB2czIsIHVpbW0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMTAxMF8xXzAwMDAwXzAw MDAwXzAxMF8wMDAwMF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAg ICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR1aW1tID0gc2hpZnQ7CisgICAg cmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHVpbW0gPDwgMTUp IHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2YWVzel92cyB7CisgICAgIyB2YWVzei52cyB2ZCwg dnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDEwMDFfMV8wMDAwMF8wMDExMV8wMTBfMDAwMDBf MTExMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgIHNoaWZ0OworICAgIG15ICR2czIgPSBy ZWFkX3ZyZWcgIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIg PDwgMjApIHwgKCR2ZCA8PCA3KSk7Cit9CisKKyMjIFp2a25oYSBhbmQgWnZrbmhiIGluc3RydWN0 aW9ucworCitzdWIgdnNoYTJtc192diB7CisgICAgIyB2c2hhMm1zLnZ2IHZkLCB2czIsIHZzMQor ICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAxMTAxMV8wMDAwMF8wMDAwMF8wMTBfMDAwMDBfMTExMDEx MTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJl ZyBzaGlmdDsKKyAgICBteSAkdnMxID0gcmVhZF92cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndv cmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApfCAoJHZzMSA8PCAxNSApfCAoJHZkIDw8IDcp KTsKK30KKworc3ViIHZzaGEyY2hfdnYgeworICAgICMgdnNoYTJjaC52diB2ZCwgdnMyLCB2czEK KyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMTExMF8xMDAwMF8wMDAwMF8wMDFfMDAwMDBfMDExMTAx MTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3Zy ZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53 b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKXwgKCR2czEgPDwgMTUgKXwgKCR2ZCA8PCA3 KSk7Cit9CisKK3N1YiB2c2hhMmNsX3Z2IHsKKyAgICAjIHZzaGEyY2wudnYgdmQsIHZzMiwgdnMx CisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDExMTFfMTAwMDBfMDAwMDBfMDAxXzAwMDAwXzAxMTEw MTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92 cmVnIHNoaWZ0OworICAgIG15ICR2czEgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgcmV0dXJuICIu d29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCl8ICgkdnMxIDw8IDE1ICl8ICgkdmQgPDwg NykpOworfQorCisjIyBadmtzZWQgaW5zdHJ1Y3Rpb25zCisKK3N1YiB2c200a192aSB7CisgICAg IyB2c200ay52aSB2ZCwgdnMyLCB1aW1tCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDAwMDExXzAw MDAwXzAwMDAwXzAxMF8wMDAwMF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlm dDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR1aW1tID0gc2hpZnQ7 CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHVpbW0g PDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2c200cl92cyB7CisgICAgIyB2c200ci52 cyB2ZCwgdnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDEwMDExXzAwMDAwXzEwMDAwXzAxMF8w MDAwMF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMy ID0gcmVhZF92cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2 czIgPDwgMjApIHwgKCR2ZCA8PCA3KSk7Cit9CisKKyMjIHp2a3NoIGluc3RydWN0aW9ucworCitz dWIgdnNtM2NfdmkgeworICAgICMgdnNtM2MudmkgdmQsIHZzMiwgdWltbQorICAgIG15ICR0ZW1w bGF0ZSA9IDBiMTAxMDExMV8wMDAwMF8wMDAwMF8wMTBfMDAwMDBfMTExMDExMTsKKyAgICBteSAk dmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAg ICBteSAkdWltbSA9IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2 czIgPDwgMjApIHwgKCR1aW1tIDw8IDE1ICkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZzbTNt ZV92diB7CisgICAgIyB2c20zbWUudnYgdmQsIHZzMiwgdnMxCisgICAgbXkgJHRlbXBsYXRlID0g MGIxMDAwMDAxXzAwMDAwXzAwMDAwXzAxMF8wMDAwMF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJl YWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2 czEgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAo JHZzMiA8PCAyMCkgfCAoJHZzMSA8PCAxNSApIHwgKCR2ZCA8PCA3KSk7Cit9CisKKzE7Ci0tIAoy LjI4LjAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==