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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 089B8C433EF for ; Wed, 5 Jan 2022 15:03:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241280AbiAEPDQ (ORCPT ); Wed, 5 Jan 2022 10:03:16 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:46442 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241192AbiAEPCy (ORCPT ); Wed, 5 Jan 2022 10:02:54 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 745186178A; Wed, 5 Jan 2022 15:02:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8BC5AC36AE0; Wed, 5 Jan 2022 15:02:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641394973; bh=YzSw0jzAbp3IOps2JabCEF2fRcUsifDh7TuQoPY2nDI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MvMLm0NLVKoMcirLeqtUMf3Fs1hz6xjKb5U9JjTB3qWQ/7wTxvteVZYMo5LW8o2Gf nmjEYG0W2XU9K3VCqdUuXP/k8em/mMBUMoNn6K9GUlT87hB/4qVSIDXHbxRAZZFWNB a6qlfZPSa6WEBFoB+K4ejtONFjh0g1/WoYXPmuYPuOlC9Em//8fXOzQ6gSH2wvj9Dw +tB8KxcqJz+0Dyp/G1+ZPHmJdw+SqEiMaxWC5KGb11kJ1+4p0m42emmGZhBJq8Q+h8 Yw4xZsp8SVoUxRCWHxoUlP/V+zC4DCM3KYCWvbUnEbnSl7e+2vl6YYMN6eMVVcYQcM DB+N3crsBhpxg== Received: by pali.im (Postfix) id 5D3C0881; Wed, 5 Jan 2022 16:02:51 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Russell King Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 02/11] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Wed, 5 Jan 2022 16:02:30 +0100 Message-Id: <20220105150239.9628-3-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220105150239.9628-1-pali@kernel.org> References: <20220105150239.9628-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Russell King Add support for PCIe extended capabilities, which we just redirect to the emulating driver. Signed-off-by: Russell King [pali: Fix writing new value with W1C bits] Signed-off-by: Pali Rohár --- drivers/pci/pci-bridge-emul.c | 77 +++++++++++++++++++++++------------ drivers/pci/pci-bridge-emul.h | 15 +++++++ 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c index 56b2cb741498..9f4f173f0650 100644 --- a/drivers/pci/pci-bridge-emul.c +++ b/drivers/pci/pci-bridge-emul.c @@ -433,10 +433,16 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where, read_op = bridge->ops->read_pcie; cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; - } else { - /* Beyond our PCIe space */ + } else if (reg < PCI_CFG_SPACE_SIZE) { + /* Rest of PCI space not implemented */ *value = 0; return PCIBIOS_SUCCESSFUL; + } else { + /* PCIe extended capability space */ + reg -= PCI_CFG_SPACE_SIZE; + read_op = bridge->ops->read_ext; + cfgspace = NULL; + behavior = NULL; } if (read_op) @@ -444,15 +450,20 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where, else ret = PCI_BRIDGE_EMUL_NOT_HANDLED; - if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED) - *value = le32_to_cpu(cfgspace[reg / 4]); + if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED) { + if (cfgspace) + *value = le32_to_cpu(cfgspace[reg / 4]); + else + *value = 0; + } /* * Make sure we never return any reserved bit with a value * different from 0. */ - *value &= behavior[reg / 4].ro | behavior[reg / 4].rw | - behavior[reg / 4].w1c; + if (behavior) + *value &= behavior[reg / 4].ro | behavior[reg / 4].rw | + behavior[reg / 4].w1c; if (size == 1) *value = (*value >> (8 * (where & 3))) & 0xff; @@ -498,8 +509,15 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where, write_op = bridge->ops->write_pcie; cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; - } else { + } else if (reg < PCI_CFG_SPACE_SIZE) { + /* Rest of PCI space not implemented */ return PCIBIOS_SUCCESSFUL; + } else { + /* PCIe extended capability space */ + reg -= PCI_CFG_SPACE_SIZE; + write_op = bridge->ops->write_ext; + cfgspace = NULL; + behavior = NULL; } shift = (where & 0x3) * 8; @@ -513,29 +531,38 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where, else return PCIBIOS_BAD_REGISTER_NUMBER; - /* Keep all bits, except the RW bits */ - new = old & (~mask | ~behavior[reg / 4].rw); + if (behavior) { + /* Keep all bits, except the RW bits */ + new = old & (~mask | ~behavior[reg / 4].rw); - /* Update the value of the RW bits */ - new |= (value << shift) & (behavior[reg / 4].rw & mask); + /* Update the value of the RW bits */ + new |= (value << shift) & (behavior[reg / 4].rw & mask); - /* Clear the W1C bits */ - new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); + /* Clear the W1C bits */ + new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); + } else { + new = old & ~mask; + new |= (value << shift) & mask; + } - /* Save the new value with the cleared W1C bits into the cfgspace */ - cfgspace[reg / 4] = cpu_to_le32(new); + if (cfgspace) { + /* Save the new value with the cleared W1C bits into the cfgspace */ + cfgspace[reg / 4] = cpu_to_le32(new); + } - /* - * Clear the W1C bits not specified by the write mask, so that the - * write_op() does not clear them. - */ - new &= ~(behavior[reg / 4].w1c & ~mask); + if (behavior) { + /* + * Clear the W1C bits not specified by the write mask, so that the + * write_op() does not clear them. + */ + new &= ~(behavior[reg / 4].w1c & ~mask); - /* - * Set the W1C bits specified by the write mask, so that write_op() - * knows about that they are to be cleared. - */ - new |= (value << shift) & (behavior[reg / 4].w1c & mask); + /* + * Set the W1C bits specified by the write mask, so that write_op() + * knows about that they are to be cleared. + */ + new |= (value << shift) & (behavior[reg / 4].w1c & mask); + } if (write_op) write_op(bridge, reg, old, new, mask); diff --git a/drivers/pci/pci-bridge-emul.h b/drivers/pci/pci-bridge-emul.h index 4953274cac18..6b5f75b2ad02 100644 --- a/drivers/pci/pci-bridge-emul.h +++ b/drivers/pci/pci-bridge-emul.h @@ -90,6 +90,14 @@ struct pci_bridge_emul_ops { */ pci_bridge_emul_read_status_t (*read_pcie)(struct pci_bridge_emul *bridge, int reg, u32 *value); + + /* + * Same as ->read_base(), except it is for reading from the + * PCIe extended capability configuration space. + */ + pci_bridge_emul_read_status_t (*read_ext)(struct pci_bridge_emul *bridge, + int reg, u32 *value); + /* * Called when writing to the regular PCI bridge configuration * space. old is the current value, new is the new value being @@ -105,6 +113,13 @@ struct pci_bridge_emul_ops { */ void (*write_pcie)(struct pci_bridge_emul *bridge, int reg, u32 old, u32 new, u32 mask); + + /* + * Same as ->write_base(), except it is for writing from the + * PCIe extended capability configuration space. + */ + void (*write_ext)(struct pci_bridge_emul *bridge, int reg, + u32 old, u32 new, u32 mask); }; struct pci_bridge_reg_behavior; -- 2.20.1 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 EF655C433FE for ; Wed, 5 Jan 2022 15:04:30 +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=/pFt6SSDtAMiSyBN6PMzjSG3ptygc0WR4nwvgKrQPqI=; b=Wa8us6O9LnVBF6 EqCIdEOp54Z5ROaQRnZ7AogQ2BJ+Ej+l5HrKr/K19h5T5biBGbm71kdgfCWboizf0wJnmVQUzFfyy TfFN7EoDFh6jRhk8UOyWbS0zE69ytMomn0gif30N1b5BMIpK7bNNZJdwq9K6VGSa4z/a2k44GiM89 OKDYy/NFSoSrNBfUNakwNwZVlGElCdP99fwibpT/4VZM64LFUNvgAJk/1qNxPVlgj3K9g8SplsNdW JHI9V7Ny1GCz3U6rBjR+xpkxUhKgeGSCu7OgxGDAqR94qKyEePavtVzrK5SwNxN6nMK5nWAaZtucQ Sal5p2t+hs2K8nyZ/Gaw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n57oh-00F4HO-T0; Wed, 05 Jan 2022 15:03:08 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1n57oU-00F4Ab-Gc for linux-arm-kernel@lists.infradead.org; Wed, 05 Jan 2022 15:02:56 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 12B0E61796; Wed, 5 Jan 2022 15:02:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8BC5AC36AE0; Wed, 5 Jan 2022 15:02:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641394973; bh=YzSw0jzAbp3IOps2JabCEF2fRcUsifDh7TuQoPY2nDI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MvMLm0NLVKoMcirLeqtUMf3Fs1hz6xjKb5U9JjTB3qWQ/7wTxvteVZYMo5LW8o2Gf nmjEYG0W2XU9K3VCqdUuXP/k8em/mMBUMoNn6K9GUlT87hB/4qVSIDXHbxRAZZFWNB a6qlfZPSa6WEBFoB+K4ejtONFjh0g1/WoYXPmuYPuOlC9Em//8fXOzQ6gSH2wvj9Dw +tB8KxcqJz+0Dyp/G1+ZPHmJdw+SqEiMaxWC5KGb11kJ1+4p0m42emmGZhBJq8Q+h8 Yw4xZsp8SVoUxRCWHxoUlP/V+zC4DCM3KYCWvbUnEbnSl7e+2vl6YYMN6eMVVcYQcM DB+N3crsBhpxg== Received: by pali.im (Postfix) id 5D3C0881; Wed, 5 Jan 2022 16:02:51 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Russell King Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 02/11] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Wed, 5 Jan 2022 16:02:30 +0100 Message-Id: <20220105150239.9628-3-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220105150239.9628-1-pali@kernel.org> References: <20220105150239.9628-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220105_070254_659010_534A438E X-CRM114-Status: GOOD ( 22.79 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogUnVzc2VsbCBLaW5nIDxybWsra2VybmVsQGFybWxpbnV4Lm9yZy51az4KCkFkZCBzdXBw b3J0IGZvciBQQ0llIGV4dGVuZGVkIGNhcGFiaWxpdGllcywgd2hpY2ggd2UganVzdCByZWRpcmVj dCB0byB0aGUKZW11bGF0aW5nIGRyaXZlci4KClNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyA8 cm1rK2tlcm5lbEBhcm1saW51eC5vcmcudWs+CltwYWxpOiBGaXggd3JpdGluZyBuZXcgdmFsdWUg d2l0aCBXMUMgYml0c10KU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9y Zz4KLS0tCiBkcml2ZXJzL3BjaS9wY2ktYnJpZGdlLWVtdWwuYyB8IDc3ICsrKysrKysrKysrKysr KysrKysrKysrLS0tLS0tLS0tLS0tCiBkcml2ZXJzL3BjaS9wY2ktYnJpZGdlLWVtdWwuaCB8IDE1 ICsrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgNjcgaW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWJyaWRnZS1lbXVsLmMgYi9kcml2ZXJz L3BjaS9wY2ktYnJpZGdlLWVtdWwuYwppbmRleCA1NmIyY2I3NDE0OTguLjlmNGYxNzNmMDY1MCAx MDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWJyaWRnZS1lbXVsLmMKKysrIGIvZHJpdmVycy9w Y2kvcGNpLWJyaWRnZS1lbXVsLmMKQEAgLTQzMywxMCArNDMzLDE2IEBAIGludCBwY2lfYnJpZGdl X2VtdWxfY29uZl9yZWFkKHN0cnVjdCBwY2lfYnJpZGdlX2VtdWwgKmJyaWRnZSwgaW50IHdoZXJl LAogCQlyZWFkX29wID0gYnJpZGdlLT5vcHMtPnJlYWRfcGNpZTsKIAkJY2Znc3BhY2UgPSAoX19s ZTMyICopICZicmlkZ2UtPnBjaWVfY29uZjsKIAkJYmVoYXZpb3IgPSBicmlkZ2UtPnBjaWVfY2Fw X3JlZ3NfYmVoYXZpb3I7Ci0JfSBlbHNlIHsKLQkJLyogQmV5b25kIG91ciBQQ0llIHNwYWNlICov CisJfSBlbHNlIGlmIChyZWcgPCBQQ0lfQ0ZHX1NQQUNFX1NJWkUpIHsKKwkJLyogUmVzdCBvZiBQ Q0kgc3BhY2Ugbm90IGltcGxlbWVudGVkICovCiAJCSp2YWx1ZSA9IDA7CiAJCXJldHVybiBQQ0lC SU9TX1NVQ0NFU1NGVUw7CisJfSBlbHNlIHsKKwkJLyogUENJZSBleHRlbmRlZCBjYXBhYmlsaXR5 IHNwYWNlICovCisJCXJlZyAtPSBQQ0lfQ0ZHX1NQQUNFX1NJWkU7CisJCXJlYWRfb3AgPSBicmlk Z2UtPm9wcy0+cmVhZF9leHQ7CisJCWNmZ3NwYWNlID0gTlVMTDsKKwkJYmVoYXZpb3IgPSBOVUxM OwogCX0KIAogCWlmIChyZWFkX29wKQpAQCAtNDQ0LDE1ICs0NTAsMjAgQEAgaW50IHBjaV9icmlk Z2VfZW11bF9jb25mX3JlYWQoc3RydWN0IHBjaV9icmlkZ2VfZW11bCAqYnJpZGdlLCBpbnQgd2hl cmUsCiAJZWxzZQogCQlyZXQgPSBQQ0lfQlJJREdFX0VNVUxfTk9UX0hBTkRMRUQ7CiAKLQlpZiAo cmV0ID09IFBDSV9CUklER0VfRU1VTF9OT1RfSEFORExFRCkKLQkJKnZhbHVlID0gbGUzMl90b19j cHUoY2Znc3BhY2VbcmVnIC8gNF0pOworCWlmIChyZXQgPT0gUENJX0JSSURHRV9FTVVMX05PVF9I QU5ETEVEKSB7CisJCWlmIChjZmdzcGFjZSkKKwkJCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KGNmZ3Nw YWNlW3JlZyAvIDRdKTsKKwkJZWxzZQorCQkJKnZhbHVlID0gMDsKKwl9CiAKIAkvKgogCSAqIE1h a2Ugc3VyZSB3ZSBuZXZlciByZXR1cm4gYW55IHJlc2VydmVkIGJpdCB3aXRoIGEgdmFsdWUKIAkg KiBkaWZmZXJlbnQgZnJvbSAwLgogCSAqLwotCSp2YWx1ZSAmPSBiZWhhdmlvcltyZWcgLyA0XS5y byB8IGJlaGF2aW9yW3JlZyAvIDRdLnJ3IHwKLQkJICBiZWhhdmlvcltyZWcgLyA0XS53MWM7CisJ aWYgKGJlaGF2aW9yKQorCQkqdmFsdWUgJj0gYmVoYXZpb3JbcmVnIC8gNF0ucm8gfCBiZWhhdmlv cltyZWcgLyA0XS5ydyB8CisJCQkgIGJlaGF2aW9yW3JlZyAvIDRdLncxYzsKIAogCWlmIChzaXpl ID09IDEpCiAJCSp2YWx1ZSA9ICgqdmFsdWUgPj4gKDggKiAod2hlcmUgJiAzKSkpICYgMHhmZjsK QEAgLTQ5OCw4ICs1MDksMTUgQEAgaW50IHBjaV9icmlkZ2VfZW11bF9jb25mX3dyaXRlKHN0cnVj dCBwY2lfYnJpZGdlX2VtdWwgKmJyaWRnZSwgaW50IHdoZXJlLAogCQl3cml0ZV9vcCA9IGJyaWRn ZS0+b3BzLT53cml0ZV9wY2llOwogCQljZmdzcGFjZSA9IChfX2xlMzIgKikgJmJyaWRnZS0+cGNp ZV9jb25mOwogCQliZWhhdmlvciA9IGJyaWRnZS0+cGNpZV9jYXBfcmVnc19iZWhhdmlvcjsKLQl9 IGVsc2UgeworCX0gZWxzZSBpZiAocmVnIDwgUENJX0NGR19TUEFDRV9TSVpFKSB7CisJCS8qIFJl c3Qgb2YgUENJIHNwYWNlIG5vdCBpbXBsZW1lbnRlZCAqLwogCQlyZXR1cm4gUENJQklPU19TVUND RVNTRlVMOworCX0gZWxzZSB7CisJCS8qIFBDSWUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBzcGFjZSAq LworCQlyZWcgLT0gUENJX0NGR19TUEFDRV9TSVpFOworCQl3cml0ZV9vcCA9IGJyaWRnZS0+b3Bz LT53cml0ZV9leHQ7CisJCWNmZ3NwYWNlID0gTlVMTDsKKwkJYmVoYXZpb3IgPSBOVUxMOwogCX0K IAogCXNoaWZ0ID0gKHdoZXJlICYgMHgzKSAqIDg7CkBAIC01MTMsMjkgKzUzMSwzOCBAQCBpbnQg cGNpX2JyaWRnZV9lbXVsX2NvbmZfd3JpdGUoc3RydWN0IHBjaV9icmlkZ2VfZW11bCAqYnJpZGdl LCBpbnQgd2hlcmUsCiAJZWxzZQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVS OwogCi0JLyogS2VlcCBhbGwgYml0cywgZXhjZXB0IHRoZSBSVyBiaXRzICovCi0JbmV3ID0gb2xk ICYgKH5tYXNrIHwgfmJlaGF2aW9yW3JlZyAvIDRdLnJ3KTsKKwlpZiAoYmVoYXZpb3IpIHsKKwkJ LyogS2VlcCBhbGwgYml0cywgZXhjZXB0IHRoZSBSVyBiaXRzICovCisJCW5ldyA9IG9sZCAmICh+ bWFzayB8IH5iZWhhdmlvcltyZWcgLyA0XS5ydyk7CiAKLQkvKiBVcGRhdGUgdGhlIHZhbHVlIG9m IHRoZSBSVyBiaXRzICovCi0JbmV3IHw9ICh2YWx1ZSA8PCBzaGlmdCkgJiAoYmVoYXZpb3JbcmVn IC8gNF0ucncgJiBtYXNrKTsKKwkJLyogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgUlcgYml0cyAq LworCQluZXcgfD0gKHZhbHVlIDw8IHNoaWZ0KSAmIChiZWhhdmlvcltyZWcgLyA0XS5ydyAmIG1h c2spOwogCi0JLyogQ2xlYXIgdGhlIFcxQyBiaXRzICovCi0JbmV3ICY9IH4oKHZhbHVlIDw8IHNo aWZ0KSAmIChiZWhhdmlvcltyZWcgLyA0XS53MWMgJiBtYXNrKSk7CisJCS8qIENsZWFyIHRoZSBX MUMgYml0cyAqLworCQluZXcgJj0gfigodmFsdWUgPDwgc2hpZnQpICYgKGJlaGF2aW9yW3JlZyAv IDRdLncxYyAmIG1hc2spKTsKKwl9IGVsc2UgeworCQluZXcgPSBvbGQgJiB+bWFzazsKKwkJbmV3 IHw9ICh2YWx1ZSA8PCBzaGlmdCkgJiBtYXNrOworCX0KIAotCS8qIFNhdmUgdGhlIG5ldyB2YWx1 ZSB3aXRoIHRoZSBjbGVhcmVkIFcxQyBiaXRzIGludG8gdGhlIGNmZ3NwYWNlICovCi0JY2Znc3Bh Y2VbcmVnIC8gNF0gPSBjcHVfdG9fbGUzMihuZXcpOworCWlmIChjZmdzcGFjZSkgeworCQkvKiBT YXZlIHRoZSBuZXcgdmFsdWUgd2l0aCB0aGUgY2xlYXJlZCBXMUMgYml0cyBpbnRvIHRoZSBjZmdz cGFjZSAqLworCQljZmdzcGFjZVtyZWcgLyA0XSA9IGNwdV90b19sZTMyKG5ldyk7CisJfQogCi0J LyoKLQkgKiBDbGVhciB0aGUgVzFDIGJpdHMgbm90IHNwZWNpZmllZCBieSB0aGUgd3JpdGUgbWFz aywgc28gdGhhdCB0aGUKLQkgKiB3cml0ZV9vcCgpIGRvZXMgbm90IGNsZWFyIHRoZW0uCi0JICov Ci0JbmV3ICY9IH4oYmVoYXZpb3JbcmVnIC8gNF0udzFjICYgfm1hc2spOworCWlmIChiZWhhdmlv cikgeworCQkvKgorCQkgKiBDbGVhciB0aGUgVzFDIGJpdHMgbm90IHNwZWNpZmllZCBieSB0aGUg d3JpdGUgbWFzaywgc28gdGhhdCB0aGUKKwkJICogd3JpdGVfb3AoKSBkb2VzIG5vdCBjbGVhciB0 aGVtLgorCQkgKi8KKwkJbmV3ICY9IH4oYmVoYXZpb3JbcmVnIC8gNF0udzFjICYgfm1hc2spOwog Ci0JLyoKLQkgKiBTZXQgdGhlIFcxQyBiaXRzIHNwZWNpZmllZCBieSB0aGUgd3JpdGUgbWFzaywg c28gdGhhdCB3cml0ZV9vcCgpCi0JICoga25vd3MgYWJvdXQgdGhhdCB0aGV5IGFyZSB0byBiZSBj bGVhcmVkLgotCSAqLwotCW5ldyB8PSAodmFsdWUgPDwgc2hpZnQpICYgKGJlaGF2aW9yW3JlZyAv IDRdLncxYyAmIG1hc2spOworCQkvKgorCQkgKiBTZXQgdGhlIFcxQyBiaXRzIHNwZWNpZmllZCBi eSB0aGUgd3JpdGUgbWFzaywgc28gdGhhdCB3cml0ZV9vcCgpCisJCSAqIGtub3dzIGFib3V0IHRo YXQgdGhleSBhcmUgdG8gYmUgY2xlYXJlZC4KKwkJICovCisJCW5ldyB8PSAodmFsdWUgPDwgc2hp ZnQpICYgKGJlaGF2aW9yW3JlZyAvIDRdLncxYyAmIG1hc2spOworCX0KIAogCWlmICh3cml0ZV9v cCkKIAkJd3JpdGVfb3AoYnJpZGdlLCByZWcsIG9sZCwgbmV3LCBtYXNrKTsKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL3BjaS1icmlkZ2UtZW11bC5oIGIvZHJpdmVycy9wY2kvcGNpLWJyaWRnZS1l bXVsLmgKaW5kZXggNDk1MzI3NGNhYzE4Li42YjVmNzViMmFkMDIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvcGNpL3BjaS1icmlkZ2UtZW11bC5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1icmlkZ2UtZW11 bC5oCkBAIC05MCw2ICs5MCwxNCBAQCBzdHJ1Y3QgcGNpX2JyaWRnZV9lbXVsX29wcyB7CiAJICov CiAJcGNpX2JyaWRnZV9lbXVsX3JlYWRfc3RhdHVzX3QgKCpyZWFkX3BjaWUpKHN0cnVjdCBwY2lf YnJpZGdlX2VtdWwgKmJyaWRnZSwKIAkJCQkJCSAgIGludCByZWcsIHUzMiAqdmFsdWUpOworCisJ LyoKKwkgKiBTYW1lIGFzIC0+cmVhZF9iYXNlKCksIGV4Y2VwdCBpdCBpcyBmb3IgcmVhZGluZyBm cm9tIHRoZQorCSAqIFBDSWUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBjb25maWd1cmF0aW9uIHNwYWNl LgorCSAqLworCXBjaV9icmlkZ2VfZW11bF9yZWFkX3N0YXR1c190ICgqcmVhZF9leHQpKHN0cnVj dCBwY2lfYnJpZGdlX2VtdWwgKmJyaWRnZSwKKwkJCQkJCSAgaW50IHJlZywgdTMyICp2YWx1ZSk7 CisKIAkvKgogCSAqIENhbGxlZCB3aGVuIHdyaXRpbmcgdG8gdGhlIHJlZ3VsYXIgUENJIGJyaWRn ZSBjb25maWd1cmF0aW9uCiAJICogc3BhY2UuIG9sZCBpcyB0aGUgY3VycmVudCB2YWx1ZSwgbmV3 IGlzIHRoZSBuZXcgdmFsdWUgYmVpbmcKQEAgLTEwNSw2ICsxMTMsMTMgQEAgc3RydWN0IHBjaV9i cmlkZ2VfZW11bF9vcHMgewogCSAqLwogCXZvaWQgKCp3cml0ZV9wY2llKShzdHJ1Y3QgcGNpX2Jy aWRnZV9lbXVsICpicmlkZ2UsIGludCByZWcsCiAJCQkgICB1MzIgb2xkLCB1MzIgbmV3LCB1MzIg bWFzayk7CisKKwkvKgorCSAqIFNhbWUgYXMgLT53cml0ZV9iYXNlKCksIGV4Y2VwdCBpdCBpcyBm b3Igd3JpdGluZyBmcm9tIHRoZQorCSAqIFBDSWUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBjb25maWd1 cmF0aW9uIHNwYWNlLgorCSAqLworCXZvaWQgKCp3cml0ZV9leHQpKHN0cnVjdCBwY2lfYnJpZGdl X2VtdWwgKmJyaWRnZSwgaW50IHJlZywKKwkJCSAgdTMyIG9sZCwgdTMyIG5ldywgdTMyIG1hc2sp OwogfTsKIAogc3RydWN0IHBjaV9icmlkZ2VfcmVnX2JlaGF2aW9yOwotLSAKMi4yMC4xCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5l bAo=