From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com [IPv6:2a00:1450:4864:20::12e]) by sourceware.org (Postfix) with ESMTPS id E9ACF3858CD9 for ; Fri, 24 May 2024 08:41:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E9ACF3858CD9 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E9ACF3858CD9 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::12e ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716540115; cv=none; b=WqB16WDSDZ0hAOfNM3+Wq2MVhptSryRP7FqP9a+yrtzIq66pHfaA98rj3xJq2o8EvIOyhl/ljlTGauto1ckVQ9B7gxzCANzanMqxvv+zsxJ84c3QS4E+ThAOb6SMLZMEaYNQ1i3FzhO8rAVYHdKMDB/9h9ByW9gmK20zh5sQcok= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716540115; c=relaxed/simple; bh=7ViAgJhKpDoGgNidu0CnFZFPAfpmR/31FOFkaoS09Ik=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=GEyogDv9m5htsKzYjRgRyuBi63Wu6NYNN2jKOVqefz+MjR5WFar/i3rLWcC5UfmHU8lxsWtozDHohwEMSh/RmFD27HE+idZW9961kbgcY67oB+xg/V7NfZjXXLDy3ThcoCTyA0SfhYlk+LOtaGRpdSidoV/Gp7+nf7gAqx41yn4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x12e.google.com with SMTP id 2adb3069b0e04-52962423ed8so637976e87.2 for ; Fri, 24 May 2024 01:41:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716540111; x=1717144911; darn=gcc.gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=uW3VM3SWzk3HzzCOoxtpwqTC9BNsjFXT9PemuYmR7X0=; b=OskcVtw1Ps4xmZrVcqmAWqj6IKJyZWNDc6BvnGsKWqnyMXXzCFNlCNW+zrZADLsBpS WlKBhlG1vkEE2WNgzSNKVJvo/iekgqErzoO2Hxya5IhqhDvY1rQRa9FMhY66YfewqVFS o/sEbCD+LHHuqmJIConYZPXZtbRWZe2RyMStBcl02x4nMr8m88oHm31T85WuR2rrLhHt EnoG98p4dcLAG36q7iBlcDA/p1wz2jkK+MaoLwCoVqdiMjhkkoiK3SUMGhkNVRAXj/JI iuKBgbbeGBcOobKrTlz70ZrPKgsDc2HREl1TMtww2aeCmOMHqhr8q0Iubc9eIMKFlIlX nXUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716540111; x=1717144911; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=uW3VM3SWzk3HzzCOoxtpwqTC9BNsjFXT9PemuYmR7X0=; b=g8y/QoU9Fk2XHNiWNn3ieWG7pQkwwn51yINzXDoT/duJUDrq02PyK8j8Rsn3t4L4Zi kb+MiBgzySAwTcqxh/qqQFwPTHa4gFenFhlBg4jIEaGcYiFSN+xXohG0XAgc2ydsJc0s 8/0xNof+tEDrLmYJ2s+3hOizy+Z5403yAsO4H9iJSTl/2jw9lLPpRlq4LlDtDdqu/M2i lynkzixxpZ8Bo7b+sHgvmSR0nThmOrciycfbgOIhPogFTgrM43kl3VlAidHEpWVTouf6 f4qDlWdwkTsNcYDfqMQ026HWJJ6b5x/eCs/Cw5nTxBQrWcpeAwEAe/+V0HbYJ1dD5QjY qq4A== X-Gm-Message-State: AOJu0YwAARMNRt8yRRQzKI4DmBdY30JO/egvmhMpM1ybfXdh+L5bTDhV Pt2GnOlWLlnDwcMxObIp3ffIomNo+hPHp4k7/eJnC4/kRO5vWSIXQzkMA9ZHgtO4uT6H3ruVZvM y0PJUuLPfIEQjgLPXQKP4+/wAT6pdIA== X-Google-Smtp-Source: AGHT+IEDEjmM0u/SvYeVLnMl4+k79xbeha1PLA/xXOn2M/O6cthN7ucOOOx7TfH96FWLRCS1Y+0zapcp/tYR2LLmhhM= X-Received: by 2002:ac2:43b5:0:b0:518:b144:9020 with SMTP id 2adb3069b0e04-5296717fd41mr817655e87.61.1716540110737; Fri, 24 May 2024 01:41:50 -0700 (PDT) MIME-Version: 1.0 From: Mariam Arutunian Date: Fri, 24 May 2024 12:41:39 +0400 Message-ID: Subject: [RFC/RFA] [PATCH 01/12] Implement internal functions for efficient CRC computation To: GCC Patches Content-Type: multipart/mixed; boundary="0000000000008bbc5a06192f2345" X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --0000000000008bbc5a06192f2345 Content-Type: multipart/alternative; boundary="0000000000008bbc5906192f2343" --0000000000008bbc5906192f2343 Content-Type: text/plain; charset="UTF-8" Add two new internal functions (IFN_CRC, IFN_CRC_REV), to provide faster CRC generation. One performs bit-forward and the other bit-reversed CRC computation. If CRC optabs are supported, they are used for the CRC computation. Otherwise, table-based CRC is generated. The supported data and CRC sizes are 8, 16, 32, and 64 bits. The polynomial is without the leading 1. A table with 256 elements is used to store precomputed CRCs. For the reflection of inputs and the output, a simple algorithm involving SHIFT, AND, and OR operations is used. Co-authored-by: Joern Rennecke gcc/ * doc/md.texi (crc@var{m}@var{n}4, crc_rev@var{m}@var{n}4): Document. * expr.cc (generate_crc_table): New function. (calculate_table_based_CRC): Likewise. (expand_crc_table_based): Likewise. (gen_common_operation_to_reflect): Likewise. (reflect_64_bit_value): Likewise. (reflect_32_bit_value): Likewise. (reflect_16_bit_value): Likewise. (reflect_8_bit_value): Likewise. (generate_reflecting_code_standard): Likewise. (expand_reversed_crc_table_based): Likewise. * expr.h (generate_reflecting_code_standard): New function declaration. (expand_crc_table_based): Likewise. (expand_reversed_crc_table_based): Likewise. * internal-fn.cc: (crc_direct): Define. (direct_crc_optab_supported_p): Likewise. (expand_crc_optab_fn): New function * internal-fn.def (CRC, CRC_REV): New internal functions. * optabs.def (crc_optab, crc_rev_optab): New optabs. Signed-off-by: Mariam Arutunian --0000000000008bbc5906192f2343-- --0000000000008bbc5a06192f2345 Content-Type: application/x-patch; name="0001-Implement-internal-functions-for-efficient-CRC-compu.patch" Content-Disposition: attachment; filename="0001-Implement-internal-functions-for-efficient-CRC-compu.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lwjdl5p40 ZGlmZiAtLWdpdCBhL2djYy9kb2MvbWQudGV4aSBiL2djYy9kb2MvbWQudGV4 aQppbmRleCA1NzMwYmRhODBkYy4uYmU2OGVmODYwZjkgMTAwNjQ0Ci0tLSBh L2djYy9kb2MvbWQudGV4aQorKysgYi9nY2MvZG9jL21kLnRleGkKQEAgLTg1 NTcsNiArODU1NywyMCBAQCBvcGVyYW5kIDIsIGdyZWF0ZXIgdGhhbiBvcGVy YW5kIDIgb3IgaXMgdW5vcmRlcmVkIHdpdGggb3BlcmFuZCAyLgogCiBUaGlz IHBhdHRlcm4gaXMgbm90IGFsbG93ZWQgdG8gQGNvZGV7RkFJTH0uCiAKK0Bj aW5kZXggQGNvZGV7Y3JjQHZhcnttfUB2YXJ7bn00fSBpbnN0cnVjdGlvbiBw YXR0ZXJuCitAaXRlbSBAc2FtcHtjcmNAdmFye219QHZhcntufTR9CitDYWxj dWxhdGUgYSBiaXQtZm9yd2FyZCBDUkMgdXNpbmcgb3BlcmFuZHMgMSwgMiBh bmQgMywKK3RoZW4gc3RvcmUgdGhlIHJlc3VsdCBpbiBvcGVyYW5kIDAuCitP cGVyYW5kcyAxIGlzIHRoZSBpbml0aWFsIENSQywgb3BlcmFuZHMgMiBpcyB0 aGUgZGF0YSBhbmQgb3BlcmFuZHMgMyBpcyB0aGUKK3BvbHlub21pYWwgd2l0 aG91dCBsZWFkaW5nIDEuCitPcGVyYW5kcyAwLCAxIGFuZCAzIGhhdmUgbW9k ZSBAdmFye259IGFuZCBvcGVyYW5kIDIgaGFzIG1vZGUgQHZhcnttfSwgd2hl cmUKK2JvdGggbW9kZXMgYXJlIGludGVnZXJzLiAgVGhlIHNpemUgb2YgQ1JD IHRvIGJlIGNhbGN1bGF0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKK21vZGU7 IGZvciBleGFtcGxlLCBpZiBAdmFye259IGlzICdoaScsIGEgQ1JDMTYgaXMg Y2FsY3VsYXRlZC4KKworQGNpbmRleCBAY29kZXtjcmNfcmV2QHZhcnttfUB2 YXJ7bn00fSBpbnN0cnVjdGlvbiBwYXR0ZXJuCitAaXRlbSBAc2FtcHtjcmNf cmV2QHZhcnttfUB2YXJ7bn00fQorU2ltaWxhciB0byBAc2FtcHtjcmNAdmFy e219QHZhcntufTR9LCBidXQgY2FsY3VsYXRlcyBhIGJpdC1yZXZlcnNlZCBD UkMuCisKIEBlbmQgdGFibGUKIAogQGVuZCBpZnNldApkaWZmIC0tZ2l0IGEv Z2NjL2V4cHIuY2MgYi9nY2MvZXhwci5jYwppbmRleCAxYmFhMzliOThlYi4u MTgzNjhhZTZiNmMgMTAwNjQ0Ci0tLSBhL2djYy9leHByLmNjCisrKyBiL2dj Yy9leHByLmNjCkBAIC0xNDA5MSwzICsxNDA5MSwzNTkgQEAgaW50X2V4cHJf c2l6ZSAoY29uc3RfdHJlZSBleHApCiAKICAgcmV0dXJuIHRyZWVfdG9fc2h3 aSAoc2l6ZSk7CiB9CisKKy8qIENhbGN1bGF0ZSBDUkMgZm9yIHRoZSBpbml0 aWFsIENSQyBhbmQgZ2l2ZW4gUE9MWU5PTUlBTC4KKyAgIENSQ19CSVRTIGlz IENSQyBzaXplLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIEhPU1RfV0lERV9J TlQKK2NhbGN1bGF0ZV9jcmMgKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgY3Jj LAorCSAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgcG9seW5vbWlhbCwK KwkgICAgICB1bnNpZ25lZCBjcmNfYml0cykKK3sKKyAgY3JjID0gY3JjIDw8 IChjcmNfYml0cyAtIDgpOworICBmb3IgKGludCBpID0gODsgaSA+IDA7IC0t aSkKKyAgICB7CisgICAgICBpZiAoKGNyYyA+PiAoY3JjX2JpdHMgLSAxKSkg JiAxKQorCWNyYyA9IChjcmMgPDwgMSkgXiBwb2x5bm9taWFsOworICAgICAg ZWxzZQorCWNyYyA8PD0gMTsKKyAgICB9CisKKyAgY3JjIDw8PSAgKHNpemVv ZiAoY3JjKSAqIEJJVFNfUEVSX1VOSVQgLSBjcmNfYml0cyk7CisgIGNyYyA+ Pj0gIChzaXplb2YgKGNyYykgKiBCSVRTX1BFUl9VTklUIC0gY3JjX2JpdHMp OworCisgIHJldHVybiBjcmM7Cit9CisKKy8qIEFzc2VtYmxlIENSQyB0YWJs ZSB3aXRoIDI1NiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIFBPTFlOT00gYW5k IENSQ19CSVRTIHdpdGgKKyAgIGdpdmVuIElELgorICAgSUQgaXMgdGhlIGlk ZW50aWZpZXIgb2YgdGhlIHRhYmxlLCB0aGUgbmFtZSBvZiB0aGUgdGFibGUg aXMgdW5pcXVlLAorICAgY29udGFpbnMgQ1JDIHNpemUgYW5kIHRoZSBwb2x5 bm9taWFsLgorICAgUE9MWU5PTSBpcyB0aGUgcG9seW5vbWlhbCB1c2VkIHRv IGNhbGN1bGF0ZSB0aGUgQ1JDIHRhYmxlJ3MgZWxlbWVudHMuCisgICBDUkNf QklUUyBpcyB0aGUgc2l6ZSBvZiBDUkMsIG1heSBiZSA4LCAxNiwgLi4uIC4g Ki8KKworcnR4Cithc3NlbWJsZV9jcmNfdGFibGUgKHRyZWUgaWQsIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgcG9seW5vbSwgdW5zaWduZWQgY3JjX2JpdHMp Cit7CisgIHVuc2lnbmVkIHRhYmxlX2VsX24gPSAweDEwMDsKKyAgdHJlZSBh ciA9IGJ1aWxkX2FycmF5X3R5cGUgKG1ha2VfdW5zaWduZWRfdHlwZSAoY3Jj X2JpdHMpLAorCQkJICAgICAgYnVpbGRfaW5kZXhfdHlwZSAoc2l6ZV9pbnQg KHRhYmxlX2VsX24gLSAxKSkpOworICB0cmVlIGRlY2wgPSBidWlsZF9kZWNs IChVTktOT1dOX0xPQ0FUSU9OLCBWQVJfREVDTCwgaWQsIGFyKTsKKyAgU0VU X0RFQ0xfQVNTRU1CTEVSX05BTUUgKGRlY2wsIGlkKTsKKyAgREVDTF9BUlRJ RklDSUFMIChkZWNsKSA9IDE7CisgIHJ0eCB0YWIgPSBnZW5fcnR4X1NZTUJP TF9SRUYgKFBtb2RlLCBJREVOVElGSUVSX1BPSU5URVIgKGlkKSk7CisgIFRS RUVfQVNNX1dSSVRURU4gKGRlY2wpID0gMDsKKworICAvKiBJbml0aWFsaXpl IHRoZSB0YWJsZS4gICovCisgIHZlYzx0cmVlLCB2YV9nYz4gKmluaXRpYWxf dmFsdWVzOworICB2ZWNfYWxsb2MgKGluaXRpYWxfdmFsdWVzLCB0YWJsZV9l bF9uKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWJsZV9lbF9uOyAr K2kpCisgICAgeworICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBjcmMg PSBjYWxjdWxhdGVfY3JjIChpLCBwb2x5bm9tLCBjcmNfYml0cyk7CisgICAg ICB0cmVlIGVsZW1lbnQgPSBidWlsZF9pbnRfY3N0dSAobWFrZV91bnNpZ25l ZF90eXBlIChjcmNfYml0cyksIGNyYyk7CisgICAgICB2ZWNfc2FmZV9wdXNo IChpbml0aWFsX3ZhbHVlcywgZWxlbWVudCk7CisgICAgfQorICBERUNMX0lO SVRJQUwgKGRlY2wpID0gYnVpbGRfY29uc3RydWN0b3JfZnJvbV92ZWMgKGFy LCBpbml0aWFsX3ZhbHVlcyk7CisKKyAgVFJFRV9SRUFET05MWSAoZGVjbCkg PSAxOworICBUUkVFX1NUQVRJQyAoZGVjbCkgPSAxOworCisgIGlmIChUUkVF X1BVQkxJQyAoaWQpKQorICAgIHsKKyAgICAgIFRSRUVfUFVCTElDIChkZWNs KSA9IDE7CisgICAgICBtYWtlX2RlY2xfb25lX29ubHkgKGRlY2wsIERFQ0xf QVNTRU1CTEVSX05BTUUgKGRlY2wpKTsKKyAgICB9CisKKyAgbWFya19kZWNs X3JlZmVyZW5jZWQgKGRlY2wpOworICB2YXJwb29sX25vZGU6OmZpbmFsaXpl X2RlY2wgKGRlY2wpOworCisgIHJldHVybiB0YWI7Cit9CisKKy8qIEdlbmVy YXRlIENSQyBsb29rdXAgdGFibGUgYnkgY2FsY3VsYXRpbmcgQ1JDIGZvciBh bGwgcG9zc2libGUKKyAgIDgtYml0IGRhdGEgdmFsdWVzLiAgVGhlIHRhYmxl IGlzIHN0b3JlZCB3aXRoIGEgc3BlY2lmaWMgbmFtZSBpbiB0aGUgcmVhZC1v bmx5CisgICBkYXRhIHNlY3Rpb24uCisgICBQT0xZTk9NIGlzIHRoZSBwb2x5 bm9taWFsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBDUkMgdGFibGUncyBlbGVt ZW50cy4KKyAgIENSQ19CSVRTIGlzIHRoZSBzaXplIG9mIENSQywgbWF5IGJl IDgsIDE2LCAuLi4gLiAgKi8KKworcnR4CitnZW5lcmF0ZV9jcmNfdGFibGUg KHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgcG9seW5vbSwgdW5zaWduZWQgY3Jj X2JpdHMpCit7CisgIGdjY19hc3NlcnQgKGNyY19iaXRzIDw9IDY0KTsKKwor ICAvKiBCdWYgc2l6ZSAtIDI0IGxldHRlcnMgKyA2ICdfJworICAgICArIDIw IG51bWJlcnMgKDIgZm9yIGNyYyBiaXQgc2l6ZSArIDIgZm9yIDB4ICsgMTYg Zm9yIDY0LWJpdCBwb2x5bm9taWFsKQorICAgICArIDEgZm9yIFwwLiAgKi8K KyAgY2hhciBidWZbNTFdOworICBzcHJpbnRmIChidWYsICJjcmNfdGFibGVf Zm9yX2NyY18ldV9wb2x5bm9taWFsXyIgSE9TVF9XSURFX0lOVF9QUklOVF9I RVgsCisJICAgY3JjX2JpdHMsIHBvbHlub20pOworCisgIHRyZWUgaWQgPSBt YXliZV9nZXRfaWRlbnRpZmllciAoYnVmKTsKKyAgaWYgKGlkKQorICAgIHJl dHVybiBnZW5fcnR4X1NZTUJPTF9SRUYgKFBtb2RlLCBJREVOVElGSUVSX1BP SU5URVIgKGlkKSk7CisKKyAgaWQgPSBnZXRfaWRlbnRpZmllciAoYnVmKTsK KyAgcmV0dXJuIGFzc2VtYmxlX2NyY190YWJsZSAoaWQsIHBvbHlub20sIGNy Y19iaXRzKTsKK30KKworLyogR2VuZXJhdGUgdGFibGUtYmFzZWQgQ1JDIGNv ZGUgZm9yIHRoZSBnaXZlbiBDUkMsIElOUFVUX0RBVEEgYW5kIHRoZQorICAg UE9MWU5PTUlBTCAod2l0aG91dCBsZWFkaW5nIDEpLgorCisgICBGaXJzdCwg dXNpbmcgUE9MWU5PTUlBTCdzIHZhbHVlIGdlbmVyYXRlcyBDUkMgdGFibGUg b2YgMjU2IGVsZW1lbnRzLAorICAgdGhlbiBnZW5lcmF0ZXMgdGhlIGFzc2Vt Ymx5IGZvciB0aGUgZm9sbG93aW5nIGNvZGUsCisgICB3aGVyZSBjcmNfc2l6 ZSBhbmQgZGF0YV9zaXplIG1heSBiZSA4LCAxNiwgMzIsIDY0LCBkZXBlbmRp bmcgb24gQ1JDOgorCisgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YV9z aXplIC8gODsgaSsrKQorICAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNf dGFibGVbKGNyYyA+PiAoY3JjX3NpemUgLSA4KSkKKwkJCQleIChkYXRhID4+ IChkYXRhX3NpemUgLSAoaSArIDEpICogOCkgJiAweEZGKSldOworCisgICBT byB0byB0YWtlIHZhbHVlcyBmcm9tIHRoZSB0YWJsZSwgd2UgbmVlZCA4LWJp dCBkYXRhLgorICAgSWYgaW5wdXQgZGF0YSBzaXplIGlzIG5vdCA4LCB0aGVu IGZpcnN0IHdlIGV4dHJhY3QgdXBwZXIgOCBiaXRzLAorICAgdGhlbiB0aGUg b3RoZXIgOCBiaXRzLCBhbmQgc28gb24uICAqLworCit2b2lkCitjYWxjdWxh dGVfdGFibGVfYmFzZWRfQ1JDIChydHggKmNyYywgY29uc3QgcnR4ICZpbnB1 dF9kYXRhLAorCQkJICAgY29uc3QgcnR4ICZwb2x5bm9taWFsLAorCQkJICAg bWFjaGluZV9tb2RlIGNyY19tb2RlLCBtYWNoaW5lX21vZGUgZGF0YV9tb2Rl KQoreworICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGNyY19zaXplID0gR0VU X01PREVfQklUU0laRSAoY3JjX21vZGUpLnRvX2NvbnN0YW50ICgpOworICBy dHggdGFiID0gZ2VuZXJhdGVfY3JjX3RhYmxlIChVSU5UVkFMIChwb2x5bm9t aWFsKSwgY3JjX3NpemUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgR0VU X01PREVfU0laRSAoZGF0YV9tb2RlKS50b19jb25zdGFudCAoKTsgaSsrKQor ICAgIHsKKyAgICAgIC8qIGNyYyA+PiAoY3JjX3NpemUgLSA4KS4gICovCisg ICAgICBydHggb3AxID0gZXhwYW5kX3NoaWZ0IChSU0hJRlRfRVhQUiwgd29y ZF9tb2RlLCAqY3JjLCBjcmNfc2l6ZSAtIDgsCisJCQkgICAgICBOVUxMX1JU WCwgMSk7CisKKyAgICAgIC8qIGRhdGEgPj4gKDggKiAoR0VUX01PREVfU0la RSAoZGF0YV9tb2RlKS50b19jb25zdGFudCAoKSAtIGkgLSAxKSkuICAqLwor ICAgICAgdW5zaWduZWQgcmFuZ2VfOCA9IDggKiAoR0VUX01PREVfU0laRSAo ZGF0YV9tb2RlKS50b19jb25zdGFudCAoKSAtIGkgLSAxKTsKKyAgICAgIHJ0 eCBkYXRhID0gZXhwYW5kX3NoaWZ0IChSU0hJRlRfRVhQUiwgd29yZF9tb2Rl LCBpbnB1dF9kYXRhLCByYW5nZV84LAorCQkJICAgICAgIE5VTExfUlRYLCAx KTsKKworICAgICAgLyogZGF0YSA+PiAoOCAqIChHRVRfTU9ERV9TSVpFIChk YXRhX21vZGUpCisJCQkJCS50b19jb25zdGFudCAoKSAtIGkgLSAxKSkgJiAw eEZGLiAgKi8KKyAgICAgIHJ0eCBkYXRhX2ZpbmFsID0gZXhwYW5kX2FuZCAo d29yZF9tb2RlLCBkYXRhLAorCQkJCSAgIGdlbl9pbnRfbW9kZSAoMjU1LCBk YXRhX21vZGUpLCBOVUxMX1JUWCk7CisKKyAgICAgIC8qIChjcmMgPj4gKGNy Y19zaXplIC0gOCkpIF4gZGF0YV84Yml0LiAgKi8KKyAgICAgIHJ0eCBpbiA9 IGV4cGFuZF9iaW5vcCAoUG1vZGUsIHhvcl9vcHRhYiwgb3AxLCBkYXRhX2Zp bmFsLCBOVUxMX1JUWCwgMSwKKwkJCSAgICAgT1BUQUJfV0lERU4pOworCisg ICAgICAvKiAoKGNyYyA+PiAoY3JjX3NpemUgLSA4KSkgXiBkYXRhXzhiaXQp ICYgMHhGRi4gICovCisgICAgICBydHggaW5kZXggPSBleHBhbmRfYW5kIChQ bW9kZSwgaW4sIGdlbl9pbnRfbW9kZSAoMjU1LCB3b3JkX21vZGUpLAorCQkJ ICAgICAgTlVMTF9SVFgpOworICAgICAgaW50IGxvZ19jcmNfc2l6ZSA9IGV4 YWN0X2xvZzIgKEdFVF9NT0RFX1NJWkUgKGNyY19tb2RlKS50b19jb25zdGFu dCAoKSk7CisgICAgICBpbmRleCA9IGV4cGFuZF9zaGlmdCAoTFNISUZUX0VY UFIsIFBtb2RlLCBpbmRleCwgbG9nX2NyY19zaXplLAorCQkJICAgIE5VTExf UlRYLCAwKTsKKworICAgICAgaW5kZXggPSBleHBhbmRfYmlub3AgKFBtb2Rl LCBhZGRfb3B0YWIsIGluZGV4LCB0YWIsIE5VTExfUlRYLCAwLAorCQkJICAg IE9QVEFCX0RJUkVDVCk7CisKKyAgICAgIC8qIGNyY190YWJsZVsoY3JjID4+ IChjcmNfc2l6ZSAtIDgpKSBeIGRhdGFfOGJpdF0gICovCisgICAgICBydHgg dGFiX2VsID0gdmFsaWRpemVfbWVtIChnZW5fcnR4X01FTSAoY3JjX21vZGUs IGluZGV4KSk7CisKKyAgICAgIC8qIChjcmMgPDwgOCkgaWYgQ1JDIGlzIGxh cmdlciB0aGFuIDgsIG90aGVyd2lzZSBjcmMgPSAwLiAgKi8KKyAgICAgIHJ0 eCBoaWdoID0gTlVMTF9SVFg7CisgICAgICBpZiAoR0VUX01PREVfQklUU0la RSAoY3JjX21vZGUpLnRvX2NvbnN0YW50ICgpICE9IDgpCisJeworCSAgIGhp Z2ggPSBleHBhbmRfc2hpZnQgKExTSElGVF9FWFBSLCB3b3JkX21vZGUsICpj cmMsIDgsIE5VTExfUlRYLCAwKTsKKwkgICBpZiAoY3JjX21vZGUgIT0gd29y ZF9tb2RlKQorCSAgICAgeworCSAgICAgICBydHggY3JjX21vZGVfbWFzayA9 IGdlbl9pbnRfbW9kZSAoR0VUX01PREVfTUFTSyAoY3JjX21vZGUpLAorCQkJ CQkJIHdvcmRfbW9kZSk7CisJICAgICAgIGhpZ2ggPSBleHBhbmRfYW5kICh3 b3JkX21vZGUsIGhpZ2gsIGNyY19tb2RlX21hc2ssIE5VTExfUlRYKTsKKwkg ICAgIH0KKwl9CisgICAgICBlbHNlCisJaGlnaCA9IGdlbl9pbnRfbW9kZSAo MCwgd29yZF9tb2RlKTsKKworICAgICAgLyogY3JjID0gKGNyYyA8PCA4KSBe IGNyY190YWJsZVsoY3JjID4+IChjcmNfc2l6ZSAtIDgpKSBeIGRhdGFfOGJp dF07ICAqLworICAgICAgKmNyYyA9IGV4cGFuZF9iaW5vcCAod29yZF9tb2Rl LCB4b3Jfb3B0YWIsIHRhYl9lbCwgaGlnaCwgTlVMTF9SVFgsIDEsCisJCQkg ICBPUFRBQl9XSURFTik7CisgICAgfQorfQorCisvKiBHZW5lcmF0ZSB0YWJs ZS1iYXNlZCBDUkMgY29kZSBmb3IgdGhlIGdpdmVuIENSQywgSU5QVVRfREFU QSBhbmQgdGhlCisgICBQT0xZTk9NSUFMICh3aXRob3V0IGxlYWRpbmcgMSku CisKKyAgIENSQyBpcyBPUDEsIGRhdGEgaXMgT1AyIGFuZCB0aGUgcG9seW5v bWlhbCBpcyBPUDMuCisgICBUaGlzIG11c3QgZ2VuZXJhdGUgYSBDUkMgdGFi bGUgYW5kIGFuIGFzc2VtYmx5IGZvciB0aGUgZm9sbG93aW5nIGNvZGUsCisg ICB3aGVyZSBjcmNfc2l6ZSBhbmQgZGF0YV9zaXplIG1heSBiZSA4LCAxNiwg MzIsIDY0OgorICAgdWludF9jcmNfc2l6ZV90CisgICBjcmNfY3JjX3NpemUg KHVpbnRfY3JjX3NpemVfdCBjcmNfaW5pdCwgdWludF9kYXRhX3NpemVfdCBk YXRhLCBzaXplX3Qgc2l6ZSkKKyAgIHsKKyAgICAgdWludF9jcmNfc2l6ZV90 IGNyYyA9IGNyY19pbml0OworICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRh dGFfc2l6ZSAvIDg7IGkrKykKKyAgICAgICBjcmMgPSAoY3JjIDw8IDgpCisg ICAgICAgXiBjcmNfdGFibGVbKGNyYyA+PiAoY3JjX3NpemUgLSA4KSkKKwkJ CV4gKGRhdGEgPj4gKGRhdGFfc2l6ZSAtIChpICsgMSkgKiA4KSAmIDB4RkYp KV07CisgICAgIHJldHVybiBjcmM7CisgICB9ICAqLworCit2b2lkCitleHBh bmRfY3JjX3RhYmxlX2Jhc2VkIChydHggb3AwLCBydHggb3AxLCBydHggb3Ay LCBydHggb3AzLAorCQkJbWFjaGluZV9tb2RlIGRhdGFfbW9kZSkKK3sKKyAg Z2NjX2Fzc2VydCAoIUNPTlNUX0lOVF9QIChvcDApKTsKKyAgZ2NjX2Fzc2Vy dCAoQ09OU1RfSU5UX1AgKG9wMykpOworICBtYWNoaW5lX21vZGUgY3JjX21v ZGUgPSBHRVRfTU9ERSAob3AwKTsKKyAgcnR4IGNyYyA9IGdlbl9yZWdfcnR4 ICh3b3JkX21vZGUpOworICBjb252ZXJ0X21vdmUgKGNyYywgb3AxLCAwKTsK KyAgY2FsY3VsYXRlX3RhYmxlX2Jhc2VkX0NSQyAoJmNyYywgb3AyLCBvcDMs IGNyY19tb2RlLCBkYXRhX21vZGUpOworICBpZiAoY3JjX21vZGUgPT0gU0lt b2RlICYmIHdvcmRfbW9kZSA9PSBESW1vZGUpCisgICAgeworICAgICAgcnR4 IGFfbG93ID0gZ2VuX2xvd3BhcnRfU1VCUkVHIChjcmNfbW9kZSwgY3JjKTsK KyAgICAgIGNyYyA9IGdlbl9ydHhfU0lHTl9FWFRFTkQgKHdvcmRfbW9kZSwg YV9sb3cpOworICAgIH0KKyAgcnR4IHRndCA9IHNpbXBsaWZ5X2dlbl9zdWJy ZWcgKHdvcmRfbW9kZSwgb3AwLCBjcmNfbW9kZSwgMCk7CisgIGVtaXRfbW92 ZV9pbnNuICh0Z3QsIGNyYyk7Cit9CisKKy8qIEdlbmVyYXRlIHRoZSBjb21t b24gb3BlcmF0aW9uIGZvciByZWZsZWN0aW5nIHZhbHVlczoKKyAgICpPUCA9 ICgqT1AgJiBBTkQxX1ZBTFVFKSA8PCBTSElGVF9WQUwgfCAoKk9QICYgQU5E Ml9WQUxVRSkgPj4gU0hJRlRfVkFMOyAgKi8KKwordm9pZAorZ2VuX2NvbW1v bl9vcGVyYXRpb25fdG9fcmVmbGVjdCAocnR4ICpvcCwKKwkJCQkgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBhbmQxX3ZhbHVlLAorCQkJCSB1bnNpZ25lZCBI T1NUX1dJREVfSU5UIGFuZDJfdmFsdWUsCisJCQkJIHVuc2lnbmVkIHNoaWZ0 X3ZhbCkKK3sKKyAgcnR4IG9wMSA9IGV4cGFuZF9hbmQgKHdvcmRfbW9kZSwg Km9wLCBnZW5faW50X21vZGUgKGFuZDFfdmFsdWUsIHdvcmRfbW9kZSksCisJ CQlOVUxMX1JUWCk7CisgIG9wMSA9IGV4cGFuZF9zaGlmdCAoTFNISUZUX0VY UFIsIHdvcmRfbW9kZSwgb3AxLCBzaGlmdF92YWwsIG9wMSwgMCk7CisgIHJ0 eCBvcDIgPSBleHBhbmRfYW5kICh3b3JkX21vZGUsICpvcCwgZ2VuX2ludF9t b2RlIChhbmQyX3ZhbHVlLCB3b3JkX21vZGUpLAorCQkJTlVMTF9SVFgpOwor ICBvcDIgPSBleHBhbmRfc2hpZnQgKFJTSElGVF9FWFBSLCB3b3JkX21vZGUs IG9wMiwgc2hpZnRfdmFsLCBvcDIsIDEpOworICAqb3AgPSBleHBhbmRfYmlu b3AgKHdvcmRfbW9kZSwgaW9yX29wdGFiLCBvcDEsIG9wMiwgKm9wLCAwLCBP UFRBQl9ESVJFQ1QpOworfQorCisvKiBSZWZsZWN0IDY0LWJpdCB2YWx1ZSBm b3IgdGhlIDY0LWJpdCB0YXJnZXQuICAqLworCit2b2lkCityZWZsZWN0XzY0 X2JpdF92YWx1ZSAocnR4ICpvcCkKK3sKKyAgZ2VuX2NvbW1vbl9vcGVyYXRp b25fdG9fcmVmbGVjdCAob3AsIDB4MDAwMDAwMDBGRkZGRkZGRiwgMHhGRkZG RkZGRjAwMDAwMDAwLAorCQkJCSAgIDMyKTsKKyAgZ2VuX2NvbW1vbl9vcGVy YXRpb25fdG9fcmVmbGVjdCAob3AsIDB4MDAwMEZGRkYwMDAwRkZGRiwgMHhG RkZGMDAwMEZGRkYwMDAwLAorCQkJCSAgIDE2KTsKKyAgZ2VuX2NvbW1vbl9v cGVyYXRpb25fdG9fcmVmbGVjdCAob3AsIDB4MDBGRjAwRkYwMEZGMDBGRiwg MHhGRjAwRkYwMEZGMDBGRjAwLAorCQkJCSAgIDgpOworICBnZW5fY29tbW9u X29wZXJhdGlvbl90b19yZWZsZWN0IChvcCwgMHgwRjBGMEYwRjBGMEYwRjBG LCAweEYwRjBGMEYwRjBGMEYwRjAsCisJCQkJICAgNCk7CisgIGdlbl9jb21t b25fb3BlcmF0aW9uX3RvX3JlZmxlY3QgKG9wLCAweDMzMzMzMzMzMzMzMzMz MzMsIDB4Q0NDQ0NDQ0NDQ0NDQ0NDQywKKwkJCQkgICAyKTsKKyAgZ2VuX2Nv bW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAob3AsIDB4NTU1NTU1NTU1NTU1 NTU1NSwgMHhBQUFBQUFBQUFBQUFBQUFBLAorCQkJCSAgIDEpOworfQorCisv KiBSZWZsZWN0IDMyLWJpdCB2YWx1ZSBmb3IgdGhlIDMyLWJpdCB0YXJnZXQu ICAqLworCit2b2lkCityZWZsZWN0XzMyX2JpdF92YWx1ZSAocnR4ICpvcCkK K3sKKyAgZ2VuX2NvbW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAob3AsIDB4 MDAwMEZGRkYsIDB4RkZGRjAwMDAsIDE2KTsKKyAgZ2VuX2NvbW1vbl9vcGVy YXRpb25fdG9fcmVmbGVjdCAob3AsIDB4MDBGRjAwRkYsIDB4RkYwMEZGMDAs IDgpOworICBnZW5fY29tbW9uX29wZXJhdGlvbl90b19yZWZsZWN0IChvcCwg MHgwRjBGMEYwRiwgMHhGMEYwRjBGMCwgNCk7CisgIGdlbl9jb21tb25fb3Bl cmF0aW9uX3RvX3JlZmxlY3QgKG9wLCAweDMzMzMzMzMzLCAweENDQ0NDQ0ND LCAyKTsKKyAgZ2VuX2NvbW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAob3As IDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDEpOworfQorCisvKiBSZWZsZWN0 IDE2LWJpdCB2YWx1ZSBmb3IgdGhlIDE2LWJpdCB0YXJnZXQuICAqLworCit2 b2lkCityZWZsZWN0XzE2X2JpdF92YWx1ZSAocnR4ICpvcCkKK3sKKyAgZ2Vu X2NvbW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAob3AsIDB4MDBGRiwgMHhG RjAwLCA4KTsKKyAgZ2VuX2NvbW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAo b3AsIDB4MEYwRiwgMHhGMEYwLCA0KTsKKyAgZ2VuX2NvbW1vbl9vcGVyYXRp b25fdG9fcmVmbGVjdCAob3AsIDB4MzMzMywgMHhDQ0NDLCAyKTsKKyAgZ2Vu X2NvbW1vbl9vcGVyYXRpb25fdG9fcmVmbGVjdCAob3AsIDB4NTU1NSwgMHhB QUFBLCAxKTsKK30KKworLyogUmVmbGVjdCA4LWJpdCB2YWx1ZSBmb3IgdGhl IDgtYml0IHRhcmdldC4gICovCisKK3ZvaWQKK3JlZmxlY3RfOF9iaXRfdmFs dWUgKHJ0eCAqb3ApCit7CisgIGdlbl9jb21tb25fb3BlcmF0aW9uX3RvX3Jl ZmxlY3QgKG9wLCAweDBGLCAweEYwLCA0KTsKKyAgZ2VuX2NvbW1vbl9vcGVy YXRpb25fdG9fcmVmbGVjdCAob3AsIDB4MzMsIDB4Q0MsIDIpOworICBnZW5f Y29tbW9uX29wZXJhdGlvbl90b19yZWZsZWN0IChvcCwgMHg1NSwgMHhBQSwg MSk7Cit9CisKKy8qIEdlbmVyYXRlIGluc3RydWN0aW9uIHNlcXVlbmNlCisg ICB3aGljaCByZWZsZWN0cyB0aGUgdmFsdWUgb2YgdGhlIE9QIHVzaW5nIHNo aWZ0LCBhbmQsIG9yIG9wZXJhdGlvbnMuCisgICBPUCdzIG1vZGUgbWF5IGJl IGxlc3MgdGhhbiB3b3JkX21vZGUuICBUbyBnZXQgdGhlIGNvcnJlY3QgbnVt YmVyLAorICAgYWZ0ZXIgcmVmbGVjdGluZyB3ZSBzaGlmdCByaWdodCB0aGUg dmFsdWUgYnkgU0hJRlRfVkFMLgorICAgRS5nLiB3ZSBoYXZlIDExMTEgMDAw MSwgYWZ0ZXIgcmVmbGVjdGlvbiAodGFyZ2V0IDMyLWJpdCkgd2Ugd2lsbCBn ZXQKKyAgIDEwMDAgMTExMSAwMDAwIDAwMDAsIGlmIHdlIHNoaWZ0LW91dCAx NiBiaXRzLAorICAgd2Ugd2lsbCBnZXQgdGhlIGRlc2lyZWQgb25lOiAxMDAw IDExMTEuICAqLworCit2b2lkCitnZW5lcmF0ZV9yZWZsZWN0aW5nX2NvZGVf c3RhbmRhcmQgKHJ0eCAqb3AsIGludCBzaGlmdF92YWwpCit7CisgIGdjY19h c3NlcnQgKEJJVFNfUEVSX1dPUkQgPj0gOCAmJiBCSVRTX1BFUl9XT1JEIDw9 IDY0KTsKKworICBpZiAoQklUU19QRVJfV09SRCA9PSA2NCkKKyAgICByZWZs ZWN0XzY0X2JpdF92YWx1ZSAob3ApOworICBlbHNlIGlmIChCSVRTX1BFUl9X T1JEID09IDMyKQorICAgIHJlZmxlY3RfMzJfYml0X3ZhbHVlIChvcCk7Cisg IGVsc2UgaWYgKEJJVFNfUEVSX1dPUkQgPT0gMTYpCisgICAgcmVmbGVjdF8x Nl9iaXRfdmFsdWUgKG9wKTsKKyAgZWxzZQorICAgIHJlZmxlY3RfOF9iaXRf dmFsdWUgKG9wKTsKKworICAqb3AgPSBleHBhbmRfc2hpZnQgKFJTSElGVF9F WFBSLCB3b3JkX21vZGUsICpvcCwgc2hpZnRfdmFsLCAqb3AsIDEpOworfQor CisvKiBHZW5lcmF0ZSB0YWJsZS1iYXNlZCByZXZlcnNlZCBDUkMgY29kZSBm b3IgdGhlIGdpdmVuIENSQywgSU5QVVRfREFUQSBhbmQKKyAgIHRoZSBQT0xZ Tk9NSUFMICh3aXRob3V0IGxlYWRpbmcgMSkuCisKKyAgIENSQyBpcyBPUDEs IGRhdGEgaXMgT1AyIGFuZCB0aGUgcG9seW5vbWlhbCBpcyBPUDMuCisgICBU aGlzIG11c3QgZ2VuZXJhdGUgQ1JDIHRhYmxlIGFuZCBhc3NlbWJseSBmb3Ig dGhlIGZvbGxvd2luZyBjb2RlLAorICAgd2hlcmUgY3JjX3NpemUgYW5kIGRh dGFfc2l6ZSBtYXkgYmUgOCwgMTYsIDMyLCA2NDoKKyAgIHVpbnRfY3JjX3Np emVfdAorICAgY3JjX2NyY19zaXplICh1aW50X2NyY19zaXplX3QgY3JjX2lu aXQsIHVpbnRfZGF0YV9zaXplX3QgZGF0YSwgc2l6ZV90IHNpemUpCisgICB7 CisgICAgIHJlZmxlY3QgKGNyY19pbml0KQorICAgICB1aW50X2NyY19zaXpl X3QgY3JjID0gY3JjX2luaXQ7CisgICAgIHJlZmxlY3QgKGRhdGEpOworICAg ICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFfc2l6ZSAvIDg7IGkrKykKKyAg ICAgICBjcmMgPSAoY3JjIDw8IDgpCisgICAgICAgXiBjcmNfdGFibGVbKGNy YyA+PiAoY3JjX3NpemUgLSA4KSkKKwkJCV4gKGRhdGEgPj4gKGRhdGFfc2l6 ZSAtIChpICsgMSkgKiA4KSAmIDB4RkYpKV07CisgICAgIHJlZmxlY3QgKGNy Yyk7CisgICAgIHJldHVybiBjcmM7CisgICB9ICAqLworCit2b2lkCitleHBh bmRfcmV2ZXJzZWRfY3JjX3RhYmxlX2Jhc2VkIChydHggb3AwLCBydHggb3Ax LCBydHggb3AyLCBydHggb3AzLAorCQkJCSBtYWNoaW5lX21vZGUgZGF0YV9t b2RlLAorCQkJCSB2b2lkICgqZ2VuX3JlZmxlY3RpbmdfY29kZSkgKHJ0eCAq b3AsCisJCQkJCQkJICAgICAgaW50IHNoaWZ0X3ZhbCkpCit7CisgIGdjY19h c3NlcnQgKCFDT05TVF9JTlRfUCAob3AwKSk7CisgIGdjY19hc3NlcnQgKENP TlNUX0lOVF9QIChvcDMpKTsKKyAgbWFjaGluZV9tb2RlIGNyY19tb2RlID0g R0VUX01PREUgKG9wMCk7CisKKyAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBj cmNfc2l6ZSA9IEdFVF9NT0RFX0JJVFNJWkUgKGNyY19tb2RlKS50b19jb25z dGFudCAoKTsKKyAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBkYXRhX3NpemUg PSBHRVRfTU9ERV9CSVRTSVpFIChkYXRhX21vZGUpCisgICAgICAudG9fY29u c3RhbnQgKCk7CisKKyAgcnR4IGNyYyA9IGdlbl9yZWdfcnR4ICh3b3JkX21v ZGUpOworICBjb252ZXJ0X21vdmUgKGNyYywgb3AxLCAwKTsKKyAgZ2VuX3Jl ZmxlY3RpbmdfY29kZSAoJmNyYywgR0VUX01PREVfQklUU0laRSAod29yZF9t b2RlKSAtIGNyY19zaXplKTsKKworICBydHggZGF0YSA9IGdlbl9yZWdfcnR4 ICh3b3JkX21vZGUpOworICBjb252ZXJ0X21vdmUgKGRhdGEsIG9wMiwgMCk7 CisgIGdlbl9yZWZsZWN0aW5nX2NvZGUgKCZkYXRhLCBHRVRfTU9ERV9CSVRT SVpFICh3b3JkX21vZGUpIC0gZGF0YV9zaXplKTsKKworICBjYWxjdWxhdGVf dGFibGVfYmFzZWRfQ1JDICgmY3JjLCBkYXRhLCBvcDMsIGNyY19tb2RlLCBk YXRhX21vZGUpOworCisgIGdlbl9yZWZsZWN0aW5nX2NvZGUgKCZjcmMsIEdF VF9NT0RFX0JJVFNJWkUgKHdvcmRfbW9kZSkgLSBjcmNfc2l6ZSk7CisgIGlm IChjcmNfbW9kZSA9PSBTSW1vZGUgJiYgd29yZF9tb2RlID09IERJbW9kZSkK KyAgICB7CisgICAgICBydHggYV9sb3cgPSBnZW5fbG93cGFydF9TVUJSRUcg KGNyY19tb2RlLCBjcmMpOworICAgICAgY3JjID0gZ2VuX3J0eF9TSUdOX0VY VEVORCAod29yZF9tb2RlLCBhX2xvdyk7CisgICAgfQorICBydHggdGd0ID0g c2ltcGxpZnlfZ2VuX3N1YnJlZyAod29yZF9tb2RlLCBvcDAsIGNyY19tb2Rl LCAwKTsKKyAgZW1pdF9tb3ZlX2luc24gKHRndCwgY3JjKTsKK30KZGlmZiAt LWdpdCBhL2djYy9leHByLmggYi9nY2MvZXhwci5oCmluZGV4IDc1MTgxNTg0 MTA4Li43NDYzNGQyMjc3NyAxMDA2NDQKLS0tIGEvZ2NjL2V4cHIuaAorKysg Yi9nY2MvZXhwci5oCkBAIC0zNzQsNCArMzc0LDEwIEBAIGV4dGVybiBydHgg ZXhwcl9zaXplICh0cmVlKTsKIGV4dGVybiBib29sIG1lbV9yZWZfcmVmZXJz X3RvX25vbl9tZW1fcCAodHJlZSk7CiBleHRlcm4gYm9vbCBub25fbWVtX2Rl Y2xfcCAodHJlZSk7CiAKKy8qIEdlbmVyYXRlIHRhYmxlLWJhc2VkIENSQy4g ICovCitleHRlcm4gdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW5nX2NvZGVfc3Rh bmRhcmQgKHJ0eCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXhwYW5kX2NyY190 YWJsZV9iYXNlZCAocnR4LCBydHgsIHJ0eCwgcnR4LCBtYWNoaW5lX21vZGUp OworZXh0ZXJuIHZvaWQgZXhwYW5kX3JldmVyc2VkX2NyY190YWJsZV9iYXNl ZCAocnR4LCBydHgsIHJ0eCwgcnR4LCBtYWNoaW5lX21vZGUsCisJCQkJCSAg ICAgdm9pZCAoKikgKHJ0eCAqLCBpbnQpKTsKKwogI2VuZGlmIC8qIEdDQ19F WFBSX0ggKi8KZGlmZiAtLWdpdCBhL2djYy9pbnRlcm5hbC1mbi5jYyBiL2dj Yy9pbnRlcm5hbC1mbi5jYwppbmRleCA5YzA5MDI2NzkzZi4uOTJiYmIzYjgy NGIgMTAwNjQ0Ci0tLSBhL2djYy9pbnRlcm5hbC1mbi5jYworKysgYi9nY2Mv aW50ZXJuYWwtZm4uY2MKQEAgLTE4OSw2ICsxODksNyBAQCBpbml0X2ludGVy bmFsX2ZucyAoKQogI2RlZmluZSBtYXNrX2ZvbGRfbGVmdF9kaXJlY3QgeyAx LCAxLCBmYWxzZSB9CiAjZGVmaW5lIG1hc2tfbGVuX2ZvbGRfbGVmdF9kaXJl Y3QgeyAxLCAxLCBmYWxzZSB9CiAjZGVmaW5lIGNoZWNrX3B0cnNfZGlyZWN0 IHsgMCwgMCwgZmFsc2UgfQorI2RlZmluZSBjcmNfZGlyZWN0IHsgMSwgLTEs IHRydWUgfQogCiBjb25zdCBkaXJlY3RfaW50ZXJuYWxfZm5faW5mbyBkaXJl Y3RfaW50ZXJuYWxfZm5fYXJyYXlbSUZOX0xBU1QgKyAxXSA9IHsKICNkZWZp bmUgREVGX0lOVEVSTkFMX0ZOKENPREUsIEZMQUdTLCBGTlNQRUMpIG5vdF9k aXJlY3QsCkBAIC0zOTE4LDYgKzM5MTksNTkgQEAgZXhwYW5kX2NvbnZlcnRf b3B0YWJfZm4gKGludGVybmFsX2ZuIGZuLCBnY2FsbCAqc3RtdCwgY29udmVy dF9vcHRhYiBvcHRhYiwKICAgZXhwYW5kX2ZuX3VzaW5nX2luc24gKHN0bXQs IGljb2RlLCAxLCBuYXJncyk7CiB9CiAKKy8qIEV4cGFuZCBDUkMgY2FsbCBT VE1ULiAgKi8KKworc3RhdGljIHZvaWQKK2V4cGFuZF9jcmNfb3B0YWJfZm4g KGludGVybmFsX2ZuIGZuLCBnY2FsbCAqc3RtdCwgY29udmVydF9vcHRhYiBv cHRhYikKK3sKKyAgICB0cmVlIGxocyA9IGdpbXBsZV9jYWxsX2xocyAoc3Rt dCk7CisgICAgdHJlZSByaHMxID0gZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAw KTsgLy8gY3JjCisgICAgdHJlZSByaHMyID0gZ2ltcGxlX2NhbGxfYXJnIChz dG10LCAxKTsgLy8gZGF0YQorICAgIHRyZWUgcmhzMyA9IGdpbXBsZV9jYWxs X2FyZyAoc3RtdCwgMik7IC8vIHBvbHlub21pYWwKKworICAgIHRyZWUgcmVz dWx0X3R5cGUgPSBUUkVFX1RZUEUgKGxocyk7CisgICAgdHJlZSBkYXRhX3R5 cGUgPSBUUkVFX1RZUEUgKHJoczIpOworCisgICAgZ2NjX2Fzc2VydCAoVFlQ RV9NT0RFIChyZXN1bHRfdHlwZSkgPj0gVFlQRV9NT0RFIChkYXRhX3R5cGUp KTsKKyAgICBnY2NfYXNzZXJ0ICh3b3JkX21vZGUgPj0gVFlQRV9NT0RFIChy ZXN1bHRfdHlwZSkpOworCisgICAgcnR4IGRlc3QgPSBleHBhbmRfZXhwciAo bGhzLCBOVUxMX1JUWCwgVk9JRG1vZGUsIEVYUEFORF9XUklURSk7CisgICAg cnR4IGNyYyA9IGV4cGFuZF9ub3JtYWwgKHJoczEpOworICAgIHJ0eCBkYXRh ID0gZXhwYW5kX25vcm1hbCAocmhzMik7CisgICAgZ2NjX2Fzc2VydCAoVFJF RV9DT0RFIChyaHMzKSA9PSBJTlRFR0VSX0NTVCk7CisgICAgcnR4IHBvbHlu b21pYWwgPSBnZW5fcnR4X0NPTlNUX0lOVCAoVFlQRV9NT0RFIChyZXN1bHRf dHlwZSksCisJCQkJIFRSRUVfSU5UX0NTVF9MT1cgKHJoczMpKTsKKworICAg IC8qIFVzZSB0YXJnZXQgc3BlY2lmaWMgZXhwYW5zaW9uIGlmIGl0IGV4aXN0 cy4KKyAgICAgICBPdGhlcndpc2UsIGdlbmVyYXRlIHRhYmxlLWJhc2VkIENS Qy4gICovCisgIGlmIChkaXJlY3RfaW50ZXJuYWxfZm5fc3VwcG9ydGVkX3AK KyAgICAgIChmbiwgdHJlZV9wYWlyIChkYXRhX3R5cGUsIHJlc3VsdF90eXBl KSwgT1BUSU1JWkVfRk9SX1NQRUVEKSkKKyAgICB7CisgICAgICBjbGFzcyBl eHBhbmRfb3BlcmFuZCBvcHNbNF07CisgICAgICBjcmVhdGVfb3V0cHV0X29w ZXJhbmQgKCZvcHNbMF0sIGRlc3QsIFRZUEVfTU9ERSAocmVzdWx0X3R5cGUp KTsKKyAgICAgIGNyZWF0ZV9pbnB1dF9vcGVyYW5kICgmb3BzWzFdLCBjcmMs IFRZUEVfTU9ERSAocmVzdWx0X3R5cGUpKTsKKyAgICAgIGNyZWF0ZV9pbnB1 dF9vcGVyYW5kICgmb3BzWzJdLCBkYXRhLCBUWVBFX01PREUgKGRhdGFfdHlw ZSkpOworICAgICAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbM10sIHBv bHlub21pYWwsIFRZUEVfTU9ERSAocmVzdWx0X3R5cGUpKTsKKyAgICAgIGlu c25fY29kZSBpY29kZSA9IGNvbnZlcnRfb3B0YWJfaGFuZGxlciAob3B0YWIs IFRZUEVfTU9ERSAoZGF0YV90eXBlKSwKKwkJCQkJICAgICAgIFRZUEVfTU9E RSAocmVzdWx0X3R5cGUpKTsKKyAgICAgIGV4cGFuZF9pbnNuIChpY29kZSwg NCwgb3BzKTsKKyAgICAgIGlmICghcnR4X2VxdWFsX3AgKGRlc3QsIG9wc1sw XS52YWx1ZSkpCisJZW1pdF9tb3ZlX2luc24gKGRlc3QsIG9wc1swXS52YWx1 ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSWYgaXQncyBJ Rk5fQ1JDIGdlbmVyYXRlIGJpdC1mb3J3YXJkIENSQy4gICovCisgICAgICBp ZiAoZm4gPT0gSUZOX0NSQykKKwlleHBhbmRfY3JjX3RhYmxlX2Jhc2VkIChk ZXN0LCBjcmMsIGRhdGEsIHBvbHlub21pYWwsCisJCQkJVFlQRV9NT0RFIChk YXRhX3R5cGUpKTsKKyAgICAgIGVsc2UKKwkvKiBJZiBpdCdzIElGTl9DUkNf UkVWIGdlbmVyYXRlIGJpdC1yZXZlcnNlZCBDUkMuICAqLworCWV4cGFuZF9y ZXZlcnNlZF9jcmNfdGFibGVfYmFzZWQgKGRlc3QsIGNyYywgZGF0YSwgcG9s eW5vbWlhbCwKKwkJCQkJIFRZUEVfTU9ERSAoZGF0YV90eXBlKSwKKwkJCQkJ IGdlbmVyYXRlX3JlZmxlY3RpbmdfY29kZV9zdGFuZGFyZCk7CisgICAgfQor fQorCiAvKiBFeHBhbmRlcnMgZm9yIG9wdGFicyB0aGF0IGNhbiB1c2UgZXhw YW5kX2RpcmVjdF9vcHRhYl9mbi4gICovCiAKICNkZWZpbmUgZXhwYW5kX3Vu YXJ5X29wdGFiX2ZuKEZOLCBTVE1ULCBPUFRBQikgXApAQCAtNDA1NCw2ICs0 MTA4LDcgQEAgbXVsdGlfdmVjdG9yX29wdGFiX3N1cHBvcnRlZF9wIChjb252 ZXJ0X29wdGFiIG9wdGFiLCB0cmVlX3BhaXIgdHlwZXMsCiAjZGVmaW5lIGRp cmVjdF9jb25kX2xlbl91bmFyeV9vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rf b3B0YWJfc3VwcG9ydGVkX3AKICNkZWZpbmUgZGlyZWN0X2NvbmRfbGVuX2Jp bmFyeV9vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rfb3B0YWJfc3VwcG9ydGVk X3AKICNkZWZpbmUgZGlyZWN0X2NvbmRfbGVuX3Rlcm5hcnlfb3B0YWJfc3Vw cG9ydGVkX3AgZGlyZWN0X29wdGFiX3N1cHBvcnRlZF9wCisjZGVmaW5lIGRp cmVjdF9jcmNfb3B0YWJfc3VwcG9ydGVkX3AgY29udmVydF9vcHRhYl9zdXBw b3J0ZWRfcAogI2RlZmluZSBkaXJlY3RfbWFza19sb2FkX29wdGFiX3N1cHBv cnRlZF9wIGNvbnZlcnRfb3B0YWJfc3VwcG9ydGVkX3AKICNkZWZpbmUgZGly ZWN0X2xvYWRfbGFuZXNfb3B0YWJfc3VwcG9ydGVkX3AgbXVsdGlfdmVjdG9y X29wdGFiX3N1cHBvcnRlZF9wCiAjZGVmaW5lIGRpcmVjdF9tYXNrX2xvYWRf bGFuZXNfb3B0YWJfc3VwcG9ydGVkX3AgbXVsdGlfdmVjdG9yX29wdGFiX3N1 cHBvcnRlZF9wCmRpZmYgLS1naXQgYS9nY2MvaW50ZXJuYWwtZm4uZGVmIGIv Z2NjL2ludGVybmFsLWZuLmRlZgppbmRleCAyNWJhZGJiODZlNS4uNzY1ODUx MDBhNjMgMTAwNjQ0Ci0tLSBhL2djYy9pbnRlcm5hbC1mbi5kZWYKKysrIGIv Z2NjL2ludGVybmFsLWZuLmRlZgpAQCAtMjAwLDYgKzIwMCw4IEBAIGFsb25n IHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2Vl CiAJCQkJY29uZF9sZW5fIyNVTlNJR05FRF9PUFRBQiwgY29uZF9sZW5fIyNU WVBFKQogI2VuZGlmCiAKK0RFRl9JTlRFUk5BTF9PUFRBQl9GTiAoQ1JDLCBF Q0ZfQ09OU1QgfCBFQ0ZfTk9USFJPVywgY3JjLCBjcmMpCitERUZfSU5URVJO QUxfT1BUQUJfRk4gKENSQ19SRVYsIEVDRl9DT05TVCB8IEVDRl9OT1RIUk9X LCBjcmNfcmV2LCBjcmMpCiBERUZfSU5URVJOQUxfT1BUQUJfRk4gKE1BU0tf TE9BRCwgRUNGX1BVUkUsIG1hc2tsb2FkLCBtYXNrX2xvYWQpCiBERUZfSU5U RVJOQUxfT1BUQUJfRk4gKExPQURfTEFORVMsIEVDRl9DT05TVCwgdmVjX2xv YWRfbGFuZXMsIGxvYWRfbGFuZXMpCiBERUZfSU5URVJOQUxfT1BUQUJfRk4g KE1BU0tfTE9BRF9MQU5FUywgRUNGX1BVUkUsCmRpZmYgLS1naXQgYS9nY2Mv b3B0YWJzLmRlZiBiL2djYy9vcHRhYnMuZGVmCmluZGV4IDNmMmNiNDZhZmY4 Li5iZjFhYWFjOTBjNiAxMDA2NDQKLS0tIGEvZ2NjL29wdGFicy5kZWYKKysr IGIvZ2NjL29wdGFicy5kZWYKQEAgLTc4LDYgKzc4LDggQEAgT1BUQUJfQ0Qo c21zdWJfd2lkZW5fb3B0YWIsICJtc3ViJGIkYTQiKQogT1BUQUJfQ0QodW1z dWJfd2lkZW5fb3B0YWIsICJ1bXN1YiRiJGE0IikKIE9QVEFCX0NEKHNzbXN1 Yl93aWRlbl9vcHRhYiwgInNzbXN1YiRiJGE0IikKIE9QVEFCX0NEKHVzbXN1 Yl93aWRlbl9vcHRhYiwgInVzbXN1YiRhJGI0IikKK09QVEFCX0NEKGNyY19v cHRhYiwgImNyYyRhJGI0IikKK09QVEFCX0NEKGNyY19yZXZfb3B0YWIsICJj cmNfcmV2JGEkYjQiKQogT1BUQUJfQ0QodmVjX2xvYWRfbGFuZXNfb3B0YWIs ICJ2ZWNfbG9hZF9sYW5lcyRhJGIiKQogT1BUQUJfQ0QodmVjX3N0b3JlX2xh bmVzX29wdGFiLCAidmVjX3N0b3JlX2xhbmVzJGEkYiIpCiBPUFRBQl9DRCh2 ZWNfbWFza19sb2FkX2xhbmVzX29wdGFiLCAidmVjX21hc2tfbG9hZF9sYW5l cyRhJGIiKQotLSAKMi4yNS4xCgo= --0000000000008bbc5a06192f2345--