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="En7G7TJI" Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4EEB6D60 for ; Sun, 26 Nov 2023 23:07:41 -0800 (PST) Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-1cf7a8ab047so28122895ad.1 for ; Sun, 26 Nov 2023 23:07:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068861; x=1701673661; 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=H2ie9UBY5BJCsnebwLbVxGGtRlv0a5BfHvQORsnSkzU=; b=En7G7TJI5Ej6IKWKKC783xYJ4sSl+QzALpNgLRtTsqiwb+thF+vDCcfNUd3nNdluqB bZB7NQmCpuJtlf1BIEGHuz/6WfBNcklsM26upCMB62XWCRcjJOG4cGBLk2Vlo5V7y9Ce tJDufrCwQ0eNeTVGp1zO9GlzcorSKdzotXMVE/TQ04C9UfIFaL9ug5Rmgwmrm+E2ecvg AlQ4xEO/Q817PJIkNN1i1YqsyLtlLoQzqgqKngdPCdk5LMYxdLrB0UqA/lBA+SnJsd8f RMYqLe9RKXcQehSV+Hwpu4cqFsy+S1vvYgxIKO0Pc5wCJMHuGs50vfcS7QA1JLSX+vSd VNyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068861; x=1701673661; 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=H2ie9UBY5BJCsnebwLbVxGGtRlv0a5BfHvQORsnSkzU=; b=YexUlve7UcVG11SpRACZqCGa3GeNtrWa790PUv6FOiDeixQENqpNWN86U9EbPoO0Dp 8/Oz8PmFKEF8QPxj6tBgyCuBGRxnrZ4zIFnywHBaJPX5k/mmsuEcq4RDH2Ez8t0mr02N rIiiusOpEXx80b7y+bTJn0pttr8OGoGCWhSPgeQdLN+kuHoafsDJnGFLQFYIXuxyrQMz YozmOASEWs/QpGNQEPkDLdqQigqKbDdrP2uUa1xrmAI8r/jRjYspv3Pf/HksUlEaY16N x9C4FOuxXRuklD/g19XgO0IzRlk5gQHkZLAQD5e6YAUQL9IdDgFlwlYqrEQm3svshk87 hIiQ== X-Gm-Message-State: AOJu0Yy9ywM8AoMCwHhNsGzOEszuSOc3Rd3OPpp+Kb7L47gER5XnaR3P +ySPVFCss57g8R8jg2ZWFwaTaA== X-Google-Smtp-Source: AGHT+IE1JBBVZSJGyCAbSJ13cr1H5pF+3UXdDbWfyBIJioNv3kdxLCkMNdaACGujT6Ku8o5fRzSGSQ== X-Received: by 2002:a17:902:d38d:b0:1cf:a4e8:d2a1 with SMTP id e13-20020a170902d38d00b001cfa4e8d2a1mr8132283pld.42.1701068860527; Sun, 26 Nov 2023 23:07:40 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.37 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:40 -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 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 v2 09/13] RISC-V: crypto: add Zvknha/b accelerated SHA224/256 implementations Date: Mon, 27 Nov 2023 15:06:59 +0800 Message-Id: <20231127070703.1697-10-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-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 Add SHA224 and 256 implementations using Zvknha or Zvknhb vector crypto extensions from OpenSSL(openssl/openssl#21923). Co-developed-by: Charalampos Mitrodimas Signed-off-by: Charalampos Mitrodimas 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 v2: - Do not turn on kconfig `SHA256_RISCV64` option by default. - Add `asmlinkage` qualifier for crypto asm function. - Rename sha256-riscv64-zvkb-zvknha_or_zvknhb to sha256-riscv64-zvknha_or_zvknhb-zvkb. - Reorder structure sha256_algs members initialization in the order declared. --- arch/riscv/crypto/Kconfig | 11 + arch/riscv/crypto/Makefile | 7 + arch/riscv/crypto/sha256-riscv64-glue.c | 145 ++++++++ .../sha256-riscv64-zvknha_or_zvknhb-zvkb.pl | 318 ++++++++++++++++++ 4 files changed, 481 insertions(+) create mode 100644 arch/riscv/crypto/sha256-riscv64-glue.c create mode 100644 arch/riscv/crypto/sha256-riscv64-zvknha_or_zvknhb-zvkb.pl diff --git a/arch/riscv/crypto/Kconfig b/arch/riscv/crypto/Kconfig index 6863f01a2ab0..d31af9190717 100644 --- a/arch/riscv/crypto/Kconfig +++ b/arch/riscv/crypto/Kconfig @@ -44,4 +44,15 @@ config CRYPTO_GHASH_RISCV64 Architecture: riscv64 using: - Zvkg vector crypto extension +config CRYPTO_SHA256_RISCV64 + tristate "Hash functions: SHA-224 and SHA-256" + depends on 64BIT && RISCV_ISA_V + select CRYPTO_SHA256 + help + SHA-224 and SHA-256 secure hash algorithm (FIPS 180) + + Architecture: riscv64 using: + - Zvknha or Zvknhb vector crypto extensions + - Zvkb vector crypto extension + endmenu diff --git a/arch/riscv/crypto/Makefile b/arch/riscv/crypto/Makefile index 94a7f8eaa8a7..e9d7717ec943 100644 --- a/arch/riscv/crypto/Makefile +++ b/arch/riscv/crypto/Makefile @@ -12,6 +12,9 @@ aes-block-riscv64-y := aes-riscv64-block-mode-glue.o aes-riscv64-zvkned-zvbb-zvk obj-$(CONFIG_CRYPTO_GHASH_RISCV64) += ghash-riscv64.o ghash-riscv64-y := ghash-riscv64-glue.o ghash-riscv64-zvkg.o +obj-$(CONFIG_CRYPTO_SHA256_RISCV64) += sha256-riscv64.o +sha256-riscv64-y := sha256-riscv64-glue.o sha256-riscv64-zvknha_or_zvknhb-zvkb.o + quiet_cmd_perlasm = PERLASM $@ cmd_perlasm = $(PERL) $(<) void $(@) @@ -27,7 +30,11 @@ $(obj)/aes-riscv64-zvkned-zvkb.S: $(src)/aes-riscv64-zvkned-zvkb.pl $(obj)/ghash-riscv64-zvkg.S: $(src)/ghash-riscv64-zvkg.pl $(call cmd,perlasm) +$(obj)/sha256-riscv64-zvknha_or_zvknhb-zvkb.S: $(src)/sha256-riscv64-zvknha_or_zvknhb-zvkb.pl + $(call cmd,perlasm) + clean-files += aes-riscv64-zvkned.S clean-files += aes-riscv64-zvkned-zvbb-zvkg.S clean-files += aes-riscv64-zvkned-zvkb.S clean-files += ghash-riscv64-zvkg.S +clean-files += sha256-riscv64-zvknha_or_zvknhb-zvkb.S diff --git a/arch/riscv/crypto/sha256-riscv64-glue.c b/arch/riscv/crypto/sha256-riscv64-glue.c new file mode 100644 index 000000000000..760d89031d1c --- /dev/null +++ b/arch/riscv/crypto/sha256-riscv64-glue.c @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Linux/riscv64 port of the OpenSSL SHA256 implementation for RISC-V 64 + * + * Copyright (C) 2022 VRULL GmbH + * Author: Heiko Stuebner + * + * Copyright (C) 2023 SiFive, Inc. + * Author: Jerry Shih + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * sha256 using zvkb and zvknha/b vector crypto extension + * + * This asm function will just take the first 256-bit as the sha256 state from + * the pointer to `struct sha256_state`. + */ +asmlinkage void +sha256_block_data_order_zvkb_zvknha_or_zvknhb(struct sha256_state *digest, + const u8 *data, int num_blks); + +static int riscv64_sha256_update(struct shash_desc *desc, const u8 *data, + unsigned int len) +{ + int ret = 0; + + /* + * Make sure struct sha256_state begins directly with the SHA256 + * 256-bit internal state, as this is what the asm function expect. + */ + BUILD_BUG_ON(offsetof(struct sha256_state, state) != 0); + + if (crypto_simd_usable()) { + kernel_vector_begin(); + ret = sha256_base_do_update( + desc, data, len, + sha256_block_data_order_zvkb_zvknha_or_zvknhb); + kernel_vector_end(); + } else { + ret = crypto_sha256_update(desc, data, len); + } + + return ret; +} + +static int riscv64_sha256_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) +{ + if (crypto_simd_usable()) { + kernel_vector_begin(); + if (len) + sha256_base_do_update( + desc, data, len, + sha256_block_data_order_zvkb_zvknha_or_zvknhb); + sha256_base_do_finalize( + desc, sha256_block_data_order_zvkb_zvknha_or_zvknhb); + kernel_vector_end(); + + return sha256_base_finish(desc, out); + } + + return crypto_sha256_finup(desc, data, len, out); +} + +static int riscv64_sha256_final(struct shash_desc *desc, u8 *out) +{ + return riscv64_sha256_finup(desc, NULL, 0, out); +} + +static struct shash_alg sha256_algs[] = { + { + .init = sha256_base_init, + .update = riscv64_sha256_update, + .final = riscv64_sha256_final, + .finup = riscv64_sha256_finup, + .descsize = sizeof(struct sha256_state), + .digestsize = SHA256_DIGEST_SIZE, + .base = { + .cra_blocksize = SHA256_BLOCK_SIZE, + .cra_priority = 150, + .cra_name = "sha256", + .cra_driver_name = "sha256-riscv64-zvknha_or_zvknhb-zvkb", + .cra_module = THIS_MODULE, + }, + }, { + .init = sha224_base_init, + .update = riscv64_sha256_update, + .final = riscv64_sha256_final, + .finup = riscv64_sha256_finup, + .descsize = sizeof(struct sha256_state), + .digestsize = SHA224_DIGEST_SIZE, + .base = { + .cra_blocksize = SHA224_BLOCK_SIZE, + .cra_priority = 150, + .cra_name = "sha224", + .cra_driver_name = "sha224-riscv64-zvknha_or_zvknhb-zvkb", + .cra_module = THIS_MODULE, + }, + }, +}; + +static inline bool check_sha256_ext(void) +{ + /* + * From the spec: + * The Zvknhb ext supports both SHA-256 and SHA-512 and Zvknha only + * supports SHA-256. + */ + return (riscv_isa_extension_available(NULL, ZVKNHA) || + riscv_isa_extension_available(NULL, ZVKNHB)) && + riscv_isa_extension_available(NULL, ZVKB) && + riscv_vector_vlen() >= 128; +} + +static int __init riscv64_sha256_mod_init(void) +{ + if (check_sha256_ext()) + return crypto_register_shashes(sha256_algs, + ARRAY_SIZE(sha256_algs)); + + return -ENODEV; +} + +static void __exit riscv64_sha256_mod_fini(void) +{ + crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs)); +} + +module_init(riscv64_sha256_mod_init); +module_exit(riscv64_sha256_mod_fini); + +MODULE_DESCRIPTION("SHA-256 (RISC-V accelerated)"); +MODULE_AUTHOR("Heiko Stuebner "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_CRYPTO("sha224"); +MODULE_ALIAS_CRYPTO("sha256"); diff --git a/arch/riscv/crypto/sha256-riscv64-zvknha_or_zvknhb-zvkb.pl b/arch/riscv/crypto/sha256-riscv64-zvknha_or_zvknhb-zvkb.pl new file mode 100644 index 000000000000..51b2d9d4f8f1 --- /dev/null +++ b/arch/riscv/crypto/sha256-riscv64-zvknha_or_zvknhb-zvkb.pl @@ -0,0 +1,318 @@ +#! /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, 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. + +# The generated code of this file depends on the following RISC-V extensions: +# - RV64I +# - RISC-V Vector ('V') with VLEN >= 128 +# - RISC-V Vector Cryptography Bit-manipulation extension ('Zvkb') +# - RISC-V Vector SHA-2 Secure Hash extension ('Zvknha' or 'Zvknhb') + +use strict; +use warnings; + +use FindBin qw($Bin); +use lib "$Bin"; +use lib "$Bin/../../perlasm"; +use riscv; + +# $output is the last argument if it looks like a file (it has an extension) +# $flavour is the first argument if it doesn't look like a file +my $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; +my $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; + +$output and open STDOUT,">$output"; + +my $code=<<___; +.text +___ + +my ($V0, $V1, $V2, $V3, $V4, $V5, $V6, $V7, + $V8, $V9, $V10, $V11, $V12, $V13, $V14, $V15, + $V16, $V17, $V18, $V19, $V20, $V21, $V22, $V23, + $V24, $V25, $V26, $V27, $V28, $V29, $V30, $V31, +) = map("v$_",(0..31)); + +my $K256 = "K256"; + +# Function arguments +my ($H, $INP, $LEN, $KT, $H2, $INDEX_PATTERN) = ("a0", "a1", "a2", "a3", "t3", "t4"); + +sub sha_256_load_constant { + my $code=<<___; + la $KT, $K256 # Load round constants K256 + @{[vle32_v $V10, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V11, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V12, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V13, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V14, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V15, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V16, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V17, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V18, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V19, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V20, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V21, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V22, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V23, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V24, $KT]} + addi $KT, $KT, 16 + @{[vle32_v $V25, $KT]} +___ + + return $code; +} + +################################################################################ +# void sha256_block_data_order_zvkb_zvknha_or_zvknhb(void *c, const void *p, size_t len) +$code .= <<___; +.p2align 2 +.globl sha256_block_data_order_zvkb_zvknha_or_zvknhb +.type sha256_block_data_order_zvkb_zvknha_or_zvknhb,\@function +sha256_block_data_order_zvkb_zvknha_or_zvknhb: + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + + @{[sha_256_load_constant]} + + # H is stored as {a,b,c,d},{e,f,g,h}, but we need {f,e,b,a},{h,g,d,c} + # The dst vtype is e32m1 and the index vtype is e8mf4. + # We use index-load with the following index pattern at v26. + # i8 index: + # 20, 16, 4, 0 + # Instead of setting the i8 index, we could use a single 32bit + # little-endian value to cover the 4xi8 index. + # i32 value: + # 0x 00 04 10 14 + li $INDEX_PATTERN, 0x00041014 + @{[vsetivli "zero", 1, "e32", "m1", "ta", "ma"]} + @{[vmv_v_x $V26, $INDEX_PATTERN]} + + addi $H2, $H, 8 + + # Use index-load to get {f,e,b,a},{h,g,d,c} + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + @{[vluxei8_v $V6, $H, $V26]} + @{[vluxei8_v $V7, $H2, $V26]} + + # Setup v0 mask for the vmerge to replace the first word (idx==0) in key-scheduling. + # The AVL is 4 in SHA, so we could use a single e8(8 element masking) for masking. + @{[vsetivli "zero", 1, "e8", "m1", "ta", "ma"]} + @{[vmv_v_i $V0, 0x01]} + + @{[vsetivli "zero", 4, "e32", "m1", "ta", "ma"]} + +L_round_loop: + # Decrement length by 1 + add $LEN, $LEN, -1 + + # Keep the current state as we need it later: H' = H+{a',b',c',...,h'}. + @{[vmv_v_v $V30, $V6]} + @{[vmv_v_v $V31, $V7]} + + # Load the 512-bits of the message block in v1-v4 and perform + # an endian swap on each 4 bytes element. + @{[vle32_v $V1, $INP]} + @{[vrev8_v $V1, $V1]} + add $INP, $INP, 16 + @{[vle32_v $V2, $INP]} + @{[vrev8_v $V2, $V2]} + add $INP, $INP, 16 + @{[vle32_v $V3, $INP]} + @{[vrev8_v $V3, $V3]} + add $INP, $INP, 16 + @{[vle32_v $V4, $INP]} + @{[vrev8_v $V4, $V4]} + add $INP, $INP, 16 + + # Quad-round 0 (+0, Wt from oldest to newest in v1->v2->v3->v4) + @{[vadd_vv $V5, $V10, $V1]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V3, $V2, $V0]} + @{[vsha2ms_vv $V1, $V5, $V4]} # Generate W[19:16] + + # Quad-round 1 (+1, v2->v3->v4->v1) + @{[vadd_vv $V5, $V11, $V2]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V4, $V3, $V0]} + @{[vsha2ms_vv $V2, $V5, $V1]} # Generate W[23:20] + + # Quad-round 2 (+2, v3->v4->v1->v2) + @{[vadd_vv $V5, $V12, $V3]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V1, $V4, $V0]} + @{[vsha2ms_vv $V3, $V5, $V2]} # Generate W[27:24] + + # Quad-round 3 (+3, v4->v1->v2->v3) + @{[vadd_vv $V5, $V13, $V4]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V2, $V1, $V0]} + @{[vsha2ms_vv $V4, $V5, $V3]} # Generate W[31:28] + + # Quad-round 4 (+0, v1->v2->v3->v4) + @{[vadd_vv $V5, $V14, $V1]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V3, $V2, $V0]} + @{[vsha2ms_vv $V1, $V5, $V4]} # Generate W[35:32] + + # Quad-round 5 (+1, v2->v3->v4->v1) + @{[vadd_vv $V5, $V15, $V2]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V4, $V3, $V0]} + @{[vsha2ms_vv $V2, $V5, $V1]} # Generate W[39:36] + + # Quad-round 6 (+2, v3->v4->v1->v2) + @{[vadd_vv $V5, $V16, $V3]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V1, $V4, $V0]} + @{[vsha2ms_vv $V3, $V5, $V2]} # Generate W[43:40] + + # Quad-round 7 (+3, v4->v1->v2->v3) + @{[vadd_vv $V5, $V17, $V4]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V2, $V1, $V0]} + @{[vsha2ms_vv $V4, $V5, $V3]} # Generate W[47:44] + + # Quad-round 8 (+0, v1->v2->v3->v4) + @{[vadd_vv $V5, $V18, $V1]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V3, $V2, $V0]} + @{[vsha2ms_vv $V1, $V5, $V4]} # Generate W[51:48] + + # Quad-round 9 (+1, v2->v3->v4->v1) + @{[vadd_vv $V5, $V19, $V2]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V4, $V3, $V0]} + @{[vsha2ms_vv $V2, $V5, $V1]} # Generate W[55:52] + + # Quad-round 10 (+2, v3->v4->v1->v2) + @{[vadd_vv $V5, $V20, $V3]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V1, $V4, $V0]} + @{[vsha2ms_vv $V3, $V5, $V2]} # Generate W[59:56] + + # Quad-round 11 (+3, v4->v1->v2->v3) + @{[vadd_vv $V5, $V21, $V4]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + @{[vmerge_vvm $V5, $V2, $V1, $V0]} + @{[vsha2ms_vv $V4, $V5, $V3]} # Generate W[63:60] + + # Quad-round 12 (+0, v1->v2->v3->v4) + # Note that we stop generating new message schedule words (Wt, v1-13) + # as we already generated all the words we end up consuming (i.e., W[63:60]). + @{[vadd_vv $V5, $V22, $V1]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + + # Quad-round 13 (+1, v2->v3->v4->v1) + @{[vadd_vv $V5, $V23, $V2]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + + # Quad-round 14 (+2, v3->v4->v1->v2) + @{[vadd_vv $V5, $V24, $V3]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + + # Quad-round 15 (+3, v4->v1->v2->v3) + @{[vadd_vv $V5, $V25, $V4]} + @{[vsha2cl_vv $V7, $V6, $V5]} + @{[vsha2ch_vv $V6, $V7, $V5]} + + # H' = H+{a',b',c',...,h'} + @{[vadd_vv $V6, $V30, $V6]} + @{[vadd_vv $V7, $V31, $V7]} + bnez $LEN, L_round_loop + + # Store {f,e,b,a},{h,g,d,c} back to {a,b,c,d},{e,f,g,h}. + @{[vsuxei8_v $V6, $H, $V26]} + @{[vsuxei8_v $V7, $H2, $V26]} + + ret +.size sha256_block_data_order_zvkb_zvknha_or_zvknhb,.-sha256_block_data_order_zvkb_zvknha_or_zvknhb + +.p2align 2 +.type $K256,\@object +$K256: + .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 + .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 + .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 + .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 + .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc + .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da + .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 + .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 + .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 + .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 + .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 + .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 + .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 + .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 + .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 + .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +.size $K256,.-$K256 +___ + +print $code; + +close STDOUT or die "error closing STDOUT: $!"; -- 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 76A06C07D5A for ; Mon, 27 Nov 2023 07:07:53 +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=KH6gia3JJ9TU8fkhQyQ0NBAB+ypZKaM9UU0C/wIOCwQ=; b=e6NSToM6xElJDK T9DpeAOHMkZD1mkua1GRbQxjmY1lumESnqVBk+loi0IsIzRsw/L4qfFPM231TK7TLwPeBajr8+YDj Po3scsrjsNnSRompYEwbQKPnPMOoVx9knm+m8+1r1qNvqqQmQTdMRGjT8BqleUmluD0oVBfR+xhqj B26eV95nXwHgdJJXr57tweptDZtXPV1lbT3SBzqyeOrdEleYUYQk9c6Iz+n1iOBhgOkwOGecpsgWw PHO05s7ELg2/RD0CDzfAdzQBAjXY8V0/MEMfav1VL+LtjZs4ybLe74zDpruw1GDrK2o1VkAlP/bA5 PUWNqXIurBzOwFRKorsQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7Vid-001ezu-0d; Mon, 27 Nov 2023 07:07:47 +0000 Received: from mail-pl1-x632.google.com ([2607:f8b0:4864:20::632]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r7ViX-001evj-0h for linux-riscv@lists.infradead.org; Mon, 27 Nov 2023 07:07:44 +0000 Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1ce28faa92dso28038985ad.2 for ; Sun, 26 Nov 2023 23:07:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068860; x=1701673660; 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=H2ie9UBY5BJCsnebwLbVxGGtRlv0a5BfHvQORsnSkzU=; b=nR4qqurgpbHn8DT1DFRVmFIHonrgvgsAuL53M3h+mtrhQv9M8JbvFUl1o0PgZELDe4 MhViTishvl9yC90MIu19JZb6MNkCd4TGcLuRB6mrKdk0TCwadgQIDq/3WaZfGQDFwtls 1QOCD6bPwlOVbw9THE0olXS/Ibq0gKFx6ysrnLBdYlzVtn0xZSj8/zQdliACl3TT18/Q j4mmVpZtegw4q91nPVuUbEEZTzqBYSuNuAOH+6ifHm6anMoIzGtKlD1H5F6PHujr4gSk mPM3LbSZwRh7/NgdCezFGBNlqM/VWMttpx+yyzbUww+TqA8vmnXM3H28Fxcu4TfuZD4V ZP/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068860; x=1701673660; 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=H2ie9UBY5BJCsnebwLbVxGGtRlv0a5BfHvQORsnSkzU=; b=qp/VXSYBRXvROOiyhBUWHx/aEM19G1V8mI/FYU+EMcBd4ZKQn3YQ7pczlw1B196rBU Gc8Bjfb3k9TdkTfHyebaZ4RL2Ehhca0mP/0DDp8Ots/noOSc+VPN/vP/4juqQTM7aq/0 HwHAJg9ZL5LCqtL0NHpcz5ulcdRoXncOkD2w7PNyDLzVw9UVonfpPg98x+pjmsgooDFH t89qROG8NTM8mYqkiSEd2uIINllroH51gMQ7pnWbpYFiLyjB0Y+RWUPMtPCxNZmkymyx ZGAM6TkTfdskHTiCbjoU0vBm4fqilDHpuERyRcJZPWZ5rDbHM2BdPNg/u3JwMvISdxt6 Hyqw== X-Gm-Message-State: AOJu0YyEuWTjtXdHmhfaYXrmbz7pCVOEBGd1hWo8TqQikPMt7nJplMsF Z29lY96uLqayNiBL0CxuLaPnyQ== X-Google-Smtp-Source: AGHT+IE1JBBVZSJGyCAbSJ13cr1H5pF+3UXdDbWfyBIJioNv3kdxLCkMNdaACGujT6Ku8o5fRzSGSQ== X-Received: by 2002:a17:902:d38d:b0:1cf:a4e8:d2a1 with SMTP id e13-20020a170902d38d00b001cfa4e8d2a1mr8132283pld.42.1701068860527; Sun, 26 Nov 2023 23:07:40 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.37 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:40 -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 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 v2 09/13] RISC-V: crypto: add Zvknha/b accelerated SHA224/256 implementations Date: Mon, 27 Nov 2023 15:06:59 +0800 Message-Id: <20231127070703.1697-10-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-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-20231126_230741_271658_B044AC73 X-CRM114-Status: GOOD ( 31.61 ) 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 QWRkIFNIQTIyNCBhbmQgMjU2IGltcGxlbWVudGF0aW9ucyB1c2luZyBadmtuaGEgb3IgWnZrbmhi IHZlY3RvciBjcnlwdG8KZXh0ZW5zaW9ucyBmcm9tIE9wZW5TU0wob3BlbnNzbC9vcGVuc3NsIzIx OTIzKS4KCkNvLWRldmVsb3BlZC1ieTogQ2hhcmFsYW1wb3MgTWl0cm9kaW1hcyA8Y2hhcmFsYW1w b3MubWl0cm9kaW1hc0B2cnVsbC5ldT4KU2lnbmVkLW9mZi1ieTogQ2hhcmFsYW1wb3MgTWl0cm9k aW1hcyA8Y2hhcmFsYW1wb3MubWl0cm9kaW1hc0B2cnVsbC5ldT4KQ28tZGV2ZWxvcGVkLWJ5OiBI ZWlrbyBTdHVlYm5lciA8aGVpa28uc3R1ZWJuZXJAdnJ1bGwuZXU+ClNpZ25lZC1vZmYtYnk6IEhl aWtvIFN0dWVibmVyIDxoZWlrby5zdHVlYm5lckB2cnVsbC5ldT4KQ28tZGV2ZWxvcGVkLWJ5OiBQ aG9lYmUgQ2hlbiA8cGhvZWJlLmNoZW5Ac2lmaXZlLmNvbT4KU2lnbmVkLW9mZi1ieTogUGhvZWJl IENoZW4gPHBob2ViZS5jaGVuQHNpZml2ZS5jb20+ClNpZ25lZC1vZmYtYnk6IEplcnJ5IFNoaWgg PGplcnJ5LnNoaWhAc2lmaXZlLmNvbT4KLS0tCkNoYW5nZWxvZyB2MjoKIC0gRG8gbm90IHR1cm4g b24ga2NvbmZpZyBgU0hBMjU2X1JJU0NWNjRgIG9wdGlvbiBieSBkZWZhdWx0LgogLSBBZGQgYGFz bWxpbmthZ2VgIHF1YWxpZmllciBmb3IgY3J5cHRvIGFzbSBmdW5jdGlvbi4KIC0gUmVuYW1lIHNo YTI1Ni1yaXNjdjY0LXp2a2ItenZrbmhhX29yX3p2a25oYiB0bwogICBzaGEyNTYtcmlzY3Y2NC16 dmtuaGFfb3JfenZrbmhiLXp2a2IuCiAtIFJlb3JkZXIgc3RydWN0dXJlIHNoYTI1Nl9hbGdzIG1l bWJlcnMgaW5pdGlhbGl6YXRpb24gaW4gdGhlIG9yZGVyCiAgIGRlY2xhcmVkLgotLS0KIGFyY2gv cmlzY3YvY3J5cHRvL0tjb25maWcgICAgICAgICAgICAgICAgICAgICB8ICAxMSArCiBhcmNoL3Jp c2N2L2NyeXB0by9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDcgKwogYXJjaC9yaXNj di9jcnlwdG8vc2hhMjU2LXJpc2N2NjQtZ2x1ZS5jICAgICAgIHwgMTQ1ICsrKysrKysrCiAuLi4v c2hhMjU2LXJpc2N2NjQtenZrbmhhX29yX3p2a25oYi16dmtiLnBsICAgfCAzMTggKysrKysrKysr KysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDQ4MSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9k ZSAxMDA2NDQgYXJjaC9yaXNjdi9jcnlwdG8vc2hhMjU2LXJpc2N2NjQtZ2x1ZS5jCiBjcmVhdGUg bW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9jcnlwdG8vc2hhMjU2LXJpc2N2NjQtenZrbmhhX29yX3p2 a25oYi16dmtiLnBsCgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9jcnlwdG8vS2NvbmZpZyBiL2Fy Y2gvcmlzY3YvY3J5cHRvL0tjb25maWcKaW5kZXggNjg2M2YwMWEyYWIwLi5kMzFhZjkxOTA3MTcg MTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvY3J5cHRvL0tjb25maWcKKysrIGIvYXJjaC9yaXNjdi9j cnlwdG8vS2NvbmZpZwpAQCAtNDQsNCArNDQsMTUgQEAgY29uZmlnIENSWVBUT19HSEFTSF9SSVND VjY0CiAJICBBcmNoaXRlY3R1cmU6IHJpc2N2NjQgdXNpbmc6CiAJICAtIFp2a2cgdmVjdG9yIGNy eXB0byBleHRlbnNpb24KIAorY29uZmlnIENSWVBUT19TSEEyNTZfUklTQ1Y2NAorCXRyaXN0YXRl ICJIYXNoIGZ1bmN0aW9uczogU0hBLTIyNCBhbmQgU0hBLTI1NiIKKwlkZXBlbmRzIG9uIDY0QklU ICYmIFJJU0NWX0lTQV9WCisJc2VsZWN0IENSWVBUT19TSEEyNTYKKwloZWxwCisJICBTSEEtMjI0 IGFuZCBTSEEtMjU2IHNlY3VyZSBoYXNoIGFsZ29yaXRobSAoRklQUyAxODApCisKKwkgIEFyY2hp dGVjdHVyZTogcmlzY3Y2NCB1c2luZzoKKwkgIC0gWnZrbmhhIG9yIFp2a25oYiB2ZWN0b3IgY3J5 cHRvIGV4dGVuc2lvbnMKKwkgIC0gWnZrYiB2ZWN0b3IgY3J5cHRvIGV4dGVuc2lvbgorCiBlbmRt ZW51CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZSBiL2FyY2gvcmlzY3Yv Y3J5cHRvL01ha2VmaWxlCmluZGV4IDk0YTdmOGVhYThhNy4uZTlkNzcxN2VjOTQzIDEwMDY0NAot LS0gYS9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZQorKysgYi9hcmNoL3Jpc2N2L2NyeXB0by9N YWtlZmlsZQpAQCAtMTIsNiArMTIsOSBAQCBhZXMtYmxvY2stcmlzY3Y2NC15IDo9IGFlcy1yaXNj djY0LWJsb2NrLW1vZGUtZ2x1ZS5vIGFlcy1yaXNjdjY0LXp2a25lZC16dmJiLXp2awogb2JqLSQo Q09ORklHX0NSWVBUT19HSEFTSF9SSVNDVjY0KSArPSBnaGFzaC1yaXNjdjY0Lm8KIGdoYXNoLXJp c2N2NjQteSA6PSBnaGFzaC1yaXNjdjY0LWdsdWUubyBnaGFzaC1yaXNjdjY0LXp2a2cubwogCitv YmotJChDT05GSUdfQ1JZUFRPX1NIQTI1Nl9SSVNDVjY0KSArPSBzaGEyNTYtcmlzY3Y2NC5vCitz aGEyNTYtcmlzY3Y2NC15IDo9IHNoYTI1Ni1yaXNjdjY0LWdsdWUubyBzaGEyNTYtcmlzY3Y2NC16 dmtuaGFfb3JfenZrbmhiLXp2a2IubworCiBxdWlldF9jbWRfcGVybGFzbSA9IFBFUkxBU00gJEAK ICAgICAgIGNtZF9wZXJsYXNtID0gJChQRVJMKSAkKDwpIHZvaWQgJChAKQogCkBAIC0yNyw3ICsz MCwxMSBAQCAkKG9iaikvYWVzLXJpc2N2NjQtenZrbmVkLXp2a2IuUzogJChzcmMpL2Flcy1yaXNj djY0LXp2a25lZC16dmtiLnBsCiAkKG9iaikvZ2hhc2gtcmlzY3Y2NC16dmtnLlM6ICQoc3JjKS9n aGFzaC1yaXNjdjY0LXp2a2cucGwKIAkkKGNhbGwgY21kLHBlcmxhc20pCiAKKyQob2JqKS9zaGEy NTYtcmlzY3Y2NC16dmtuaGFfb3JfenZrbmhiLXp2a2IuUzogJChzcmMpL3NoYTI1Ni1yaXNjdjY0 LXp2a25oYV9vcl96dmtuaGItenZrYi5wbAorCSQoY2FsbCBjbWQscGVybGFzbSkKKwogY2xlYW4t ZmlsZXMgKz0gYWVzLXJpc2N2NjQtenZrbmVkLlMKIGNsZWFuLWZpbGVzICs9IGFlcy1yaXNjdjY0 LXp2a25lZC16dmJiLXp2a2cuUwogY2xlYW4tZmlsZXMgKz0gYWVzLXJpc2N2NjQtenZrbmVkLXp2 a2IuUwogY2xlYW4tZmlsZXMgKz0gZ2hhc2gtcmlzY3Y2NC16dmtnLlMKK2NsZWFuLWZpbGVzICs9 IHNoYTI1Ni1yaXNjdjY0LXp2a25oYV9vcl96dmtuaGItenZrYi5TCmRpZmYgLS1naXQgYS9hcmNo L3Jpc2N2L2NyeXB0by9zaGEyNTYtcmlzY3Y2NC1nbHVlLmMgYi9hcmNoL3Jpc2N2L2NyeXB0by9z aGEyNTYtcmlzY3Y2NC1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAwLi43NjBkODkwMzFkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jpc2N2L2NyeXB0by9z aGEyNTYtcmlzY3Y2NC1nbHVlLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCisvKgorICogTGludXgvcmlzY3Y2NCBwb3J0IG9m IHRoZSBPcGVuU1NMIFNIQTI1NiBpbXBsZW1lbnRhdGlvbiBmb3IgUklTQy1WIDY0CisgKgorICog Q29weXJpZ2h0IChDKSAyMDIyIFZSVUxMIEdtYkgKKyAqIEF1dGhvcjogSGVpa28gU3R1ZWJuZXIg PGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBTaUZp dmUsIEluYy4KKyAqIEF1dGhvcjogSmVycnkgU2hpaCA8amVycnkuc2hpaEBzaWZpdmUuY29tPgor ICovCisKKyNpbmNsdWRlIDxhc20vc2ltZC5oPgorI2luY2x1ZGUgPGFzbS92ZWN0b3IuaD4KKyNp bmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5j bHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgor I2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9zaW1kLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYTI1 Nl9iYXNlLmg+CisKKy8qCisgKiBzaGEyNTYgdXNpbmcgenZrYiBhbmQgenZrbmhhL2IgdmVjdG9y IGNyeXB0byBleHRlbnNpb24KKyAqCisgKiBUaGlzIGFzbSBmdW5jdGlvbiB3aWxsIGp1c3QgdGFr ZSB0aGUgZmlyc3QgMjU2LWJpdCBhcyB0aGUgc2hhMjU2IHN0YXRlIGZyb20KKyAqIHRoZSBwb2lu dGVyIHRvIGBzdHJ1Y3Qgc2hhMjU2X3N0YXRlYC4KKyAqLworYXNtbGlua2FnZSB2b2lkCitzaGEy NTZfYmxvY2tfZGF0YV9vcmRlcl96dmtiX3p2a25oYV9vcl96dmtuaGIoc3RydWN0IHNoYTI1Nl9z dGF0ZSAqZGlnZXN0LAorCQkJCQkgICAgICBjb25zdCB1OCAqZGF0YSwgaW50IG51bV9ibGtzKTsK Kworc3RhdGljIGludCByaXNjdjY0X3NoYTI1Nl91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRl c2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJCSB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXQg PSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgc3RydWN0IHNoYTI1Nl9zdGF0ZSBiZWdpbnMgZGly ZWN0bHkgd2l0aCB0aGUgU0hBMjU2CisJICogMjU2LWJpdCBpbnRlcm5hbCBzdGF0ZSwgYXMgdGhp cyBpcyB3aGF0IHRoZSBhc20gZnVuY3Rpb24gZXhwZWN0LgorCSAqLworCUJVSUxEX0JVR19PTihv ZmZzZXRvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlLCBzdGF0ZSkgIT0gMCk7CisKKwlpZiAoY3J5cHRv X3NpbWRfdXNhYmxlKCkpIHsKKwkJa2VybmVsX3ZlY3Rvcl9iZWdpbigpOworCQlyZXQgPSBzaGEy NTZfYmFzZV9kb191cGRhdGUoCisJCQlkZXNjLCBkYXRhLCBsZW4sCisJCQlzaGEyNTZfYmxvY2tf ZGF0YV9vcmRlcl96dmtiX3p2a25oYV9vcl96dmtuaGIpOworCQlrZXJuZWxfdmVjdG9yX2VuZCgp OworCX0gZWxzZSB7CisJCXJldCA9IGNyeXB0b19zaGEyNTZfdXBkYXRlKGRlc2MsIGRhdGEsIGxl bik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByaXNjdjY0X3NoYTI1Nl9m aW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkJdW5zaWdu ZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlpZiAoY3J5cHRvX3NpbWRfdXNhYmxlKCkpIHsKKwkJ a2VybmVsX3ZlY3Rvcl9iZWdpbigpOworCQlpZiAobGVuKQorCQkJc2hhMjU2X2Jhc2VfZG9fdXBk YXRlKAorCQkJCWRlc2MsIGRhdGEsIGxlbiwKKwkJCQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl96 dmtiX3p2a25oYV9vcl96dmtuaGIpOworCQlzaGEyNTZfYmFzZV9kb19maW5hbGl6ZSgKKwkJCWRl c2MsIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3p2a2JfenZrbmhhX29yX3p2a25oYik7CisJCWtl cm5lbF92ZWN0b3JfZW5kKCk7CisKKwkJcmV0dXJuIHNoYTI1Nl9iYXNlX2ZpbmlzaChkZXNjLCBv dXQpOworCX0KKworCXJldHVybiBjcnlwdG9fc2hhMjU2X2ZpbnVwKGRlc2MsIGRhdGEsIGxlbiwg b3V0KTsKK30KKworc3RhdGljIGludCByaXNjdjY0X3NoYTI1Nl9maW5hbChzdHJ1Y3Qgc2hhc2hf ZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwlyZXR1cm4gcmlzY3Y2NF9zaGEyNTZfZmludXAoZGVz YywgTlVMTCwgMCwgb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgc2hhMjU2X2Fs Z3NbXSA9IHsKKwl7CisJCS5pbml0ID0gc2hhMjU2X2Jhc2VfaW5pdCwKKwkJLnVwZGF0ZSA9IHJp c2N2NjRfc2hhMjU2X3VwZGF0ZSwKKwkJLmZpbmFsID0gcmlzY3Y2NF9zaGEyNTZfZmluYWwsCisJ CS5maW51cCA9IHJpc2N2NjRfc2hhMjU2X2ZpbnVwLAorCQkuZGVzY3NpemUgPSBzaXplb2Yoc3Ry dWN0IHNoYTI1Nl9zdGF0ZSksCisJCS5kaWdlc3RzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAor CQkuYmFzZSA9IHsKKwkJCS5jcmFfYmxvY2tzaXplID0gU0hBMjU2X0JMT0NLX1NJWkUsCisJCQku Y3JhX3ByaW9yaXR5ID0gMTUwLAorCQkJLmNyYV9uYW1lID0gInNoYTI1NiIsCisJCQkuY3JhX2Ry aXZlcl9uYW1lID0gInNoYTI1Ni1yaXNjdjY0LXp2a25oYV9vcl96dmtuaGItenZrYiIsCisJCQku Y3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCQl9LAorCX0sIHsKKwkJLmluaXQgPSBzaGEyMjRf YmFzZV9pbml0LAorCQkudXBkYXRlID0gcmlzY3Y2NF9zaGEyNTZfdXBkYXRlLAorCQkuZmluYWwg PSByaXNjdjY0X3NoYTI1Nl9maW5hbCwKKwkJLmZpbnVwID0gcmlzY3Y2NF9zaGEyNTZfZmludXAs CisJCS5kZXNjc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkJLmRpZ2VzdHNp emUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCisJCS5iYXNlID0geworCQkJLmNyYV9ibG9ja3NpemUg PSBTSEEyMjRfQkxPQ0tfU0laRSwKKwkJCS5jcmFfcHJpb3JpdHkgPSAxNTAsCisJCQkuY3JhX25h bWUgPSAic2hhMjI0IiwKKwkJCS5jcmFfZHJpdmVyX25hbWUgPSAic2hhMjI0LXJpc2N2NjQtenZr bmhhX29yX3p2a25oYi16dmtiIiwKKwkJCS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJCX0s CisJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19zaGEyNTZfZXh0KHZvaWQpCit7 CisJLyoKKwkgKiBGcm9tIHRoZSBzcGVjOgorCSAqIFRoZSBadmtuaGIgZXh0IHN1cHBvcnRzIGJv dGggU0hBLTI1NiBhbmQgU0hBLTUxMiBhbmQgWnZrbmhhIG9ubHkKKwkgKiBzdXBwb3J0cyBTSEEt MjU2LgorCSAqLworCXJldHVybiAocmlzY3ZfaXNhX2V4dGVuc2lvbl9hdmFpbGFibGUoTlVMTCwg WlZLTkhBKSB8fAorCQlyaXNjdl9pc2FfZXh0ZW5zaW9uX2F2YWlsYWJsZShOVUxMLCBaVktOSEIp KSAmJgorCSAgICAgICByaXNjdl9pc2FfZXh0ZW5zaW9uX2F2YWlsYWJsZShOVUxMLCBaVktCKSAm JgorCSAgICAgICByaXNjdl92ZWN0b3JfdmxlbigpID49IDEyODsKK30KKworc3RhdGljIGludCBf X2luaXQgcmlzY3Y2NF9zaGEyNTZfbW9kX2luaXQodm9pZCkKK3sKKwlpZiAoY2hlY2tfc2hhMjU2 X2V4dCgpKQorCQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoZXMoc2hhMjU2X2FsZ3MsCisJ CQkJCSAgICAgICBBUlJBWV9TSVpFKHNoYTI1Nl9hbGdzKSk7CisKKwlyZXR1cm4gLUVOT0RFVjsK K30KKworc3RhdGljIHZvaWQgX19leGl0IHJpc2N2NjRfc2hhMjU2X21vZF9maW5pKHZvaWQpCit7 CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhzaGEyNTZfYWxncywgQVJSQVlfU0laRShzaGEy NTZfYWxncykpOworfQorCittb2R1bGVfaW5pdChyaXNjdjY0X3NoYTI1Nl9tb2RfaW5pdCk7Citt b2R1bGVfZXhpdChyaXNjdjY0X3NoYTI1Nl9tb2RfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElP TigiU0hBLTI1NiAoUklTQy1WIGFjY2VsZXJhdGVkKSIpOworTU9EVUxFX0FVVEhPUigiSGVpa28g U3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQ TCIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygic2hhMjI0Iik7CitNT0RVTEVfQUxJQVNfQ1JZUFRP KCJzaGEyNTYiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvY3J5cHRvL3NoYTI1Ni1yaXNjdjY0 LXp2a25oYV9vcl96dmtuaGItenZrYi5wbCBiL2FyY2gvcmlzY3YvY3J5cHRvL3NoYTI1Ni1yaXNj djY0LXp2a25oYV9vcl96dmtuaGItenZrYi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLjUxYjJkOWQ0ZjhmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcmlzY3Yv Y3J5cHRvL3NoYTI1Ni1yaXNjdjY0LXp2a25oYV9vcl96dmtuaGItenZrYi5wbApAQCAtMCwwICsx LDMxOCBAQAorIyEgL3Vzci9iaW4vZW52IHBlcmwKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEFwYWNoZS0yLjAgT1IgQlNELTItQ2xhdXNlCisjCisjIFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vu c2VkLCBtZWFuaW5nIHRoYXQgeW91IGNhbiB1c2UgaXQgdW5kZXIgeW91cgorIyBjaG9pY2Ugb2Yg ZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorIworIyBDb3B5cmlnaHQgMjAy MyBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisj IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSAyLjAgKHRoZSAiTGljZW5zZSIpLiBZ b3UgY2FuIG9idGFpbgorIyBhIGNvcHkgaW4gdGhlIGZpbGUgTElDRU5TRSBpbiB0aGUgc291cmNl IGRpc3RyaWJ1dGlvbiBvciBhdAorIyBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGlj ZW5zZS5odG1sCisjCisjIG9yCisjCisjIENvcHlyaWdodCAoYykgMjAyMywgQ2hyaXN0b3BoIE3D vGxsbmVyIDxjaHJpc3RvcGgubXVlbGxuZXJAdnJ1bGwuZXU+CisjIENvcHlyaWdodCAoYykgMjAy MywgUGhvZWJlIENoZW4gPHBob2ViZS5jaGVuQHNpZml2ZS5jb20+CisjIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVk aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln aHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3Vt ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli dXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElN UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg Q09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NV UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBE QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE IEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZU V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K KworIyBUaGUgZ2VuZXJhdGVkIGNvZGUgb2YgdGhpcyBmaWxlIGRlcGVuZHMgb24gdGhlIGZvbGxv d2luZyBSSVNDLVYgZXh0ZW5zaW9uczoKKyMgLSBSVjY0SQorIyAtIFJJU0MtViBWZWN0b3IgKCdW Jykgd2l0aCBWTEVOID49IDEyOAorIyAtIFJJU0MtViBWZWN0b3IgQ3J5cHRvZ3JhcGh5IEJpdC1t YW5pcHVsYXRpb24gZXh0ZW5zaW9uICgnWnZrYicpCisjIC0gUklTQy1WIFZlY3RvciBTSEEtMiBT ZWN1cmUgSGFzaCBleHRlbnNpb24gKCdadmtuaGEnIG9yICdadmtuaGInKQorCit1c2Ugc3RyaWN0 OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbiBxdygkQmluKTsKK3VzZSBsaWIgIiRCaW4i OwordXNlIGxpYiAiJEJpbi8uLi8uLi9wZXJsYXNtIjsKK3VzZSByaXNjdjsKKworIyAkb3V0cHV0 IGlzIHRoZSBsYXN0IGFyZ3VtZW50IGlmIGl0IGxvb2tzIGxpa2UgYSBmaWxlIChpdCBoYXMgYW4g ZXh0ZW5zaW9uKQorIyAkZmxhdm91ciBpcyB0aGUgZmlyc3QgYXJndW1lbnQgaWYgaXQgZG9lc24n dCBsb29rIGxpa2UgYSBmaWxlCitteSAkb3V0cHV0ID0gJCNBUkdWID49IDAgJiYgJEFSR1ZbJCNB UkdWXSA9fiBtfFwuXHcrJHwgPyBwb3AgOiB1bmRlZjsKK215ICRmbGF2b3VyID0gJCNBUkdWID49 IDAgJiYgJEFSR1ZbMF0gIX4gbXxcLnwgPyBzaGlmdCA6IHVuZGVmOworCiskb3V0cHV0IGFuZCBv cGVuIFNURE9VVCwiPiRvdXRwdXQiOworCitteSAkY29kZT08PF9fXzsKKy50ZXh0CitfX18KKwor bXkgKCRWMCwgJFYxLCAkVjIsICRWMywgJFY0LCAkVjUsICRWNiwgJFY3LAorICAgICRWOCwgJFY5 LCAkVjEwLCAkVjExLCAkVjEyLCAkVjEzLCAkVjE0LCAkVjE1LAorICAgICRWMTYsICRWMTcsICRW MTgsICRWMTksICRWMjAsICRWMjEsICRWMjIsICRWMjMsCisgICAgJFYyNCwgJFYyNSwgJFYyNiwg JFYyNywgJFYyOCwgJFYyOSwgJFYzMCwgJFYzMSwKKykgPSBtYXAoInYkXyIsKDAuLjMxKSk7CisK K215ICRLMjU2ID0gIksyNTYiOworCisjIEZ1bmN0aW9uIGFyZ3VtZW50cworbXkgKCRILCAkSU5Q LCAkTEVOLCAkS1QsICRIMiwgJElOREVYX1BBVFRFUk4pID0gKCJhMCIsICJhMSIsICJhMiIsICJh MyIsICJ0MyIsICJ0NCIpOworCitzdWIgc2hhXzI1Nl9sb2FkX2NvbnN0YW50IHsKKyAgICBteSAk Y29kZT08PF9fXzsKKyAgICBsYSAkS1QsICRLMjU2ICMgTG9hZCByb3VuZCBjb25zdGFudHMgSzI1 NgorICAgIEB7W3ZsZTMyX3YgJFYxMCwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAg IEB7W3ZsZTMyX3YgJFYxMSwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3Zs ZTMyX3YgJFYxMiwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3Yg JFYxMywgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNCwg JEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNSwgJEtUXX0K KyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNiwgJEtUXX0KKyAgICBh ZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxNywgJEtUXX0KKyAgICBhZGRpICRL VCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxOCwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtU LCAxNgorICAgIEB7W3ZsZTMyX3YgJFYxOSwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgor ICAgIEB7W3ZsZTMyX3YgJFYyMCwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7 W3ZsZTMyX3YgJFYyMSwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMy X3YgJFYyMiwgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYy MywgJEtUXX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYyNCwgJEtU XX0KKyAgICBhZGRpICRLVCwgJEtULCAxNgorICAgIEB7W3ZsZTMyX3YgJFYyNSwgJEtUXX0KK19f XworCisgICAgcmV0dXJuICRjb2RlOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB2 b2lkIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3p2a2JfenZrbmhhX29yX3p2a25oYih2b2lkICpj LCBjb25zdCB2b2lkICpwLCBzaXplX3QgbGVuKQorJGNvZGUgLj0gPDxfX187CisucDJhbGlnbiAy CisuZ2xvYmwgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfenZrYl96dmtuaGFfb3JfenZrbmhiCisu dHlwZSAgIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3p2a2JfenZrbmhhX29yX3p2a25oYixcQGZ1 bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl96dmtiX3p2a25oYV9vcl96dmtuaGI6Cisg ICAgQHtbdnNldGl2bGkgInplcm8iLCA0LCAiZTMyIiwgIm0xIiwgInRhIiwgIm1hIl19CisKKyAg ICBAe1tzaGFfMjU2X2xvYWRfY29uc3RhbnRdfQorCisgICAgIyBIIGlzIHN0b3JlZCBhcyB7YSxi LGMsZH0se2UsZixnLGh9LCBidXQgd2UgbmVlZCB7ZixlLGIsYX0se2gsZyxkLGN9CisgICAgIyBU aGUgZHN0IHZ0eXBlIGlzIGUzMm0xIGFuZCB0aGUgaW5kZXggdnR5cGUgaXMgZThtZjQuCisgICAg IyBXZSB1c2UgaW5kZXgtbG9hZCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kZXggcGF0dGVybiBhdCB2 MjYuCisgICAgIyAgIGk4IGluZGV4OgorICAgICMgICAgIDIwLCAxNiwgNCwgMAorICAgICMgSW5z dGVhZCBvZiBzZXR0aW5nIHRoZSBpOCBpbmRleCwgd2UgY291bGQgdXNlIGEgc2luZ2xlIDMyYml0 CisgICAgIyBsaXR0bGUtZW5kaWFuIHZhbHVlIHRvIGNvdmVyIHRoZSA0eGk4IGluZGV4LgorICAg ICMgICBpMzIgdmFsdWU6CisgICAgIyAgICAgMHggMDAgMDQgMTAgMTQKKyAgICBsaSAkSU5ERVhf UEFUVEVSTiwgMHgwMDA0MTAxNAorICAgIEB7W3ZzZXRpdmxpICJ6ZXJvIiwgMSwgImUzMiIsICJt MSIsICJ0YSIsICJtYSJdfQorICAgIEB7W3Ztdl92X3ggJFYyNiwgJElOREVYX1BBVFRFUk5dfQor CisgICAgYWRkaSAkSDIsICRILCA4CisKKyAgICAjIFVzZSBpbmRleC1sb2FkIHRvIGdldCB7Zixl LGIsYX0se2gsZyxkLGN9CisgICAgQHtbdnNldGl2bGkgInplcm8iLCA0LCAiZTMyIiwgIm0xIiwg InRhIiwgIm1hIl19CisgICAgQHtbdmx1eGVpOF92ICRWNiwgJEgsICRWMjZdfQorICAgIEB7W3Zs dXhlaThfdiAkVjcsICRIMiwgJFYyNl19CisKKyAgICAjIFNldHVwIHYwIG1hc2sgZm9yIHRoZSB2 bWVyZ2UgdG8gcmVwbGFjZSB0aGUgZmlyc3Qgd29yZCAoaWR4PT0wKSBpbiBrZXktc2NoZWR1bGlu Zy4KKyAgICAjIFRoZSBBVkwgaXMgNCBpbiBTSEEsIHNvIHdlIGNvdWxkIHVzZSBhIHNpbmdsZSBl OCg4IGVsZW1lbnQgbWFza2luZykgZm9yIG1hc2tpbmcuCisgICAgQHtbdnNldGl2bGkgInplcm8i LCAxLCAiZTgiLCAibTEiLCAidGEiLCAibWEiXX0KKyAgICBAe1t2bXZfdl9pICRWMCwgMHgwMV19 CisKKyAgICBAe1t2c2V0aXZsaSAiemVybyIsIDQsICJlMzIiLCAibTEiLCAidGEiLCAibWEiXX0K KworTF9yb3VuZF9sb29wOgorICAgICMgRGVjcmVtZW50IGxlbmd0aCBieSAxCisgICAgYWRkICRM RU4sICRMRU4sIC0xCisKKyAgICAjIEtlZXAgdGhlIGN1cnJlbnQgc3RhdGUgYXMgd2UgbmVlZCBp dCBsYXRlcjogSCcgPSBIK3thJyxiJyxjJywuLi4saCd9LgorICAgIEB7W3Ztdl92X3YgJFYzMCwg JFY2XX0KKyAgICBAe1t2bXZfdl92ICRWMzEsICRWN119CisKKyAgICAjIExvYWQgdGhlIDUxMi1i aXRzIG9mIHRoZSBtZXNzYWdlIGJsb2NrIGluIHYxLXY0IGFuZCBwZXJmb3JtCisgICAgIyBhbiBl bmRpYW4gc3dhcCBvbiBlYWNoIDQgYnl0ZXMgZWxlbWVudC4KKyAgICBAe1t2bGUzMl92ICRWMSwg JElOUF19CisgICAgQHtbdnJldjhfdiAkVjEsICRWMV19CisgICAgYWRkICRJTlAsICRJTlAsIDE2 CisgICAgQHtbdmxlMzJfdiAkVjIsICRJTlBdfQorICAgIEB7W3ZyZXY4X3YgJFYyLCAkVjJdfQor ICAgIGFkZCAkSU5QLCAkSU5QLCAxNgorICAgIEB7W3ZsZTMyX3YgJFYzLCAkSU5QXX0KKyAgICBA e1t2cmV2OF92ICRWMywgJFYzXX0KKyAgICBhZGQgJElOUCwgJElOUCwgMTYKKyAgICBAe1t2bGUz Ml92ICRWNCwgJElOUF19CisgICAgQHtbdnJldjhfdiAkVjQsICRWNF19CisgICAgYWRkICRJTlAs ICRJTlAsIDE2CisKKyAgICAjIFF1YWQtcm91bmQgMCAoKzAsIFd0IGZyb20gb2xkZXN0IHRvIG5l d2VzdCBpbiB2MS0+djItPnYzLT52NCkKKyAgICBAe1t2YWRkX3Z2ICRWNSwgJFYxMCwgJFYxXX0K KyAgICBAe1t2c2hhMmNsX3Z2ICRWNywgJFY2LCAkVjVdfQorICAgIEB7W3ZzaGEyY2hfdnYgJFY2 LCAkVjcsICRWNV19CisgICAgQHtbdm1lcmdlX3Z2bSAkVjUsICRWMywgJFYyLCAkVjBdfQorICAg IEB7W3ZzaGEybXNfdnYgJFYxLCAkVjUsICRWNF19ICAjIEdlbmVyYXRlIFdbMTk6MTZdCisKKyAg ICAjIFF1YWQtcm91bmQgMSAoKzEsIHYyLT52My0+djQtPnYxKQorICAgIEB7W3ZhZGRfdnYgJFY1 LCAkVjExLCAkVjJdfQorICAgIEB7W3ZzaGEyY2xfdnYgJFY3LCAkVjYsICRWNV19CisgICAgQHtb dnNoYTJjaF92diAkVjYsICRWNywgJFY1XX0KKyAgICBAe1t2bWVyZ2VfdnZtICRWNSwgJFY0LCAk VjMsICRWMF19CisgICAgQHtbdnNoYTJtc192diAkVjIsICRWNSwgJFYxXX0gICMgR2VuZXJhdGUg V1syMzoyMF0KKworICAgICMgUXVhZC1yb3VuZCAyICgrMiwgdjMtPnY0LT52MS0+djIpCisgICAg QHtbdmFkZF92diAkVjUsICRWMTIsICRWM119CisgICAgQHtbdnNoYTJjbF92diAkVjcsICRWNiwg JFY1XX0KKyAgICBAe1t2c2hhMmNoX3Z2ICRWNiwgJFY3LCAkVjVdfQorICAgIEB7W3ZtZXJnZV92 dm0gJFY1LCAkVjEsICRWNCwgJFYwXX0KKyAgICBAe1t2c2hhMm1zX3Z2ICRWMywgJFY1LCAkVjJd fSAgIyBHZW5lcmF0ZSBXWzI3OjI0XQorCisgICAgIyBRdWFkLXJvdW5kIDMgKCszLCB2NC0+djEt PnYyLT52MykKKyAgICBAe1t2YWRkX3Z2ICRWNSwgJFYxMywgJFY0XX0KKyAgICBAe1t2c2hhMmNs X3Z2ICRWNywgJFY2LCAkVjVdfQorICAgIEB7W3ZzaGEyY2hfdnYgJFY2LCAkVjcsICRWNV19Cisg ICAgQHtbdm1lcmdlX3Z2bSAkVjUsICRWMiwgJFYxLCAkVjBdfQorICAgIEB7W3ZzaGEybXNfdnYg JFY0LCAkVjUsICRWM119ICAjIEdlbmVyYXRlIFdbMzE6MjhdCisKKyAgICAjIFF1YWQtcm91bmQg NCAoKzAsIHYxLT52Mi0+djMtPnY0KQorICAgIEB7W3ZhZGRfdnYgJFY1LCAkVjE0LCAkVjFdfQor ICAgIEB7W3ZzaGEyY2xfdnYgJFY3LCAkVjYsICRWNV19CisgICAgQHtbdnNoYTJjaF92diAkVjYs ICRWNywgJFY1XX0KKyAgICBAe1t2bWVyZ2VfdnZtICRWNSwgJFYzLCAkVjIsICRWMF19CisgICAg QHtbdnNoYTJtc192diAkVjEsICRWNSwgJFY0XX0gICMgR2VuZXJhdGUgV1szNTozMl0KKworICAg ICMgUXVhZC1yb3VuZCA1ICgrMSwgdjItPnYzLT52NC0+djEpCisgICAgQHtbdmFkZF92diAkVjUs ICRWMTUsICRWMl19CisgICAgQHtbdnNoYTJjbF92diAkVjcsICRWNiwgJFY1XX0KKyAgICBAe1t2 c2hhMmNoX3Z2ICRWNiwgJFY3LCAkVjVdfQorICAgIEB7W3ZtZXJnZV92dm0gJFY1LCAkVjQsICRW MywgJFYwXX0KKyAgICBAe1t2c2hhMm1zX3Z2ICRWMiwgJFY1LCAkVjFdfSAgIyBHZW5lcmF0ZSBX WzM5OjM2XQorCisgICAgIyBRdWFkLXJvdW5kIDYgKCsyLCB2My0+djQtPnYxLT52MikKKyAgICBA e1t2YWRkX3Z2ICRWNSwgJFYxNiwgJFYzXX0KKyAgICBAe1t2c2hhMmNsX3Z2ICRWNywgJFY2LCAk VjVdfQorICAgIEB7W3ZzaGEyY2hfdnYgJFY2LCAkVjcsICRWNV19CisgICAgQHtbdm1lcmdlX3Z2 bSAkVjUsICRWMSwgJFY0LCAkVjBdfQorICAgIEB7W3ZzaGEybXNfdnYgJFYzLCAkVjUsICRWMl19 ICAjIEdlbmVyYXRlIFdbNDM6NDBdCisKKyAgICAjIFF1YWQtcm91bmQgNyAoKzMsIHY0LT52MS0+ djItPnYzKQorICAgIEB7W3ZhZGRfdnYgJFY1LCAkVjE3LCAkVjRdfQorICAgIEB7W3ZzaGEyY2xf dnYgJFY3LCAkVjYsICRWNV19CisgICAgQHtbdnNoYTJjaF92diAkVjYsICRWNywgJFY1XX0KKyAg ICBAe1t2bWVyZ2VfdnZtICRWNSwgJFYyLCAkVjEsICRWMF19CisgICAgQHtbdnNoYTJtc192diAk VjQsICRWNSwgJFYzXX0gICMgR2VuZXJhdGUgV1s0Nzo0NF0KKworICAgICMgUXVhZC1yb3VuZCA4 ICgrMCwgdjEtPnYyLT52My0+djQpCisgICAgQHtbdmFkZF92diAkVjUsICRWMTgsICRWMV19Cisg ICAgQHtbdnNoYTJjbF92diAkVjcsICRWNiwgJFY1XX0KKyAgICBAe1t2c2hhMmNoX3Z2ICRWNiwg JFY3LCAkVjVdfQorICAgIEB7W3ZtZXJnZV92dm0gJFY1LCAkVjMsICRWMiwgJFYwXX0KKyAgICBA e1t2c2hhMm1zX3Z2ICRWMSwgJFY1LCAkVjRdfSAgIyBHZW5lcmF0ZSBXWzUxOjQ4XQorCisgICAg IyBRdWFkLXJvdW5kIDkgKCsxLCB2Mi0+djMtPnY0LT52MSkKKyAgICBAe1t2YWRkX3Z2ICRWNSwg JFYxOSwgJFYyXX0KKyAgICBAe1t2c2hhMmNsX3Z2ICRWNywgJFY2LCAkVjVdfQorICAgIEB7W3Zz aGEyY2hfdnYgJFY2LCAkVjcsICRWNV19CisgICAgQHtbdm1lcmdlX3Z2bSAkVjUsICRWNCwgJFYz LCAkVjBdfQorICAgIEB7W3ZzaGEybXNfdnYgJFYyLCAkVjUsICRWMV19ICAjIEdlbmVyYXRlIFdb NTU6NTJdCisKKyAgICAjIFF1YWQtcm91bmQgMTAgKCsyLCB2My0+djQtPnYxLT52MikKKyAgICBA e1t2YWRkX3Z2ICRWNSwgJFYyMCwgJFYzXX0KKyAgICBAe1t2c2hhMmNsX3Z2ICRWNywgJFY2LCAk VjVdfQorICAgIEB7W3ZzaGEyY2hfdnYgJFY2LCAkVjcsICRWNV19CisgICAgQHtbdm1lcmdlX3Z2 bSAkVjUsICRWMSwgJFY0LCAkVjBdfQorICAgIEB7W3ZzaGEybXNfdnYgJFYzLCAkVjUsICRWMl19 ICAjIEdlbmVyYXRlIFdbNTk6NTZdCisKKyAgICAjIFF1YWQtcm91bmQgMTEgKCszLCB2NC0+djEt PnYyLT52MykKKyAgICBAe1t2YWRkX3Z2ICRWNSwgJFYyMSwgJFY0XX0KKyAgICBAe1t2c2hhMmNs X3Z2ICRWNywgJFY2LCAkVjVdfQorICAgIEB7W3ZzaGEyY2hfdnYgJFY2LCAkVjcsICRWNV19Cisg ICAgQHtbdm1lcmdlX3Z2bSAkVjUsICRWMiwgJFYxLCAkVjBdfQorICAgIEB7W3ZzaGEybXNfdnYg JFY0LCAkVjUsICRWM119ICAjIEdlbmVyYXRlIFdbNjM6NjBdCisKKyAgICAjIFF1YWQtcm91bmQg MTIgKCswLCB2MS0+djItPnYzLT52NCkKKyAgICAjIE5vdGUgdGhhdCB3ZSBzdG9wIGdlbmVyYXRp bmcgbmV3IG1lc3NhZ2Ugc2NoZWR1bGUgd29yZHMgKFd0LCB2MS0xMykKKyAgICAjIGFzIHdlIGFs cmVhZHkgZ2VuZXJhdGVkIGFsbCB0aGUgd29yZHMgd2UgZW5kIHVwIGNvbnN1bWluZyAoaS5lLiwg V1s2Mzo2MF0pLgorICAgIEB7W3ZhZGRfdnYgJFY1LCAkVjIyLCAkVjFdfQorICAgIEB7W3ZzaGEy Y2xfdnYgJFY3LCAkVjYsICRWNV19CisgICAgQHtbdnNoYTJjaF92diAkVjYsICRWNywgJFY1XX0K KworICAgICMgUXVhZC1yb3VuZCAxMyAoKzEsIHYyLT52My0+djQtPnYxKQorICAgIEB7W3ZhZGRf dnYgJFY1LCAkVjIzLCAkVjJdfQorICAgIEB7W3ZzaGEyY2xfdnYgJFY3LCAkVjYsICRWNV19Cisg ICAgQHtbdnNoYTJjaF92diAkVjYsICRWNywgJFY1XX0KKworICAgICMgUXVhZC1yb3VuZCAxNCAo KzIsIHYzLT52NC0+djEtPnYyKQorICAgIEB7W3ZhZGRfdnYgJFY1LCAkVjI0LCAkVjNdfQorICAg IEB7W3ZzaGEyY2xfdnYgJFY3LCAkVjYsICRWNV19CisgICAgQHtbdnNoYTJjaF92diAkVjYsICRW NywgJFY1XX0KKworICAgICMgUXVhZC1yb3VuZCAxNSAoKzMsIHY0LT52MS0+djItPnYzKQorICAg IEB7W3ZhZGRfdnYgJFY1LCAkVjI1LCAkVjRdfQorICAgIEB7W3ZzaGEyY2xfdnYgJFY3LCAkVjYs ICRWNV19CisgICAgQHtbdnNoYTJjaF92diAkVjYsICRWNywgJFY1XX0KKworICAgICMgSCcgPSBI K3thJyxiJyxjJywuLi4saCd9CisgICAgQHtbdmFkZF92diAkVjYsICRWMzAsICRWNl19CisgICAg QHtbdmFkZF92diAkVjcsICRWMzEsICRWN119CisgICAgYm5leiAkTEVOLCBMX3JvdW5kX2xvb3AK KworICAgICMgU3RvcmUge2YsZSxiLGF9LHtoLGcsZCxjfSBiYWNrIHRvIHthLGIsYyxkfSx7ZSxm LGcsaH0uCisgICAgQHtbdnN1eGVpOF92ICRWNiwgJEgsICRWMjZdfQorICAgIEB7W3ZzdXhlaThf diAkVjcsICRIMiwgJFYyNl19CisKKyAgICByZXQKKy5zaXplIHNoYTI1Nl9ibG9ja19kYXRhX29y ZGVyX3p2a2JfenZrbmhhX29yX3p2a25oYiwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX3p2a2Jf enZrbmhhX29yX3p2a25oYgorCisucDJhbGlnbiAyCisudHlwZSAkSzI1NixcQG9iamVjdAorJEsy NTY6CisgICAgLndvcmQgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1 ZGJhNQorICAgIC53b3JkIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIx YzVlZDUKKyAgICAud29yZCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1 MGM3ZGMzCisgICAgLndvcmQgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhj MTliZjE3NAorICAgIC53b3JkIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4 MjQwY2ExY2MKKyAgICAud29yZCAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAw eDc2Zjk4OGRhCisgICAgLndvcmQgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwg MHhiZjU5N2ZjNworICAgIC53b3JkIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEs IDB4MTQyOTI5NjcKKyAgICAud29yZCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZj LCAweDUzMzgwZDEzCisgICAgLndvcmQgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzky ZSwgMHg5MjcyMmM4NQorICAgIC53b3JkIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0Yjhi NzAsIDB4Yzc2YzUxYTMKKyAgICAud29yZCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUz NTg1LCAweDEwNmFhMDcwCisgICAgLndvcmQgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4 Nzc0YywgMHgzNGIwYmNiNQorICAgIC53b3JkIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5 Y2NhNGYsIDB4NjgyZTZmZjMKKyAgICAud29yZCAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0 Yzg3ODE0LCAweDhjYzcwMjA4CisgICAgLndvcmQgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhi ZWY5YTNmNywgMHhjNjcxNzhmMgorLnNpemUgJEsyNTYsLi0kSzI1NgorX19fCisKK3ByaW50ICRj b2RlOworCitjbG9zZSBTVERPVVQgb3IgZGllICJlcnJvciBjbG9zaW5nIFNURE9VVDogJCEiOwot LSAKMi4yOC4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNj dgo=