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 E367DC3DA64 for ; Thu, 1 Aug 2024 07:22:18 +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=q661E8n5sn/UmFpsw+Xka2Nqk0zVRyj8rX/diXvc6/g=; b=T+Xio0pUCywJML nADnMMMVMVsimADL7k7rwcODBy/tFiTJOiejAiJ1O6GMp+IIOHvSVKdZGWa2YtinyVshUAeXmACv1 6MUYB/Z5haoW+bRdB5GaFp2JlEUb18nqdatlLXy0IgbPThuKvIjvBKHwA7vWVKseGfMCY1EH64mKI D/ZLSRnIiy7v+tYpSw/YMR031ik3/B2ylBsqlXutCh6RgbUM5O0TV9I2iOfDGfqQsoww7mOtskMF9 8C92HdBauZlP0VCuvF3Ayk1tCpqcxA1ep+k2OxsEFHlOeMPNbkIz95XN38ORNQytd+9wcQ61BPaBc EgaoSCh68tJIHtiS72zg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZQ8g-000000049J4-2dSS; Thu, 01 Aug 2024 07:22:18 +0000 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZQ8b-000000049Gt-0cB7 for linux-i3c@lists.infradead.org; Thu, 01 Aug 2024 07:22:17 +0000 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-70d2c0ee69fso543565b3a.2 for ; Thu, 01 Aug 2024 00:22:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722496932; x=1723101732; 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=b9mnGpcNkJPWZl8eJD2EJbs06aLMr1GHaUYsqZcQsQU=; b=mRMoZ4GWCBcAv1gTG8n6Ss3gJEeYivWjNtsn8vmYHYry5WL49i7PmYV47kI7vkDmpm njLBZG0oLVT6Byx9sdYgC3COP86F/FI17dTTXqMCk/vvEIESjdF57Tus6x8LzEMlFlUz xo+K898TO/vAMDfoEqwMGGftJxcAd4qJWUKS6+eiUqsGeGX+b3xMyoc9TeNO7DlbMFbS dazX/XXuU8Ay51bsS5hTf9/VBB3ndark5lIgE7roPGn67flZkrZwGAVXsz6pAmyeMB6c hOHfQhJdF/nQ3gwLBeUMHwYFLeRsTh6n2KK1ZJgHVNc2E0YteBigm/O0QGtLtNlsqhta 5Lwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722496932; x=1723101732; 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=b9mnGpcNkJPWZl8eJD2EJbs06aLMr1GHaUYsqZcQsQU=; b=qxkovrjCvoHseJtSgWwPcPQOK361ya14ndt8mwIUU/BjvumHVj5SxkMbFZ7XM3ZdrE 1UsWD9mfcf2JKUkFfjd7FOYu3YpS5hCeWuJhRDx8yxliAEUezaB8R/JlcNvm6sxYxeNx losDwteRVSYiVv7e92SpC/0ta2fsvAcy8UxXs0npaOSuPnBG46rTHFzcmz6DUkumY+BX nZnKw4d6RNkQgzKWryW+4h1rNKIAJKwhkHcN67qbjcD5EMMxTW1OyUt5OY8KP/rvRuUB SoTnSUMwYm9f4a8blISX+vyyOgm0OJqsg0fux715UlOMgBODWzGl/HLqjpyF5vBkJ87F J9sA== X-Forwarded-Encrypted: i=1; AJvYcCWbsUgf+ClrqQUAZvZ0x5ebxLjgNlwIonKkceSGr6ZpkHhtYD3yuSfCoyd4ZELm8iWn+Zg6RZvu16nCeai3Hg+8e293JfEAOxI1FwqSpw== X-Gm-Message-State: AOJu0YwflAU6+1rX8K3P+yNshjSm82mjcE1OtbReypPm4kxd4fCvu4dM c9XOtDqhyU3c9N/r1Twqx70jkqVQvBFxDFTAiHyaq/UW1CuvdoykejOP7kYP X-Google-Smtp-Source: AGHT+IHyVeyKQLMrw5ehmB3osHnB1PgK2aUYiCSDEL5QxnaYpA8Qahb42T8lXWPogY2ESqIHWgrZAw== X-Received: by 2002:a05:6a20:1591:b0:1c4:d267:76ca with SMTP id adf61e73a8af0-1c68d30f598mr1342221637.7.1722496931409; Thu, 01 Aug 2024 00:22:11 -0700 (PDT) Received: from cs20-buildserver.. ([180.217.140.46]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ff4619793bsm22117425ad.120.2024.08.01.00.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Aug 2024 00:22:11 -0700 (PDT) From: Stanley Chu X-Google-Original-From: Stanley Chu To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, linux-i3c@lists.infradead.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, openbmc@lists.ozlabs.org, tomer.maimon@nuvoton.com, kwliu@nuvoton.com, yschu@nuvoton.com, cpchiang1@nuvoton.com Subject: [PATCH v1 2/2] i3c: master: Add Nuvoton npcm845 i3c master driver Date: Thu, 1 Aug 2024 15:19:46 +0800 Message-Id: <20240801071946.43266-3-yschu@nuvoton.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240801071946.43266-1-yschu@nuvoton.com> References: <20240801071946.43266-1-yschu@nuvoton.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240801_002213_307384_95213716 X-CRM114-Status: GOOD ( 19.96 ) X-BeenThere: linux-i3c@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-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org QWRkIHN1cHBvcnQgZm9yIHRoZSBOdXZvdG9uIG5wY204NDUgaTNjIGNvbnRyb2xsZXIgd2hpY2gK aW1wbGVtZW50cyBJM0MgbWFzdGVyIGZ1bmN0aW9uYWxpdHkgYXMgZGVmaW5lZCBpbiB0aGUgTUlQ SQpBbGxpYW5jZSBTcGVjaWZpY2F0aW9uIGZvciBJM0MsIFZlcnNpb24gMS4wLgoKVGhlIG1hc3Rl ciByb2xlIGlzIHN1cHBvcnRlZCBpbiBTRFIgbW9kZSBvbmx5LiBJQkkgYW5kIEhvdC1qb2luCnJl cXVzdHMgYXJlIHN1cHBvcnRlZC4KClNpZ25lZC1vZmYtYnk6IFN0YW5sZXkgQ2h1IDx5c2NodUBu dXZvdG9uLmNvbT4KU2lnbmVkLW9mZi1ieTogSmFtZXMgQ2hpYW5nIDxjcGNoaWFuZzFAbnV2b3Rv bi5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg NyArCiBkcml2ZXJzL2kzYy9tYXN0ZXIvS2NvbmZpZyAgICAgICAgICAgICAgfCAgIDE0ICsKIGRy aXZlcnMvaTNjL21hc3Rlci9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9p M2MvbWFzdGVyL25wY204NDUtaTNjLW1hc3Rlci5jIHwgMjM2NCArKysrKysrKysrKysrKysrKysr KysrKwogNCBmaWxlcyBjaGFuZ2VkLCAyMzg2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2kzYy9tYXN0ZXIvbnBjbTg0NS1pM2MtbWFzdGVyLmMKCmRpZmYgLS1naXQg YS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDQyZGVjZGUzODMyMC4uMmQzMGI2ZTQx OGQ4IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMjY3MCw2 ICsyNjcwLDEzIEBAIEY6CURvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9tZWRpYS9kcml2ZXJz L25wY20tdmlkZW8ucnN0CiBGOglkcml2ZXJzL21lZGlhL3BsYXRmb3JtL251dm90b24vCiBGOglp bmNsdWRlL3VhcGkvbGludXgvbnBjbS12aWRlby5oCiAKK0FSTS9OVVZPVE9OIE5QQ004NDUgSTND IE1BU1RFUiBEUklWRVIKK006CVN0YW5sZXkgQ2h1IDx5c2NodUBudXZvdG9uLmNvbT4KK006CUph bWVzIENoaWFuZyA8Y3BjaGlhbmcxQG51dm90b24uY29tPgorUzoJTWFpbnRhaW5lZAorRjoJRG9j dW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kzYy9udXZvdG9uLGkzYy1tYXN0ZXIueWFt bAorRjoJZHJpdmVycy9pM2MvbWFzdGVyL25wY204NDUtaTNjLW1hc3Rlci5jCisKIEFSTS9OVVZP VE9OIFdQQ000NTAgQVJDSElURUNUVVJFCiBNOglKb25hdGhhbiBOZXVzY2jDpGZlciA8ai5uZXVz Y2hhZWZlckBnbXgubmV0PgogTDoJb3BlbmJtY0BsaXN0cy5vemxhYnMub3JnIChtb2RlcmF0ZWQg Zm9yIG5vbi1zdWJzY3JpYmVycykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTNjL21hc3Rlci9LY29u ZmlnIGIvZHJpdmVycy9pM2MvbWFzdGVyL0tjb25maWcKaW5kZXggOTBkZWUzZWM1NTIwLi5hNzFk NTA0ZDQ3NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTNjL21hc3Rlci9LY29uZmlnCisrKyBiL2Ry aXZlcnMvaTNjL21hc3Rlci9LY29uZmlnCkBAIC00NCw2ICs0NCwyMCBAQCBjb25maWcgU1ZDX0kz Q19NQVNURVIKIAloZWxwCiAJICBTdXBwb3J0IGZvciBTaWx2YWNvIEkzQyBEdWFsLVJvbGUgTWFz dGVyIENvbnRyb2xsZXIuCiAKK2NvbmZpZyBOUENNODQ1X0kzQ19NQVNURVIKKwl0cmlzdGF0ZSAi TnV2b3RvbiBOUENNODQ1IEkzQyBtYXN0ZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gSTNDCisJZGVw ZW5kcyBvbiBIQVNfSU9NRU0KKwlkZXBlbmRzIG9uIEFSQ0hfTlBDTSB8fCBDT01QSUxFX1RFU1QK KwloZWxwCisJICBTdXBwb3J0IGZvciBOdXZvdG9uIE5QQ004NDUgSTNDIE1hc3RlciBDb250cm9s bGVyLgorCisJICBUaGlzIGhhcmR3YXJlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTVkMgSTNDIGNv bnRyb2xsZXI7IHRoaXMKKwkgIGRyaXZlciBhZGRzIHBsYXRmb3JtIHNwZWNpZmljIHN1cHBvcnQg Zm9yIE5QQ004NDUgaGFyZHdhcmUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0 IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5wY204 NDUtaTNjLW1hc3Rlci4KKwogY29uZmlnIE1JUElfSTNDX0hDSQogCXRyaXN0YXRlICJNSVBJIEkz QyBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKIAlkZXBl bmRzIG9uIEkzQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pM2MvbWFzdGVyL01ha2VmaWxlIGIvZHJp dmVycy9pM2MvbWFzdGVyL01ha2VmaWxlCmluZGV4IDNlOTc5NjAxNjBiYy4uM2VkNTUxMTMxOTBh IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kzYy9tYXN0ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9p M2MvbWFzdGVyL01ha2VmaWxlCkBAIC0zLDQgKzMsNSBAQCBvYmotJChDT05GSUdfQ0ROU19JM0Nf TUFTVEVSKQkJKz0gaTNjLW1hc3Rlci1jZG5zLm8KIG9iai0kKENPTkZJR19EV19JM0NfTUFTVEVS KQkJKz0gZHctaTNjLW1hc3Rlci5vCiBvYmotJChDT05GSUdfQVNUMjYwMF9JM0NfTUFTVEVSKQkr PSBhc3QyNjAwLWkzYy1tYXN0ZXIubwogb2JqLSQoQ09ORklHX1NWQ19JM0NfTUFTVEVSKQkJKz0g c3ZjLWkzYy1tYXN0ZXIubworb2JqLSQoQ09ORklHX05QQ004NDVfSTNDX01BU1RFUikJKz0gbnBj bTg0NS1pM2MtbWFzdGVyLm8KIG9iai0kKENPTkZJR19NSVBJX0kzQ19IQ0kpCQkrPSBtaXBpLWkz Yy1oY2kvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kzYy9tYXN0ZXIvbnBjbTg0NS1pM2MtbWFzdGVy LmMgYi9kcml2ZXJzL2kzYy9tYXN0ZXIvbnBjbTg0NS1pM2MtbWFzdGVyLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4xOTY3MmZkYmUyYjgKLS0tIC9kZXYvbnVsbAor KysgYi9kcml2ZXJzL2kzYy9tYXN0ZXIvbnBjbTg0NS1pM2MtbWFzdGVyLmMKQEAgLTAsMCArMSwy MzY0IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIE51dm90 b24gTlBDTTg0NSBJM0MgbWFzdGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBO dXZvdG9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEJhc2VkIG9uIHRoZSB3b3JrIGZyb20gc3ZjIGkz YyBtYXN0ZXIgZHJpdmVyIGFuZCBhZGQgcGxhdGZvcm0KKyAqIHNwZWNpZmljIHN1cHBvcnQgZm9y IHRoZSBOUENNODQ1IGhhcmR3YXJlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5o PgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4K KyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcu aD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5o PgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51 eC9pM2MvbWFzdGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisvKiBNYXN0ZXIgTW9kZSBSZWdpc3Rl cnMgKi8KKyNkZWZpbmUgTlBDTV9JM0NfTUNPTkZJRyAgICAgIDB4MDAwCisjZGVmaW5lICAgTlBD TV9JM0NfTUNPTkZJR19NQVNURVJfRU4gQklUKDApCisjZGVmaW5lICAgTlBDTV9JM0NfTUNPTkZJ R19ESVNUTyh4KSBGSUVMRF9QUkVQKEJJVCgzKSwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01D T05GSUdfSEtFRVAoeCkgRklFTERfUFJFUChHRU5NQVNLKDUsIDQpLCAoeCkpCisjZGVmaW5lICAg TlBDTV9JM0NfTUNPTkZJR19PRFNUT1AoeCkgRklFTERfUFJFUChCSVQoNiksICh4KSkKKyNkZWZp bmUgICBOUENNX0kzQ19NQ09ORklHX1BQQkFVRCh4KSBGSUVMRF9QUkVQKEdFTk1BU0soMTEsIDgp LCAoeCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTUNPTkZJR19QUExPVyh4KSBGSUVMRF9QUkVQKEdF Tk1BU0soMTUsIDEyKSwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01DT05GSUdfT0RCQVVEKHgp IEZJRUxEX1BSRVAoR0VOTUFTSygyMywgMTYpLCAoeCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTUNP TkZJR19PREhQUCh4KSBGSUVMRF9QUkVQKEJJVCgyNCksICh4KSkKKyNkZWZpbmUgICBOUENNX0kz Q19NQ09ORklHX1NLRVcoeCkgRklFTERfUFJFUChHRU5NQVNLKDI3LCAyNSksICh4KSkKKyNkZWZp bmUgICBOUENNX0kzQ19NQ09ORklHX1NLRVdfTUFTSyBHRU5NQVNLKDI3LCAyNSkKKyNkZWZpbmUg ICBOUENNX0kzQ19NQ09ORklHX0kyQ0JBVUQoeCkgRklFTERfUFJFUChHRU5NQVNLKDMxLCAyOCks ICh4KSkKKworI2RlZmluZSBOUENNX0kzQ19NQ1RSTCAgICAgICAgMHgwODQKKyNkZWZpbmUgICBO UENNX0kzQ19NQ1RSTF9SRVFVRVNUX01BU0sgR0VOTUFTSygyLCAwKQorI2RlZmluZSAgIE5QQ01f STNDX01DVFJMX1JFUVVFU1QoeCkgRklFTERfR0VUKEdFTk1BU0soMiwgMCksICh4KSkKKyNkZWZp bmUgICBOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX05PTkUgMAorI2RlZmluZSAgIE5QQ01fSTNDX01D VFJMX1JFUVVFU1RfU1RBUlRfQUREUiAxCisjZGVmaW5lICAgTlBDTV9JM0NfTUNUUkxfUkVRVUVT VF9TVE9QIDIKKyNkZWZpbmUgICBOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX0lCSV9BQ0tOQUNLIDMK KyNkZWZpbmUgICBOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX1BST0NfREFBIDQKKyNkZWZpbmUgICBO UENNX0kzQ19NQ1RSTF9SRVFVRVNUX0ZPUkNFX0VYSVQgNgorI2RlZmluZSAgIE5QQ01fSTNDX01D VFJMX1JFUVVFU1RfQVVUT19JQkkgNworI2RlZmluZSAgIE5QQ01fSTNDX01DVFJMX1RZUEVfSTND IDAKKyNkZWZpbmUgICBOUENNX0kzQ19NQ1RSTF9UWVBFX0kyQyBCSVQoNCkKKyNkZWZpbmUgICBO UENNX0kzQ19NQ1RSTF9JQklSRVNQX0FVVE8gMAorI2RlZmluZSAgIE5QQ01fSTNDX01DVFJMX0lC SVJFU1BfQUNLX1dJVEhPVVRfQllURSAwCisjZGVmaW5lICAgTlBDTV9JM0NfTUNUUkxfSUJJUkVT UF9BQ0tfV0lUSF9CWVRFIEJJVCg3KQorI2RlZmluZSAgIE5QQ01fSTNDX01DVFJMX0lCSVJFU1Bf TkFDSyBCSVQoNikKKyNkZWZpbmUgICBOUENNX0kzQ19NQ1RSTF9JQklSRVNQX01BTlVBTCBHRU5N QVNLKDcsIDYpCisjZGVmaW5lICAgTlBDTV9JM0NfTUNUUkxfRElSKHgpIEZJRUxEX1BSRVAoQklU KDgpLCAoeCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTUNUUkxfRElSX1dSSVRFIDAKKyNkZWZpbmUg ICBOUENNX0kzQ19NQ1RSTF9ESVJfUkVBRCAxCisjZGVmaW5lICAgTlBDTV9JM0NfTUNUUkxfQURE Uih4KSBGSUVMRF9QUkVQKEdFTk1BU0soMTUsIDkpLCAoeCkpCisjZGVmaW5lICAgTlBDTV9JM0Nf TUNUUkxfUkRURVJNKHgpIEZJRUxEX1BSRVAoR0VOTUFTSygyMywgMTYpLCAoeCkpCisKKyNkZWZp bmUgTlBDTV9JM0NfTVNUQVRVUyAgICAgIDB4MDg4CisjZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRV U19TVEFURSh4KSBGSUVMRF9HRVQoR0VOTUFTSygyLCAwKSwgKHgpKQorI2RlZmluZSAgIE5QQ01f STNDX01TVEFUVVNfU1RBVEVfREFBKHgpIChOUENNX0kzQ19NU1RBVFVTX1NUQVRFKHgpID09IDUp CisjZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRVU19TVEFURV9JRExFKHgpIChOUENNX0kzQ19NU1RB VFVTX1NUQVRFKHgpID09IDApCisjZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRVU19TVEFURV9TTFZS RVEoeCkgKE5QQ01fSTNDX01TVEFUVVNfU1RBVEUoeCkgPT0gMSkKKyNkZWZpbmUgICBOUENNX0kz Q19NU1RBVFVTX1NUQVRFX0lCSUFDSyh4KSAoTlBDTV9JM0NfTVNUQVRVU19TVEFURSh4KSA9PSA2 KQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFUVVNfQkVUV0VFTih4KSBGSUVMRF9HRVQoQklUKDQp LCAoeCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRVU19OQUNLRUQoeCkgRklFTERfR0VUKEJJ VCg1KSwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFUVVNfSUJJVFlQRSh4KSBGSUVMRF9H RVQoR0VOTUFTSyg3LCA2KSwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFUVVNfSUJJVFlQ RV9JQkkgMQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFUVVNfSUJJVFlQRV9NQVNURVJfUkVRVUVT VCAyCisjZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRVU19JQklUWVBFX0hPVF9KT0lOIDMKKyNkZWZp bmUgICBOUENNX0kzQ19NSU5UX1NMVlNUQVJUIEJJVCg4KQorI2RlZmluZSAgIE5QQ01fSTNDX01J TlRfTUNUUkxET05FIEJJVCg5KQorI2RlZmluZSAgIE5QQ01fSTNDX01JTlRfQ09NUExFVEUgQklU KDEwKQorI2RlZmluZSAgIE5QQ01fSTNDX01JTlRfUlhQRU5EIEJJVCgxMSkKKyNkZWZpbmUgICBO UENNX0kzQ19NSU5UX1RYTk9URlVMTCBCSVQoMTIpCisjZGVmaW5lICAgTlBDTV9JM0NfTUlOVF9J QklXT04gQklUKDEzKQorI2RlZmluZSAgIE5QQ01fSTNDX01JTlRfRVJSV0FSTiBCSVQoMTUpCisj ZGVmaW5lICAgTlBDTV9JM0NfTVNUQVRVU19TTFZTVEFSVCh4KSBGSUVMRF9HRVQoTlBDTV9JM0Nf TUlOVF9TTFZTVEFSVCwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFUVVNfTUNUUkxET05F KHgpIEZJRUxEX0dFVChOUENNX0kzQ19NSU5UX01DVFJMRE9ORSwgKHgpKQorI2RlZmluZSAgIE5Q Q01fSTNDX01TVEFUVVNfQ09NUExFVEUoeCkgRklFTERfR0VUKE5QQ01fSTNDX01JTlRfQ09NUExF VEUsICh4KSkKKyNkZWZpbmUgICBOUENNX0kzQ19NU1RBVFVTX1JYUEVORCh4KSBGSUVMRF9HRVQo TlBDTV9JM0NfTUlOVF9SWFBFTkQsICh4KSkKKyNkZWZpbmUgICBOUENNX0kzQ19NU1RBVFVTX1RY Tk9URlVMTCh4KSBGSUVMRF9HRVQoTlBDTV9JM0NfTUlOVF9UWE5PVEZVTEwsICh4KSkKKyNkZWZp bmUgICBOUENNX0kzQ19NU1RBVFVTX0lCSVdPTih4KSBGSUVMRF9HRVQoTlBDTV9JM0NfTUlOVF9J QklXT04sICh4KSkKKyNkZWZpbmUgICBOUENNX0kzQ19NU1RBVFVTX0VSUldBUk4oeCkgRklFTERf R0VUKE5QQ01fSTNDX01JTlRfRVJSV0FSTiwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01TVEFU VVNfSUJJQUREUih4KSBGSUVMRF9HRVQoR0VOTUFTSygzMCwgMjQpLCAoeCkpCisKKyNkZWZpbmUg TlBDTV9JM0NfSUJJUlVMRVMgICAgIDB4MDhDCisjZGVmaW5lICAgTlBDTV9JM0NfSUJJUlVMRVNf QUREUihzbG90LCBhZGRyKSBGSUVMRF9QUkVQKEdFTk1BU0soMjksIDApLCBcCisJCQkJCQkgICAg ICAgKChhZGRyKSAmIDB4M0YpIDw8ICgoc2xvdCkgKiA2KSkKKyNkZWZpbmUgICBOUENNX0kzQ19J QklSVUxFU19BRERSUyA1CisjZGVmaW5lICAgTlBDTV9JM0NfSUJJUlVMRVNfTVNCMCBCSVQoMzAp CisjZGVmaW5lICAgTlBDTV9JM0NfSUJJUlVMRVNfTk9CWVRFIEJJVCgzMSkKKyNkZWZpbmUgICBO UENNX0kzQ19JQklSVUxFU19NQU5EQllURSAwCisjZGVmaW5lIE5QQ01fSTNDX01JTlRTRVQgICAg ICAweDA5MAorI2RlZmluZSBOUENNX0kzQ19NSU5UQ0xSICAgICAgMHgwOTQKKyNkZWZpbmUgTlBD TV9JM0NfTUlOVE1BU0tFRCAgIDB4MDk4CisjZGVmaW5lIE5QQ01fSTNDX01FUlJXQVJOICAgICAw eDA5QworI2RlZmluZSAgIE5QQ01fSTNDX01FUlJXQVJOX05BQ0soeCkgRklFTERfR0VUKEJJVCgy KSwgKHgpKQorI2RlZmluZSAgIE5QQ01fSTNDX01FUlJXQVJOX1RJTUVPVVQgQklUKDIwKQorI2Rl ZmluZSAgIE5QQ01fSTNDX01FUlJXQVJOX0hDUkMoeCkgRklFTERfR0VUKEJJVCgxMCksICh4KSkK KyNkZWZpbmUgTlBDTV9JM0NfTURNQUNUUkwgICAgIDB4MEEwCisjZGVmaW5lICAgTlBDTV9JM0Nf TURNQUNUUkxfRE1BRkIoeCkgRklFTERfUFJFUChHRU5NQVNLKDEsIDApLCAoeCkpCisjZGVmaW5l ICAgTlBDTV9JM0NfTURNQUNUUkxfRE1BVEIoeCkgRklFTERfUFJFUChHRU5NQVNLKDMsIDIpLCAo eCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTURNQUNUUkxfRE1BV0lEVEgoeCkgRklFTERfUFJFUChH RU5NQVNLKDUsIDQpLCAoeCkpCisjZGVmaW5lIE5QQ01fSTNDX01EQVRBQ1RSTCAgICAweDBBQwor I2RlZmluZSAgIE5QQ01fSTNDX01EQVRBQ1RSTF9GTFVTSFRCIEJJVCgwKQorI2RlZmluZSAgIE5Q Q01fSTNDX01EQVRBQ1RSTF9GTFVTSFJCIEJJVCgxKQorI2RlZmluZSAgIE5QQ01fSTNDX01EQVRB Q1RSTF9VTkxPQ0tfVFJJRyBCSVQoMykKKyNkZWZpbmUgICBOUENNX0kzQ19NREFUQUNUUkxfVFhU UklHX0ZJRk9fTk9UX0ZVTEwgR0VOTUFTSyg1LCA0KQorI2RlZmluZSAgIE5QQ01fSTNDX01EQVRB Q1RSTF9SWFRSSUdfRklGT19OT1RfRU1QVFkgMAorI2RlZmluZSAgIE5QQ01fSTNDX01EQVRBQ1RS TF9SWENPVU5UKHgpIEZJRUxEX0dFVChHRU5NQVNLKDI4LCAyNCksICh4KSkKKyNkZWZpbmUgICBO UENNX0kzQ19NREFUQUNUUkxfVFhDT1VOVCh4KSBGSUVMRF9HRVQoR0VOTUFTSygyMCwgMTYpLCAo eCkpCisjZGVmaW5lICAgTlBDTV9JM0NfTURBVEFDVFJMX1RYRlVMTCBCSVQoMzApCisjZGVmaW5l ICAgTlBDTV9JM0NfTURBVEFDVFJMX1JYRU1QVFkgQklUKDMxKQorCisjZGVmaW5lIE5QQ01fSTND X01XREFUQUIgICAgICAweDBCMAorI2RlZmluZSAgIE5QQ01fSTNDX01XREFUQUJfRU5EIEJJVCg4 KQorCisjZGVmaW5lIE5QQ01fSTNDX01XREFUQUJFICAgICAweDBCNAorI2RlZmluZSBOUENNX0kz Q19NV0RBVEFIICAgICAgMHgwQjgKKyNkZWZpbmUgTlBDTV9JM0NfTVdEQVRBSEUgICAgIDB4MEJD CisjZGVmaW5lIE5QQ01fSTNDX01SREFUQUIgICAgICAweDBDMAorI2RlZmluZSBOUENNX0kzQ19N UkRBVEFIICAgICAgMHgwQzgKKworI2RlZmluZSBOUENNX0kzQ19NRFlOQUREUiAgICAgMHgwRTQK KyNkZWZpbmUgICBOUENNX01EWU5BRERSX1ZBTElEIEJJVCgwKQorI2RlZmluZSAgIE5QQ01fTURZ TkFERFJfQUREUih4KSBGSUVMRF9QUkVQKEdFTk1BU0soNywgMSksICh4KSkKKworI2RlZmluZSBO UENNX0kzQ19QQVJUTk8gICAgICAgMHgwNkMKKyNkZWZpbmUgTlBDTV9JM0NfVkVORE9SSUQgICAg IDB4MDc0CisjZGVmaW5lICAgTlBDTV9JM0NfVkVORE9SSURfVklEKHgpIEZJRUxEX0dFVChHRU5N QVNLKDE0LCAwKSwgKHgpKQorCisjZGVmaW5lIE5QQ01fSTNDX01BWF9ERVZTIDMyCisjZGVmaW5l IE5QQ01fSTNDX1BNX1RJTUVPVVRfTVMgMTAwMAorCisvKiBUaGlzIHBhcmFtZXRlciBkZXBlbmRz IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgbWF5IGJlIHR1bmVkICovCisjZGVmaW5lIE5QQ01f STNDX0ZJRk9fU0laRSAxNgorI2RlZmluZSBOUENNX0kzQ19NQVhfSUJJX1BBWUxPQURfU0laRSA4 CisjZGVmaW5lIE5QQ01fSTNDX01BWF9SRFRFUk0gMjU1CisjZGVmaW5lIE5QQ01fSTNDX01BWF9Q UEJBVUQgMTUKKyNkZWZpbmUgTlBDTV9JM0NfTUFYX1BQTE9XIDE1CisjZGVmaW5lIE5QQ01fSTND X01BWF9PREJBVUQgMjU1CisjZGVmaW5lIE5QQ01fSTNDX01BWF9JMkNCQVVEIDE1CisjZGVmaW5l IEkzQ19TQ0xfUFBfUEVSSU9EX05TX01JTiA0MAorI2RlZmluZSBJM0NfU0NMX09EX0xPV19QRVJJ T0RfTlNfTUlOIDIwMAorCisvKiBETUEgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUFYX0RNQV9D T1VOVAkJMTAyNAorI2RlZmluZSBETUFfQ0hfVFgJCTAKKyNkZWZpbmUgRE1BX0NIX1JYCQkxCisj ZGVmaW5lIE5QQ01fR0RNQV9DVEwobikJKG4gKiAweDIwICsgMHgwMCkKKyNkZWZpbmUgICBOUENN X0dETUFfQ1RMX0dETUFNUyh4KSBGSUVMRF9QUkVQKEdFTk1BU0soMywgMiksICh4KSkKKyNkZWZp bmUgICBOUENNX0dETUFfQ1RMX1RXUyh4KSBGSUVMRF9QUkVQKEdFTk1BU0soMTMsIDEyKSwgKHgp KQorI2RlZmluZSAgIE5QQ01fR0RNQV9DVExfR0RNQUVOCUJJVCgwKQorI2RlZmluZSAgIE5QQ01f R0RNQV9DVExfREFGSVgJQklUKDYpCisjZGVmaW5lICAgTlBDTV9HRE1BX0NUTF9TQUZJWAlCSVQo NykKKyNkZWZpbmUgICBOUENNX0dETUFfQ1RMX1NJRU4JQklUKDgpCisjZGVmaW5lICAgTlBDTV9H RE1BX0NUTF9ETQlCSVQoMTUpCisjZGVmaW5lICAgTlBDTV9HRE1BX0NUTF9UQwlCSVQoMTgpCisj ZGVmaW5lIE5QQ01fR0RNQV9TUkNCKG4pCShuICogMHgyMCArIDB4MDQpCisjZGVmaW5lIE5QQ01f R0RNQV9EU1RCKG4pCShuICogMHgyMCArIDB4MDgpCisjZGVmaW5lIE5QQ01fR0RNQV9UQ05UKG4p CShuICogMHgyMCArIDB4MEMpCisjZGVmaW5lIE5QQ01fR0RNQV9DU1JDKG4pCShuICogMHgyMCAr IDB4MTApCisjZGVmaW5lIE5QQ01fR0RNQV9DRFNUKG4pCShuICogMHgyMCArIDB4MTQpCisjZGVm aW5lIE5QQ01fR0RNQV9DVENOVChuKQkobiAqIDB4MjAgKyAweDE4KQorI2RlZmluZSBOUENNX0dE TUFfTVVYKG4pCSgoKG4gJiAweEZGRkYpID4+IDEyKSAqIDIgKyA2KQorI2RlZmluZSBHRE1BX0NI MF9FTgkJR0VOTUFTSyg2LCA1KQorI2RlZmluZSBHRE1BX0NIMV9FTgkJR0VOTUFTSygyMiwgMjEp CisKK3N0cnVjdCBucGNtX2kzY19jbWQgeworCXU4IGFkZHI7CisJYm9vbCBybnc7CisJdTggKmlu OworCWNvbnN0IHZvaWQgKm91dDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBy ZWFkX2xlbjsKKwlib29sIGNvbnRpbnVlZDsKKwlib29sIHVzZV9kbWE7Cit9OworCitzdHJ1Y3Qg bnBjbV9pM2NfeGZlciB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBjb21wbGV0 aW9uIGNvbXA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQg bmNtZHM7CisJc3RydWN0IG5wY21faTNjX2NtZCBjbWRzW107Cit9OworCitzdHJ1Y3QgbnBjbV9p M2NfcmVnc19zYXZlIHsKKwl1MzIgbWNvbmZpZzsKKwl1MzIgbWR5bmFkZHI7Cit9OworCitzdHJ1 Y3QgbnBjbV9kbWFfeGZlcl9kZXNjIHsKKwljb25zdCB1OCAqb3V0OworCXU4ICppbjsKKwl1MzIg bGVuOworCWJvb2wgcm53OworCWJvb2wgZW5kOworfTsKKy8qKgorICogc3RydWN0IG5wY21faTNj X21hc3RlciAtIG5wY204NDUgSTNDIE1hc3RlciBzdHJ1Y3R1cmUKKyAqIEBiYXNlOiBJM0MgbWFz dGVyIGNvbnRyb2xsZXIKKyAqIEBkZXY6IENvcnJlc3BvbmRpbmcgZGV2aWNlCisgKiBAcmVnczog TWVtb3J5IG1hcHBpbmcKKyAqIEBzYXZlZF9yZWdzOiBWb2xhdGlsZSB2YWx1ZXMgZm9yIFBNIG9w ZXJhdGlvbnMKKyAqIEBmcmVlX3Nsb3RzOiBCaXQgYXJyYXkgb2YgYXZhaWxhYmxlIHNsb3RzCisg KiBAYWRkcnM6IEFycmF5IGNvbnRhaW5pbmcgdGhlIGR5bmFtaWMgYWRkcmVzc2VzIG9mIGVhY2gg YXR0YWNoZWQgZGV2aWNlCisgKiBAZGVzY3M6IEFycmF5IG9mIGRlc2NyaXB0b3JzLCBvbmUgcGVy IGF0dGFjaGVkIGRldmljZQorICogQGhqX3dvcms6IEhvdC1qb2luIHdvcmsKKyAqIEBpcnE6IE1h aW4gaW50ZXJydXB0CisgKiBAcGNsazogU3lzdGVtIGNsb2NrCisgKiBAZmNsazogRmFzdCBjbG9j ayAoYnVzKQorICogQHNjbGs6IFNsb3cgY2xvY2sgKG90aGVyIGV2ZW50cykKKyAqIEB4ZmVycXVl dWU6IFRyYW5zZmVyIHF1ZXVlIHN0cnVjdHVyZQorICogQHhmZXJxdWV1ZS5saXN0OiBMaXN0IG1l bWJlcgorICogQHhmZXJxdWV1ZS5jdXI6IEN1cnJlbnQgb25nb2luZyB0cmFuc2ZlcgorICogQHhm ZXJxdWV1ZS5sb2NrOiBRdWV1ZSBsb2NrCisgKiBAaWJpOiBJQkkgc3RydWN0dXJlCisgKiBAaWJp Lm51bV9zbG90czogTnVtYmVyIG9mIHNsb3RzIGF2YWlsYWJsZSBpbiBAaWJpLnNsb3RzCisgKiBA aWJpLnNsb3RzOiBBdmFpbGFibGUgSUJJIHNsb3RzCisgKiBAaWJpLnRicV9zbG90OiBUbyBiZSBx dWV1ZWQgSUJJIHNsb3QKKyAqIEBpYmkubG9jazogSUJJIGxvY2sKKyAqIEBsb2NrOiBUcmFuc2Zl ciBsb2NrLCBwcmV2ZW50IGNvbmN1cnJlbnQgZGFhL3ByaXZfeGZlci9jY2MKKyAqIEByZXFfbG9j azogcHJvdGVjdCBiZXR3ZWVuIElCSSBpc3IgYW5kIGJ1cyBvcGVyYXRpb24gcmVxdWVzdAorICov CitzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyIHsKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVy IGJhc2U7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1 Y3QgbnBjbV9pM2NfcmVnc19zYXZlIHNhdmVkX3JlZ3M7CisJdTMyIGZyZWVfc2xvdHM7CisJdTgg YWRkcnNbTlBDTV9JM0NfTUFYX0RFVlNdOworCXN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRlc2NzW05Q Q01fSTNDX01BWF9ERVZTXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaGpfd29yazsKKwlpbnQgaXJx OworCXN0cnVjdCBjbGsgKnBjbGs7CisJc3RydWN0IGNsayAqZmNsazsKKwlzdHJ1Y3QgeworCQl1 MzIgaTNjX3BwX2hpOworCQl1MzIgaTNjX3BwX2xvOworCQl1MzIgaTNjX3BwX3NkYV9yZF9za2V3 OworCQl1MzIgaTNjX3BwX3NkYV93cl9za2V3OworCQl1MzIgaTNjX29kX2hpOworCQl1MzIgaTNj X29kX2xvOworCX0gc2NsX3RpbWluZzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbGlzdF9oZWFkIGxp c3Q7CisJCXN0cnVjdCBucGNtX2kzY194ZmVyICpjdXI7CisJfSB4ZmVycXVldWU7CisJc3RydWN0 IHsKKwkJdW5zaWduZWQgaW50IG51bV9zbG90czsKKwkJc3RydWN0IGkzY19kZXZfZGVzYyAqKnNs b3RzOworCQlzdHJ1Y3QgaTNjX2liaV9zbG90ICp0YnFfc2xvdDsKKwkJLyogUHJldmVudCByYWNl cyB3aXRoaW4gSUJJIGhhbmRsZXJzICovCisJCXNwaW5sb2NrX3QgbG9jazsKKwl9IGliaTsKKwlz cGlubG9ja190IHJlcV9sb2NrOworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBkZW50cnkg KmRlYnVnZnM7CisKKwkvKiBGb3IgRE1BICovCisJdm9pZCBfX2lvbWVtICpkbWFfcmVnczsKKwl2 b2lkIF9faW9tZW0gKmRtYV9jdGxfcmVnczsKKwlib29sIHVzZV9kbWE7CisJc3RydWN0IGNvbXBs ZXRpb24geGZlcl9jb21wOworCWNoYXIgKmRtYV90eF9idWY7CisJY2hhciAqZG1hX3J4X2J1ZjsK KwlkbWFfYWRkcl90IGRtYV90eF9hZGRyOworCWRtYV9hZGRyX3QgZG1hX3J4X2FkZHI7CisJc3Ry dWN0IG5wY21fZG1hX3hmZXJfZGVzYyBkbWFfeGZlcjsKKworCWJvb2wgZW5faGo7Cit9OworCisv KioKKyAqIHN0cnVjdCBucGNtX2kzY19pMmNfZGV2X2RhdGEgLSBEZXZpY2Ugc3BlY2lmaWMgZGF0 YQorICogQGluZGV4OiBJbmRleCBpbiB0aGUgbWFzdGVyIHRhYmxlcyBjb3JyZXNwb25kaW5nIHRv IHRoaXMgZGV2aWNlCisgKiBAaWJpOiBJQkkgc2xvdCBpbmRleCBpbiB0aGUgbWFzdGVyIHN0cnVj dHVyZQorICogQGliaV9wb29sOiBJQkkgcG9vbCBhc3NvY2lhdGVkIHRvIHRoaXMgZGV2aWNlCisg Ki8KK3N0cnVjdCBucGNtX2kzY19pMmNfZGV2X2RhdGEgeworCXU4IGluZGV4OworCWludCBpYmk7 CisJc3RydWN0IGkzY19nZW5lcmljX2liaV9wb29sICppYmlfcG9vbDsKK307CisKK3N0YXRpYyBE RUZJTkVfTVVURVgobnBjbV9pM2NfZG1hX2xvY2spOworCitzdGF0aWMgaW50IG5wY21faTNjX21h c3Rlcl93YWl0X2Zvcl9jb21wbGV0ZShzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIpOwor c3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX3N0b3BfZG1hKHN0cnVjdCBucGNtX2kzY19tYXN0 ZXIgKm1hc3Rlcik7CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9kbWFfbG9jayh2b2lk KQoreworCW11dGV4X2xvY2soJm5wY21faTNjX2RtYV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQg bnBjbV9pM2NfbWFzdGVyX2RtYV91bmxvY2sodm9pZCkKK3sKKwltdXRleF91bmxvY2soJm5wY21f aTNjX2RtYV9sb2NrKTsKK30KKworc3RhdGljIGJvb2wgbnBjbV9pM2NfbWFzdGVyX2Vycm9yKHN0 cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikKK3sKKwl1MzIgbXN0YXR1cywgbWVycndhcm47 CisKKwltc3RhdHVzID0gcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisJ aWYgKE5QQ01fSTNDX01TVEFUVVNfRVJSV0FSTihtc3RhdHVzKSkgeworCQltZXJyd2FybiA9IHJl YWRsKG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01FUlJXQVJOKTsKKwkJd3JpdGVsKG1lcnJ3YXJu LCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NRVJSV0FSTik7CisKKwkJLyogSWdub3JlIHRpbWVv dXQgZXJyb3IgKi8KKwkJaWYgKG1lcnJ3YXJuICYgTlBDTV9JM0NfTUVSUldBUk5fVElNRU9VVCkg eworCQkJZGV2X2RiZyhtYXN0ZXItPmRldiwgIldhcm5pbmcgY29uZGl0aW9uOiBNU1RBVFVTIDB4 JTA4eCwgTUVSUldBUk4gMHglMDh4XG4iLAorCQkJCW1zdGF0dXMsIG1lcnJ3YXJuKTsKKwkJCXJl dHVybiBmYWxzZTsKKwkJfQorCisJCWRldl9lcnIobWFzdGVyLT5kZXYsCisJCQkiRXJyb3IgY29u ZGl0aW9uOiBNU1RBVFVTIDB4JTA4eCwgTUVSUldBUk4gMHglMDh4XG4iLAorCQkJbXN0YXR1cywg bWVycndhcm4pOworCisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwor c3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX3NldF9zZGFfc2tldyhzdHJ1Y3QgbnBjbV9pM2Nf bWFzdGVyICptYXN0ZXIsIGludCBza2V3KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbCht YXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NQ09ORklHKSAmIH5OUENNX0kzQ19NQ09ORklHX1NLRVdf TUFTSzsKKwl2YWwgfD0gTlBDTV9JM0NfTUNPTkZJR19TS0VXKHNrZXcpOworCXdyaXRlbCh2YWws IG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01DT05GSUcpOworfQorCitzdGF0aWMgdm9pZCBucGNt X2kzY19tYXN0ZXJfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFz dGVyLCB1MzIgbWFzaykKK3sKKwl3cml0ZWwobWFzaywgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0Nf TUlOVFNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9kaXNhYmxlX2ludGVy cnVwdHMoc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyKQoreworCXUzMiBtYXNrID0gcmVh ZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTUlOVFNFVCk7CisKKwl3cml0ZWwobWFzaywgbWFz dGVyLT5yZWdzICsgTlBDTV9JM0NfTUlOVENMUik7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNj X21hc3Rlcl9jbGVhcl9tZXJyd2FybihzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIpCit7 CisJLyogQ2xlYXIgcGVuZGluZyB3YXJuaW5ncyAqLworCXdyaXRlbChyZWFkbChtYXN0ZXItPnJl Z3MgKyBOUENNX0kzQ19NRVJSV0FSTiksCisJICAgICAgIG1hc3Rlci0+cmVncyArIE5QQ01fSTND X01FUlJXQVJOKTsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX2ZsdXNoX2ZpZm8o c3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyKQoreworCS8qIEZsdXNoIEZJRk9zICovCisJ d3JpdGVsKE5QQ01fSTNDX01EQVRBQ1RSTF9GTFVTSFRCIHwgTlBDTV9JM0NfTURBVEFDVFJMX0ZM VVNIUkIsCisJICAgICAgIG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRBQ1RSTCk7Cit9CisK K3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9mbHVzaF9yeF9maWZvKHN0cnVjdCBucGNtX2kz Y19tYXN0ZXIgKm1hc3RlcikKK3sKKwl3cml0ZWwoTlBDTV9JM0NfTURBVEFDVFJMX0ZMVVNIUkIs IG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRBQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIG5w Y21faTNjX21hc3Rlcl9yZXNldF9maWZvX3RyaWdnZXIoc3RydWN0IG5wY21faTNjX21hc3RlciAq bWFzdGVyKQoreworCXUzMiByZWc7CisKKwkvKiBTZXQgUlggYW5kIFRYIHRpZ2dlciBsZXZlbHMs IGZsdXNoIEZJRk9zICovCisJcmVnID0gTlBDTV9JM0NfTURBVEFDVFJMX0ZMVVNIVEIgfAorCSAg ICAgIE5QQ01fSTNDX01EQVRBQ1RSTF9GTFVTSFJCIHwKKwkgICAgICBOUENNX0kzQ19NREFUQUNU UkxfVU5MT0NLX1RSSUcgfAorCSAgICAgIE5QQ01fSTNDX01EQVRBQ1RSTF9UWFRSSUdfRklGT19O T1RfRlVMTCB8CisJICAgICAgTlBDTV9JM0NfTURBVEFDVFJMX1JYVFJJR19GSUZPX05PVF9FTVBU WTsKKwl3cml0ZWwocmVnLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NREFUQUNUUkwpOworfQor CitzdGF0aWMgdm9pZCBucGNtX2kzY19tYXN0ZXJfcmVzZXQoc3RydWN0IG5wY21faTNjX21hc3Rl ciAqbWFzdGVyKQoreworCW5wY21faTNjX21hc3Rlcl9jbGVhcl9tZXJyd2FybihtYXN0ZXIpOwor CW5wY21faTNjX21hc3Rlcl9yZXNldF9maWZvX3RyaWdnZXIobWFzdGVyKTsKKwlucGNtX2kzY19t YXN0ZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKG1hc3Rlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IG5wY21faTNjX21hc3RlciAqCit0b19ucGNtX2kzY19tYXN0ZXIoc3RydWN0IGkzY19tYXN0 ZXJfY29udHJvbGxlciAqbWFzdGVyKQoreworCXJldHVybiBjb250YWluZXJfb2YobWFzdGVyLCBz dHJ1Y3QgbnBjbV9pM2NfbWFzdGVyLCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2Nf bWFzdGVyX2hqX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBucGNt X2kzY19tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1 Y3QgbnBjbV9pM2NfbWFzdGVyLCBoal93b3JrKTsKKworCWkzY19tYXN0ZXJfZG9fZGFhKCZtYXN0 ZXItPmJhc2UpOworfQorCitzdGF0aWMgc3RydWN0IGkzY19kZXZfZGVzYyAqCitucGNtX2kzY19t YXN0ZXJfZGV2X2Zyb21fYWRkcihzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsCisJCQkg ICAgIHVuc2lnbmVkIGludCBpYmlhZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8 IE5QQ01fSTNDX01BWF9ERVZTOyBpKyspCisJCWlmIChtYXN0ZXItPmFkZHJzW2ldID09IGliaWFk ZHIpCisJCQlicmVhazsKKworCWlmIChpID09IE5QQ01fSTNDX01BWF9ERVZTKQorCQlyZXR1cm4g TlVMTDsKKworCXJldHVybiBtYXN0ZXItPmRlc2NzW2ldOworfQorCitzdGF0aWMgdm9pZCBucGNt X2kzY19tYXN0ZXJfYWNrX2liaShzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsCisJCQkJ ICAgYm9vbCBtYW5kYXRvcnlfYnl0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaWJpX2Fja19uYWNrOwor CXUzMiByZWc7CisKKwlpYmlfYWNrX25hY2sgPSBOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX0lCSV9B Q0tOQUNLOworCWlmIChtYW5kYXRvcnlfYnl0ZSkKKwkJaWJpX2Fja19uYWNrIHw9IE5QQ01fSTND X01DVFJMX0lCSVJFU1BfQUNLX1dJVEhfQllURSB8CisJCQlOUENNX0kzQ19NQ1RSTF9SRFRFUk0o TlBDTV9JM0NfTUFYX0lCSV9QQVlMT0FEX1NJWkUpOworCWVsc2UKKwkJaWJpX2Fja19uYWNrIHw9 IE5QQ01fSTNDX01DVFJMX0lCSVJFU1BfQUNLX1dJVEhPVVRfQllURTsKKworCXdyaXRlbChpYmlf YWNrX25hY2ssIG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01DVFJMKTsKKwlyZWFkbF9wb2xsX3Rp bWVvdXQobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUywgcmVnLAorCQkJICAgTlBDTV9J M0NfTVNUQVRVU19NQ1RSTERPTkUocmVnKSwgMCwgMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG5w Y21faTNjX21hc3Rlcl9uYWNrX2liaShzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIpCit7 CisJdTMyIHJlZzsKKworCXdyaXRlbChOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX0lCSV9BQ0tOQUNL IHwKKwkgICAgICAgTlBDTV9JM0NfTUNUUkxfSUJJUkVTUF9OQUNLLAorCSAgICAgICBtYXN0ZXIt PnJlZ3MgKyBOUENNX0kzQ19NQ1RSTCk7CisJcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVn cyArIE5QQ01fSTNDX01TVEFUVVMsIHJlZywKKwkJCSAgIE5QQ01fSTNDX01TVEFUVVNfTUNUUkxE T05FKHJlZyksIDAsIDEwMDApOworfQorCitzdGF0aWMgdm9pZCBucGNtX2kzY19tYXN0ZXJfZW1p dF9zdG9wKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikKK3sKKwl1MzIgcmVnID0gcmVh ZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisKKwkvKiBEbyBub3QgZW1pdCBz dG9wIGluIHRoZSBJRExFIG9yIFNMVlJFUSBzdGF0ZSAqLworCWlmIChOUENNX0kzQ19NU1RBVFVT X1NUQVRFX0lETEUocmVnKSB8fCBOUENNX0kzQ19NU1RBVFVTX1NUQVRFX1NMVlJFUShyZWcpKQor CQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBzcHVyaW91cyBJQkkgZXZlbnQgbWF5IGNoYW5nZSBj b250cm9sbGVyIHN0YXRlIHRvIElCSUFDSywgc3dpdGNoIHN0YXRlCisJICogdG8gTk9STUFDVCBi ZWZvcmUgZW1pdFNUT1AgcmVxdWVzdC4KKwkgKi8KKwlpZiAoTlBDTV9JM0NfTVNUQVRVU19TVEFU RV9JQklBQ0socmVnKSkgeworCQlucGNtX2kzY19tYXN0ZXJfbmFja19pYmkobWFzdGVyKTsKKwkJ d3JpdGVsKE5QQ01fSTNDX01JTlRfSUJJV09OLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RB VFVTKTsKKwl9CisKKwl3cml0ZWwoTlBDTV9JM0NfTUNUUkxfUkVRVUVTVF9TVE9QLCBtYXN0ZXIt PnJlZ3MgKyBOUENNX0kzQ19NQ1RSTCk7CisJcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVn cyArIE5QQ01fSTNDX01TVEFUVVMsIHJlZywKKwkJCSAgIE5QQ01fSTNDX01TVEFUVVNfTUNUUkxE T05FKHJlZyksIDAsIDEwMDApOworCisJLyoKKwkgKiBUaGlzIGRlbGF5IGlzIG5lY2Vzc2FyeSBh ZnRlciB0aGUgZW1pc3Npb24gb2YgYSBzdG9wLCBvdGhlcndpc2UgZWcuCisJICogcmVwZWF0aW5n IElCSXMgZG8gbm90IGdldCBkZXRlY3RlZC4gVGhlcmUgaXMgYSBub3RlIGluIHRoZSBtYW51YWwK KwkgKiBhYm91dCBpdCwgc3RhdGluZyB0aGF0IHRoZSBzdG9wIGNvbmRpdGlvbiBtaWdodCBub3Qg YmUgc2V0dGxlZAorCSAqIGNvcnJlY3RseSBpZiBhIHN0YXJ0IGNvbmRpdGlvbiBmb2xsb3dzIHRv byByYXBpZGx5LgorCSAqLworCXVkZWxheSgxKTsKK30KKworc3RhdGljIGludCBucGNtX2kzY19t YXN0ZXJfaGFuZGxlX2liaShzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsCisJCQkJICAg ICBzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYpCit7CisJc3RydWN0IG5wY21faTNjX2kyY19kZXZf ZGF0YSAqZGF0YSA9IGkzY19kZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7CisJc3RydWN0IGkzY19p Ymlfc2xvdCAqc2xvdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdTMyIG1kYXRhY3RybCwgdmFs OworCWludCByZXQ7CisJdTggKmJ1ZjsKKworCWlmICghZGF0YSkgeworCQlkZXZfZXJyX3JhdGVs aW1pdGVkKG1hc3Rlci0+ZGV2LCAiTm8gZGF0YSBmb3IgYWRkciAweCV4XG4iLAorCQkJZGV2LT5p bmZvLmR5bl9hZGRyKTsKKwkJZ290byBub19pYmlfcG9vbDsKKwl9CisKKwlpZiAoIWRhdGEtPmli aV9wb29sKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobWFzdGVyLT5kZXYsICJObyBpYmkgcG9v bCBmb3IgYWRkciAweCV4XG4iLAorCQkJbWFzdGVyLT5hZGRyc1tkYXRhLT5pbmRleF0pOworCQln b3RvIG5vX2liaV9wb29sOworCX0KKwlzbG90ID0gaTNjX2dlbmVyaWNfaWJpX2dldF9mcmVlX3Ns b3QoZGF0YS0+aWJpX3Bvb2wpOworCWlmICghc2xvdCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVk KG1hc3Rlci0+ZGV2LCAiTm8gZnJlZSBpYmkgc2xvdFxuIik7CisJCWdvdG8gbm9faWJpX3Bvb2w7 CisJfQorCisJc2xvdC0+bGVuID0gMDsKKwlidWYgPSBzbG90LT5kYXRhOworCisJLyoKKwkgKiBT b21ldGltZXMgSTNDIEhXIHJldHVybnMgdG8gSURMRSBzdGF0ZSBhZnRlciBJQklSQ1YgY29tcGxl dGVkLAorCSAqIGNvbnRpbnVlIHdoZW4gc3RhdGUgYmVjb21lcyBJRExFLgorCSAqLworCXJldCA9 IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01TVEFU VVMsIHZhbCwKKwkJCQkJIE5QQ01fSTNDX01TVEFUVVNfQ09NUExFVEUodmFsKSB8CisJCQkJCSBO UENNX0kzQ19NU1RBVFVTX1NUQVRFX0lETEUodmFsKSwKKwkJCQkJIDAsIDEwMDApOworCWlmIChy ZXQpIHsKKwkJZGV2X2VycihtYXN0ZXItPmRldiwgIlRpbWVvdXQgd2hlbiBwb2xsaW5nIGZvciBD T01QTEVURVxuIik7CisJCWlmIChOUENNX0kzQ19NU1RBVFVTX1JYUEVORCh2YWwpKQorCQkJbnBj bV9pM2NfbWFzdGVyX2ZsdXNoX3J4X2ZpZm8obWFzdGVyKTsKKwkJaTNjX2dlbmVyaWNfaWJpX3Jl Y3ljbGVfc2xvdChkYXRhLT5pYmlfcG9vbCwgc2xvdCk7CisJCXNsb3QgPSBOVUxMOworCQlnb3Rv IGhhbmRsZV9kb25lOworCX0KKworCXdoaWxlIChOUENNX0kzQ19NU1RBVFVTX1JYUEVORChyZWFk bChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKSkgICYmCisJICAgICAgIHNsb3QtPmxl biA8IE5QQ01fSTNDX01BWF9JQklfUEFZTE9BRF9TSVpFKSB7CisJCW1kYXRhY3RybCA9IHJlYWRs KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRBQ1RSTCk7CisJCWNvdW50ID0gTlBDTV9JM0Nf TURBVEFDVFJMX1JYQ09VTlQobWRhdGFjdHJsKTsKKwkJcmVhZHNiKG1hc3Rlci0+cmVncyArIE5Q Q01fSTNDX01SREFUQUIsIGJ1ZiwgY291bnQpOworCQlzbG90LT5sZW4gKz0gY291bnQ7CisJCWJ1 ZiArPSBjb3VudDsKKwl9CisKK2hhbmRsZV9kb25lOgorCW1hc3Rlci0+aWJpLnRicV9zbG90ID0g c2xvdDsKKworCXJldHVybiByZXQ7CisKK25vX2liaV9wb29sOgorCS8qIE5vIGliaSBwb29sLCBk cm9wIHRoZSBwYXlsb2FkIGlmIHJlY2VpdmVkICAqLworCXJlYWRsX3JlbGF4ZWRfcG9sbF90aW1l b3V0KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01TVEFUVVMsIHZhbCwKKwkJCQkgICBOUENNX0kz Q19NU1RBVFVTX0NPTVBMRVRFKHZhbCkgfAorCQkJCSAgIE5QQ01fSTNDX01TVEFUVVNfU1RBVEVf SURMRSh2YWwpLAorCQkJCSAgIDAsIDEwMDApOworCW5wY21faTNjX21hc3Rlcl9mbHVzaF9yeF9m aWZvKG1hc3Rlcik7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbnQgbnBjbV9pM2Nf bWFzdGVyX2hhbmRsZV9pYml3b24oc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyLCBib29s IGF1dG9pYmkpCit7CisJc3RydWN0IG5wY21faTNjX2kyY19kZXZfZGF0YSAqZGF0YTsKKwl1bnNp Z25lZCBpbnQgaWJpdHlwZSwgaWJpYWRkcjsKKwlzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXY7CisJ dTMyIHN0YXR1czsKKwlpbnQgcmV0ID0gMDsKKworCXN0YXR1cyA9IHJlYWRsKG1hc3Rlci0+cmVn cyArIE5QQ01fSTNDX01TVEFUVVMpOworCWliaXR5cGUgPSBOUENNX0kzQ19NU1RBVFVTX0lCSVRZ UEUoc3RhdHVzKTsKKwlpYmlhZGRyID0gTlBDTV9JM0NfTVNUQVRVU19JQklBRERSKHN0YXR1cyk7 CisKKwlkZXZfZGJnKG1hc3Rlci0+ZGV2LCAiaWJpdHlwZT0lZCBpYmlhZGRyPSVkXG4iLCBpYml0 eXBlLCBpYmlhZGRyKTsKKwlkZXZfZGJnKG1hc3Rlci0+ZGV2LCAiaWJpd29uOiBtY3RybD0weCV4 IG1zdGF0dXM9MHgleFxuIiwKKwkJcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTUNUUkwp LCBzdGF0dXMpOworCS8qIEhhbmRsZSB0aGUgY3JpdGljYWwgcmVzcG9uc2VzIHRvIElCSSdzICov CisJc3dpdGNoIChpYml0eXBlKSB7CisJY2FzZSBOUENNX0kzQ19NU1RBVFVTX0lCSVRZUEVfSUJJ OgorCQlkZXYgPSBucGNtX2kzY19tYXN0ZXJfZGV2X2Zyb21fYWRkcihtYXN0ZXIsIGliaWFkZHIp OworCQkvKiBCeXBhc3MgdGhlIGludmFsaWQgaWJpIHdpdGggYWRkcmVzcyAwICovCisJCWlmICgh ZGV2IHx8IGliaWFkZHIgPT0gMCkgeworCQkJaWYgKCFhdXRvaWJpKSB7CisJCQkJbnBjbV9pM2Nf bWFzdGVyX25hY2tfaWJpKG1hc3Rlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICog V2FpdCBmb3IgY29tcGxldGUgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGVtaXRTVE9QCisJ CQkgKiByZXF1ZXN0IHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBjb3JyZWN0IHN0YXRlKE5PUk1B Q1QpLgorCQkJICovCisJCQlyZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dChtYXN0ZXItPnJlZ3Mg KyBOUENNX0kzQ19NU1RBVFVTLCBzdGF0dXMsCisJCQkJCQkgICBOUENNX0kzQ19NU1RBVFVTX0NP TVBMRVRFKHN0YXR1cyksCisJCQkJCQkgICAwLCAxMDAwKTsKKwkJCS8qIEZsdXNoIHRoZSBnYXJi YWdlIGRhdGEgKi8KKwkJCWlmIChOUENNX0kzQ19NU1RBVFVTX1JYUEVORChzdGF0dXMpKQorCQkJ CW5wY21faTNjX21hc3Rlcl9mbHVzaF9yeF9maWZvKG1hc3Rlcik7CisJCQlicmVhazsKKwkJfQor CQlpZiAoIWF1dG9pYmkpIHsKKwkJCWlmIChkZXYtPmluZm8uYmNyICYgSTNDX0JDUl9JQklfUEFZ TE9BRCkKKwkJCQlucGNtX2kzY19tYXN0ZXJfYWNrX2liaShtYXN0ZXIsIHRydWUpOworCQkJZWxz ZQorCQkJCW5wY21faTNjX21hc3Rlcl9hY2tfaWJpKG1hc3RlciwgZmFsc2UpOworCQl9CisJCW5w Y21faTNjX21hc3Rlcl9oYW5kbGVfaWJpKG1hc3RlciwgZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBO UENNX0kzQ19NU1RBVFVTX0lCSVRZUEVfSE9UX0pPSU46CisJCW5wY21faTNjX21hc3Rlcl9hY2tf aWJpKG1hc3RlciwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE5QQ01fSTNDX01TVEFUVVNfSUJJ VFlQRV9NQVNURVJfUkVRVUVTVDoKKwkJbnBjbV9pM2NfbWFzdGVyX25hY2tfaWJpKG1hc3Rlcik7 CisJCXN0YXR1cyA9IHJlYWRsKG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01TVEFUVVMpOworCQkv KiBJbnZhbGlkIGV2ZW50IG1heSBiZSByZXBvcnRlZCBhcyBNUiByZXF1ZXN0CisJCSAqIGFuZCBz b21ldGltZXMgcHJvZHVjZSBkdW1teSBieXRlcy4gRmx1c2ggdGhlIGdhcmJhZ2UgZGF0YS4KKwkJ ICovCisJCWlmIChOUENNX0kzQ19NU1RBVFVTX1JYUEVORChzdGF0dXMpKQorCQkJbnBjbV9pM2Nf bWFzdGVyX2ZsdXNoX3J4X2ZpZm8obWFzdGVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJl YWs7CisJfQorCisJLyoKKwkgKiBJZiBhbiBlcnJvciBoYXBwZW5lZCwgd2UgcHJvYmFibHkgZ290 IGludGVycnVwdGVkIGFuZCB0aGUgZXhjaGFuZ2UKKwkgKiB0aW1lZG91dC4gSW4gdGhpcyBjYXNl IHdlIGp1c3QgZHJvcCBldmVyeXRoaW5nLCBlbWl0IGEgc3RvcCBhbmQgd2FpdAorCSAqIGZvciB0 aGUgc2xhdmUgdG8gaW50ZXJydXB0IGFnYWluLgorCSAqLworCWlmIChucGNtX2kzY19tYXN0ZXJf ZXJyb3IobWFzdGVyKSkgeworCQlpZiAobWFzdGVyLT5pYmkudGJxX3Nsb3QpIHsKKwkJCWRhdGEg PSBpM2NfZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYpOworCQkJaTNjX2dlbmVyaWNfaWJpX3JlY3lj bGVfc2xvdChkYXRhLT5pYmlfcG9vbCwKKwkJCQkJCSAgICAgbWFzdGVyLT5pYmkudGJxX3Nsb3Qp OworCQkJbWFzdGVyLT5pYmkudGJxX3Nsb3QgPSBOVUxMOworCQl9CisKKwkJZGV2X2VycihtYXN0 ZXItPmRldiwgIm5wY21faTNjX21hc3Rlcl9lcnJvciBpbiBpYml3b25cbiIpOworCQkvKgorCQkg KiBObyBuZWVkIHRvIGVtaXQgc3RvcCBoZXJlIGJlY2F1c2UgdGhlIGNhbGxlciBzaG91bGQgZG8g aXQKKwkJICogaWYgcmV0dXJuIGVycm9yCisJCSAqLworCQlyZXQgPSAtRUlPOworCQlnb3RvIGNs ZWFyX2liaXdvbjsKKwl9CisKKwkvKiBIYW5kbGUgdGhlIG5vbiBjcml0aWNhbCB0YXNrcyAqLwor CXN3aXRjaCAoaWJpdHlwZSkgeworCWNhc2UgTlBDTV9JM0NfTVNUQVRVU19JQklUWVBFX0lCSToK KwkJbnBjbV9pM2NfbWFzdGVyX2VtaXRfc3RvcChtYXN0ZXIpOworCQlpZiAoZGV2ICYmIG1hc3Rl ci0+aWJpLnRicV9zbG90KSB7CisJCQlpM2NfbWFzdGVyX3F1ZXVlX2liaShkZXYsIG1hc3Rlci0+ aWJpLnRicV9zbG90KTsKKwkJCW1hc3Rlci0+aWJpLnRicV9zbG90ID0gTlVMTDsKKwkJfQorCQli cmVhazsKKwljYXNlIE5QQ01fSTNDX01TVEFUVVNfSUJJVFlQRV9IT1RfSk9JTjoKKwkJLyogRW1p dCBzdG9wIHRvIGF2b2lkIHRoZSBJTlZSRVEgZXJyb3IgYWZ0ZXIgREFBIHByb2Nlc3MgKi8KKwkJ bnBjbV9pM2NfbWFzdGVyX2VtaXRfc3RvcChtYXN0ZXIpOworCQlxdWV1ZV93b3JrKG1hc3Rlci0+ YmFzZS53cSwgJm1hc3Rlci0+aGpfd29yayk7CisJCWJyZWFrOworCWNhc2UgTlBDTV9JM0NfTVNU QVRVU19JQklUWVBFX01BU1RFUl9SRVFVRVNUOgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwlkZWZh dWx0OgorCQlicmVhazsKKwl9CisKK2NsZWFyX2liaXdvbjoKKwkvKiBjbGVhciBJQklXT04gc3Rh dHVzICovCisJd3JpdGVsKE5QQ01fSTNDX01JTlRfSUJJV09OLCBtYXN0ZXItPnJlZ3MgKyBOUENN X0kzQ19NU1RBVFVTKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBucGNtX2kzY19t YXN0ZXJfaWJpX2lzcihzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIpCit7CisJdTMyIHZh bCwgbXN0YXR1czsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZtYXN0ZXItPnJlcV9sb2NrKTsK KworCS8qIENoZWNrIHNsYXZlIGliaSBoYW5kbGVkIG5vdCB5ZXQgKi8KKwltc3RhdHVzID0gcmVh ZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisJaWYgKCFOUENNX0kzQ19NU1RB VFVTX1NUQVRFX1NMVlJFUShtc3RhdHVzKSkKKwkJZ290byBpYmlfb3V0OworCisJLyoKKwkgKiBJ QklXT04gbWF5IGJlIHNldCBiZWZvcmUgTlBDTV9JM0NfTUNUUkxfUkVRVUVTVF9BVVRPX0lCSSwg Y2F1c2luZworCSAqIHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KCkgdG8gcmV0dXJuIGltbWVk aWF0ZWx5LiBDb25zZXF1ZW50bHksCisJICogaWJpdHlwZSB3aWxsIGJlIDAgc2luY2UgaXQgd2Fz IGxhc3QgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZSA4dGggU0NMCisJICogY3ljbGUsIGxlYWRpbmcg dG8gbWlzc2VkIGNsaWVudCBJQkkgaGFuZGxlcnMuCisJICoKKwkgKiBDbGVhciBOUENNX0kzQ19N SU5UX0lCSVdPTiBiZWZvcmUgc2VuZGluZyBOUENNX0kzQ19NQ1RSTF9SRVFVRVNUX0FVVE9fSUJJ LgorCSAqLworCXdyaXRlbChOUENNX0kzQ19NSU5UX0lCSVdPTiwgbWFzdGVyLT5yZWdzICsgTlBD TV9JM0NfTVNUQVRVUyk7CisKKwkvKiBBY2tub3dsZWRnZSB0aGUgaW5jb21pbmcgaW50ZXJydXB0 IHdpdGggdGhlIEFVVE9JQkkgbWVjaGFuaXNtICovCisJd3JpdGVsKE5QQ01fSTNDX01DVFJMX1JF UVVFU1RfQVVUT19JQkkgfAorCSAgICAgICBOUENNX0kzQ19NQ1RSTF9JQklSRVNQX0FVVE8gfAor CSAgICAgICBOUENNX0kzQ19NQ1RSTF9SRFRFUk0oTlBDTV9JM0NfTUFYX0lCSV9QQVlMT0FEX1NJ WkUpLAorCSAgICAgICBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NQ1RSTCk7CisKKwkvKiBXYWl0 IGZvciBJQklXT04sIHNob3VsZCB0YWtlIGFwcHJveGltYXRlbHkgMTAwdXMgKi8KKwlyZXQgPSBy ZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dF9hdG9taWMobWFzdGVyLT5yZWdzICsgTlBDTV9JM0Nf TVNUQVRVUywgdmFsLAorCQkJCQkgTlBDTV9JM0NfTVNUQVRVU19JQklXT04odmFsKSwgMCwgMTAw MCk7CisJaWYgKHJldCkgeworCQkvKiBDYW5jZWwgQVVUT0lCSSBpZiBub3Qgc3RhcnRlZCAqLwor CQl2YWwgPSByZWFkbChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NQ1RSTCk7CisJCWlmIChOUENN X0kzQ19NQ1RSTF9SRVFVRVNUKHZhbCkgPT0gTlBDTV9JM0NfTUNUUkxfUkVRVUVTVF9BVVRPX0lC SSkKKwkJCXdyaXRlbCgwLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NQ1RSTCk7CisJCWRldl9l cnIobWFzdGVyLT5kZXYsICJUaW1lb3V0IHdoZW4gcG9sbGluZyBmb3IgSUJJV09OXG4iKTsKKwkJ bnBjbV9pM2NfbWFzdGVyX2NsZWFyX21lcnJ3YXJuKG1hc3Rlcik7CisJCW5wY21faTNjX21hc3Rl cl9lbWl0X3N0b3AobWFzdGVyKTsKKwkJZ290byBpYmlfb3V0OworCX0KKworCWlmIChucGNtX2kz Y19tYXN0ZXJfaGFuZGxlX2liaXdvbihtYXN0ZXIsIHRydWUpKQorCQlucGNtX2kzY19tYXN0ZXJf ZW1pdF9zdG9wKG1hc3Rlcik7CitpYmlfb3V0OgorCXNwaW5fdW5sb2NrKCZtYXN0ZXItPnJlcV9s b2NrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG5wY21faTNjX21hc3Rlcl9pcnFfaGFuZGxl cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFz dGVyID0gKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKilkZXZfaWQ7CisJdTMyIGFjdGl2ZSA9IHJl YWRsKG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01JTlRNQVNLRUQpLCBtc3RhdHVzOworCisJaWYg KE5QQ01fSTNDX01TVEFUVVNfQ09NUExFVEUoYWN0aXZlKSkgeworCQkvKiBDbGVhciBDT01QTEVU RSBzdGF0dXMgYmVmb3JlIGVtaXQgU1RPUCAqLworCQl3cml0ZWwoTlBDTV9JM0NfTUlOVF9DT01Q TEVURSwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisJCS8qIERpc2FibGUgQ09N UExFVEUgaW50ZXJydXB0ICovCisJCXdyaXRlbChOUENNX0kzQ19NSU5UX0NPTVBMRVRFLCBtYXN0 ZXItPnJlZ3MgKyBOUENNX0kzQ19NSU5UQ0xSKTsKKworCQlpZiAobWFzdGVyLT5kbWFfeGZlci5l bmQpIHsKKwkJCS8qIFN0b3AgRE1BIHRvIHByZXZlbnQgcmVjZWl2aW5nIHRoZSBkYXRhIG9mIG90 aGVyIHRyYW5zYWN0aW9uICovCisJCQlucGNtX2kzY19tYXN0ZXJfc3RvcF9kbWEobWFzdGVyKTsK KwkJCW5wY21faTNjX21hc3Rlcl9zZXRfc2RhX3NrZXcobWFzdGVyLCAwKTsKKwkJCW5wY21faTNj X21hc3Rlcl9lbWl0X3N0b3AobWFzdGVyKTsKKwkJfQorCisJCWNvbXBsZXRlKCZtYXN0ZXItPnhm ZXJfY29tcCk7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChOUENNX0kzQ19N U1RBVFVTX1NMVlNUQVJUKGFjdGl2ZSkpIHsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0 dXMgKi8KKwkJd3JpdGVsKE5QQ01fSTNDX01JTlRfU0xWU1RBUlQsIG1hc3Rlci0+cmVncyArIE5Q Q01fSTNDX01TVEFUVVMpOworCisJCS8qIFJlYWQgSTNDIHN0YXRlICovCisJCW1zdGF0dXMgPSBy ZWFkbChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKTsKKworCQlpZiAoTlBDTV9JM0Nf TVNUQVRVU19TVEFURV9TTFZSRVEobXN0YXR1cykpIHsKKwkJCW5wY21faTNjX21hc3Rlcl9pYmlf aXNyKG1hc3Rlcik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV29ya2Fyb3VuZDoKKwkJCSAq IFNsYXZlU3RhcnQgZXZlbnQgdW5kZXIgYmFkIHNpZ25hbHMgY29uZGl0aW9uLiBTTFZTVEFSVCBi aXQgaW4KKwkJCSAqIE1TVEFUVVMgbWF5IHNldCBldmVuIHNsYXZlIGRldmljZSBkb2Vzbid0IGhv bGRpbmcgSTNDX1NEQSBsb3csCisJCQkgKiBidXQgYWN0dWFsIFNsYXZlU3RhcnQgZXZlbnQgbWF5 IGhhcHBlbmVkIGNvbmN1cmVudGx5IGluIHRoaXMKKwkJCSAqIGJhZCBzaWduYWxzIGNvbmRpdGlv biBoYW5kbGVyLiBHaXZlIGEgY2hhbmNlIHRvIGNoZWNrIGN1cnJlbnQKKwkJCSAqIHdvcmsgc3Rh dGUgYW5kIGludG1hc2sgdG8gYXZvaWQgYWN0dWFsIFNsYXZlU3RhcnQgY2Fubm90IGJlCisJCQkg KiB0cmlnZ2VyIGFmdGVyIHdlIGNsZWFyIFNsYXZlU3RhcnQgaW50ZXJydXB0IHN0YXR1cy4KKwkJ CSAqLworCisJCQkvKiBDaGVjayBpZiBzdGF0ZSBjaGFuZ2UgYWZ0ZXIgd2UgY2xlYXIgaW50ZXJy dXB0IHN0YXR1cyAqLworCQkJYWN0aXZlID0gcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0Nf TUlOVE1BU0tFRCk7CisJCQltc3RhdHVzID0gcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0Nf TVNUQVRVUyk7CisKKwkJCWlmIChOUENNX0kzQ19NU1RBVFVTX1NUQVRFX1NMVlJFUShtc3RhdHVz KSkgeworCQkJCWlmICghTlBDTV9JM0NfTVNUQVRVU19TTFZTVEFSVChhY3RpdmUpKQorCQkJCQlu cGNtX2kzY19tYXN0ZXJfaWJpX2lzcihtYXN0ZXIpOworCQkJCS8qIGVsc2U6IGhhbmRsZSBpbnRl cnJ1cHQgaW4gbmV4dCB0aW1lICovCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRM RUQ7Cit9CisKK3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX2J1c19pbml0KHN0cnVjdCBpM2Nf bWFzdGVyX2NvbnRyb2xsZXIgKm0pCit7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVy ID0gdG9fbnBjbV9pM2NfbWFzdGVyKG0pOworCXN0cnVjdCBpM2NfYnVzICpidXMgPSBpM2NfbWFz dGVyX2dldF9idXMobSk7CisJc3RydWN0IGkzY19kZXZpY2VfaW5mbyBpbmZvID0ge307CisJdW5z aWduZWQgbG9uZyBmY2xrX3JhdGUsIGZjbGtfcGVyaW9kX25zOworCXVuc2lnbmVkIGxvbmcgaTNj X3NjbF9yYXRlLCBpMmNfc2NsX3JhdGU7CisJdW5zaWduZWQgaW50IHBwX2hpZ2hfcGVyaW9kX25z LCBvZF9sb3dfcGVyaW9kX25zLCBpMmNfcGVyaW9kX25zOworCXVuc2lnbmVkIGludCBzY2xfcGVy aW9kX25zOworCXUzMiBwcGJhdWQsIHBwbG93LCBvZGhwcCwgb2RiYXVkLCBpMmNiYXVkLCByZWc7 CisJaW50IHJldDsKKworCS8qIFRpbWluZ3MgZGVyaXZhdGlvbiAqLworCWZjbGtfcmF0ZSA9IGNs a19nZXRfcmF0ZShtYXN0ZXItPmZjbGspOworCWlmICghZmNsa19yYXRlKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCWZjbGtfcGVyaW9kX25zID0gRElWX1JPVU5EX1VQKDEwMDAwMDAwMDAsIGZjbGtf cmF0ZSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBmb3IgUHVzaC1QdWxsIG1vZGUuCisJICovCisJ aWYgKG1hc3Rlci0+c2NsX3RpbWluZy5pM2NfcHBfaGkgPj0gSTNDX1NDTF9QUF9QRVJJT0RfTlNf TUlOICYmCisJICAgIG1hc3Rlci0+c2NsX3RpbWluZy5pM2NfcHBfbG8gPj0gbWFzdGVyLT5zY2xf dGltaW5nLmkzY19wcF9oaSkgeworCQlwcGJhdWQgPSBESVZfUk9VTkRfVVAobWFzdGVyLT5zY2xf dGltaW5nLmkzY19wcF9oaSwgZmNsa19wZXJpb2RfbnMpIC0gMTsKKwkJaWYgKHBwYmF1ZCA+IE5Q Q01fSTNDX01BWF9QUEJBVUQpCisJCQlwcGJhdWQgPSBOUENNX0kzQ19NQVhfUFBCQVVEOworCQlw cGxvdyA9IERJVl9ST1VORF9VUChtYXN0ZXItPnNjbF90aW1pbmcuaTNjX3BwX2xvLCBmY2xrX3Bl cmlvZF9ucykKKwkJCS0gKHBwYmF1ZCArIDEpOworCQlpZiAocHBsb3cgPiBOUENNX0kzQ19NQVhf UFBMT1cpCisJCQlwcGxvdyA9IE5QQ01fSTNDX01BWF9QUExPVzsKKwkJYnVzLT5zY2xfcmF0ZS5p M2MgPSAxMDAwMDAwMDAwIC8gKCgocHBiYXVkICsgMSkgKiAyICsgcHBsb3cpICogZmNsa19wZXJp b2RfbnMpOworCX0gZWxzZSB7CisJCXNjbF9wZXJpb2RfbnMgPSBESVZfUk9VTkRfVVAoMTAwMDAw MDAwMCwgYnVzLT5zY2xfcmF0ZS5pM2MpOworCQlpZiAoYnVzLT5zY2xfcmF0ZS5pM2MgPT0gMTAw MDAwMDApIHsKKwkJCS8qIFdvcmthcm91bmQgZm9yIG5wY204eHg6IDQwLzYwIG5zICovCisJCQlw cGJhdWQgPSBESVZfUk9VTkRfVVAoNDAsIGZjbGtfcGVyaW9kX25zKSAtIDE7CisJCQlwcGxvdyA9 IERJVl9ST1VORF9VUCgyMCwgZmNsa19wZXJpb2RfbnMpOworCQl9IGVsc2UgeworCQkJLyogNTAl IGR1dHktY3ljbGUgKi8KKwkJCXBwYmF1ZCA9IERJVl9ST1VORF9VUCgoc2NsX3BlcmlvZF9ucyAv IDIpLCBmY2xrX3BlcmlvZF9ucykgLSAxOworCQkJcHBsb3cgPSAwOworCQl9CisJCWlmIChwcGJh dWQgPiBOUENNX0kzQ19NQVhfUFBCQVVEKQorCQkJcHBiYXVkID0gTlBDTV9JM0NfTUFYX1BQQkFV RDsKKwl9CisJcHBfaGlnaF9wZXJpb2RfbnMgPSAocHBiYXVkICsgMSkgKiBmY2xrX3BlcmlvZF9u czsKKworCS8qCisJICogQ29uZmlndXJlIGZvciBPcGVuLURyYWluIG1vZGUuCisJICovCisJaWYg KG1hc3Rlci0+c2NsX3RpbWluZy5pM2Nfb2RfaGkgPj0gcHBfaGlnaF9wZXJpb2RfbnMgJiYKKwkg ICAgbWFzdGVyLT5zY2xfdGltaW5nLmkzY19vZF9sbyA+PSBJM0NfU0NMX09EX0xPV19QRVJJT0Rf TlNfTUlOKSB7CisJCWlmIChtYXN0ZXItPnNjbF90aW1pbmcuaTNjX29kX2hpID09IHBwX2hpZ2hf cGVyaW9kX25zKQorCQkJb2RocHAgPSAxOworCQllbHNlCisJCQlvZGhwcCA9IDA7CisJCW9kYmF1 ZCA9IERJVl9ST1VORF9VUChtYXN0ZXItPnNjbF90aW1pbmcuaTNjX29kX2xvLCBwcF9oaWdoX3Bl cmlvZF9ucykgLSAxOworCX0gZWxzZSB7CisJCS8qIFNldCBkZWZhdWx0IE9EIHRpbWluZzogMU1I ei8xMDAwbnMgd2l0aCA1MCUgZHV0eSBjeWNsZSAqLworCQlvZGhwcCA9IDA7CisJCW9kYmF1ZCA9 IERJVl9ST1VORF9VUCg1MDAsIHBwX2hpZ2hfcGVyaW9kX25zKSAtIDE7CisJfQorCWlmIChvZGJh dWQgPiBOUENNX0kzQ19NQVhfT0RCQVVEKQorCQlvZGJhdWQgPSBOUENNX0kzQ19NQVhfT0RCQVVE OworCW9kX2xvd19wZXJpb2RfbnMgPSAob2RiYXVkICsgMSkgKiBwcF9oaWdoX3BlcmlvZF9uczsK KworCS8qIENvbmZpZ3VyZSBmb3IgSTJDIG1vZGUgKi8KKwlpMmNfcGVyaW9kX25zID0gRElWX1JP VU5EX1VQKDEwMDAwMDAwMDAsIGJ1cy0+c2NsX3JhdGUuaTJjKTsKKwlpZiAoaTJjX3BlcmlvZF9u cyA8IG9kX2xvd19wZXJpb2RfbnMgKiAyKQorCQlpMmNfcGVyaW9kX25zID0gb2RfbG93X3Blcmlv ZF9ucyAqIDI7CisJaTJjYmF1ZCA9IERJVl9ST1VORF9VUChpMmNfcGVyaW9kX25zLCBvZF9sb3df cGVyaW9kX25zKSAtIDI7CisJaWYgKGkyY2JhdWQgPiBOUENNX0kzQ19NQVhfSTJDQkFVRCkKKwkJ aTJjYmF1ZCA9IE5QQ01fSTNDX01BWF9JMkNCQVVEOworCisJaTNjX3NjbF9yYXRlID0gMTAwMDAw MDAwMCAvICgoKHBwYmF1ZCArIDEpICogMiArIHBwbG93KSAqIGZjbGtfcGVyaW9kX25zKTsKKwlp MmNfc2NsX3JhdGUgPSAxMDAwMDAwMDAwIC8gKChpMmNiYXVkICsgMikgKiBvZF9sb3dfcGVyaW9k X25zKTsKKworCXJlZyA9IE5QQ01fSTNDX01DT05GSUdfTUFTVEVSX0VOIHwKKwkgICAgICBOUENN X0kzQ19NQ09ORklHX0RJU1RPKDApIHwKKwkgICAgICBOUENNX0kzQ19NQ09ORklHX0hLRUVQKDMp IHwKKwkgICAgICBOUENNX0kzQ19NQ09ORklHX09EU1RPUCgxKSB8CisJICAgICAgTlBDTV9JM0Nf TUNPTkZJR19QUEJBVUQocHBiYXVkKSB8CisJICAgICAgTlBDTV9JM0NfTUNPTkZJR19QUExPVyhw cGxvdykgfAorCSAgICAgIE5QQ01fSTNDX01DT05GSUdfT0RCQVVEKG9kYmF1ZCkgfAorCSAgICAg IE5QQ01fSTNDX01DT05GSUdfT0RIUFAob2RocHApIHwKKwkgICAgICBOUENNX0kzQ19NQ09ORklH X1NLRVcoMCkgfAorCSAgICAgIE5QQ01fSTNDX01DT05GSUdfSTJDQkFVRChpMmNiYXVkKTsKKwl3 cml0ZWwocmVnLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NQ09ORklHKTsKKworCWRldl9kYmco bWFzdGVyLT5kZXYsICJkdHM6IGkzYyByYXRlPSVsdSwgaTJjIHJhdGU9JWx1XG4iLAorCQlidXMt PnNjbF9yYXRlLmkzYywgYnVzLT5zY2xfcmF0ZS5pMmMpOworCWRldl9pbmZvKG1hc3Rlci0+ZGV2 LCAiZmNsaz0lbHUsIHBlcmlvZF9ucz0lbHVcbiIsIGZjbGtfcmF0ZSwgZmNsa19wZXJpb2RfbnMp OworCWRldl9pbmZvKG1hc3Rlci0+ZGV2LCAiaTNjIHNjbF9yYXRlPSVsdVxuIiwgaTNjX3NjbF9y YXRlKTsKKwlkZXZfaW5mbyhtYXN0ZXItPmRldiwgImkyYyBzY2xfcmF0ZT0lbHVcbiIsIGkyY19z Y2xfcmF0ZSk7CisJZGV2X2luZm8obWFzdGVyLT5kZXYsICJwcF9oaWdoPSV1LCBwcF9sb3c9JWx1 XG4iLCBwcF9oaWdoX3BlcmlvZF9ucywKKwkJCShwcGJhdWQgKyAxICsgcHBsb3cpICogZmNsa19w ZXJpb2RfbnMpOworCWRldl9pbmZvKG1hc3Rlci0+ZGV2LCAicHBfc2RhX3JkX3NrZXc9JWQsIHBw X3NkYV93cl9za2V3PSVkXG4iLAorCQkJbWFzdGVyLT5zY2xfdGltaW5nLmkzY19wcF9zZGFfcmRf c2tldywKKwkJCW1hc3Rlci0+c2NsX3RpbWluZy5pM2NfcHBfc2RhX3dyX3NrZXcpOworCWRldl9p bmZvKG1hc3Rlci0+ZGV2LCAib2RfaGlnaD0lZCwgb2RfbG93PSVkXG4iLAorCQkJb2RocHAgPyBw cF9oaWdoX3BlcmlvZF9ucyA6IG9kX2xvd19wZXJpb2RfbnMsIG9kX2xvd19wZXJpb2RfbnMpOwor CWRldl9kYmcobWFzdGVyLT5kZXYsICJpMmNfaGlnaD0ldSwgaTJjX2xvdz0ldVxuIiwgKChpMmNi YXVkID4+IDEpICsgMSkgKiBvZF9sb3dfcGVyaW9kX25zLAorCQkJKChpMmNiYXVkID4+IDEpICsg MSArIChpMmNiYXVkICUgMikpICogb2RfbG93X3BlcmlvZF9ucyk7CisJZGV2X2RiZyhtYXN0ZXIt PmRldiwgInBwYmF1ZD0lZCwgcHBsb3c9JWQsIG9kYmF1ZD0lZCwgaTJjYmF1ZD0lZFxuIiwKKwkJ cHBiYXVkLCBwcGxvdywgb2RiYXVkLCBpMmNiYXVkKTsKKwlkZXZfaW5mbyhtYXN0ZXItPmRldiwg Im1jb25maWc9MHgleFxuIiwgcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTUNPTkZJRykp OworCS8qIE1hc3RlciBjb3JlJ3MgcmVnaXN0cmF0aW9uICovCisJcmV0ID0gaTNjX21hc3Rlcl9n ZXRfZnJlZV9hZGRyKG0sIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaW5m by5keW5fYWRkciA9IHJldDsKKwlyZWcgPSByZWFkbChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19W RU5ET1JJRCk7CisJaW5mby5waWQgPSAoTlBDTV9JM0NfVkVORE9SSURfVklEKHJlZykgPDwgMzMp IHwgcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfUEFSVE5PKTsKKworCXdyaXRlbChOUENN X01EWU5BRERSX1ZBTElEIHwgTlBDTV9NRFlOQUREUl9BRERSKGluZm8uZHluX2FkZHIpLAorCSAg ICAgICBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NRFlOQUREUik7CisKKwlyZXQgPSBpM2NfbWFz dGVyX3NldF9pbmZvKCZtYXN0ZXItPmJhc2UsICZpbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9idXNfY2xlYW51cChzdHJ1Y3QgaTNjX21hc3Rl cl9jb250cm9sbGVyICptKQoreworCXN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlciA9IHRv X25wY21faTNjX21hc3RlcihtKTsKKworCW5wY21faTNjX21hc3Rlcl9kaXNhYmxlX2ludGVycnVw dHMobWFzdGVyKTsKKworCS8qIERpc2FibGUgbWFzdGVyICovCisJd3JpdGVsKDAsIG1hc3Rlci0+ cmVncyArIE5QQ01fSTNDX01DT05GSUcpOworfQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rl cl9yZXNlcnZlX3Nsb3Qoc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyKQoreworCXVuc2ln bmVkIGludCBzbG90OworCisJaWYgKCEobWFzdGVyLT5mcmVlX3Nsb3RzICYgR0VOTUFTSyhOUENN X0kzQ19NQVhfREVWUyAtIDEsIDApKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlzbG90ID0gZmZz KG1hc3Rlci0+ZnJlZV9zbG90cykgLSAxOworCisJbWFzdGVyLT5mcmVlX3Nsb3RzICY9IH5CSVQo c2xvdCk7CisKKwlyZXR1cm4gc2xvdDsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVy X3JlbGVhc2Vfc2xvdChzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsCisJCQkJCXVuc2ln bmVkIGludCBzbG90KQoreworCW1hc3Rlci0+ZnJlZV9zbG90cyB8PSBCSVQoc2xvdCk7Cit9CisK K3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX2F0dGFjaF9pM2NfZGV2KHN0cnVjdCBpM2NfZGV2 X2Rlc2MgKmRldikKK3sKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTNjX2Rl dl9nZXRfbWFzdGVyKGRldik7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyID0gdG9f bnBjbV9pM2NfbWFzdGVyKG0pOworCXN0cnVjdCBucGNtX2kzY19pMmNfZGV2X2RhdGEgKmRhdGE7 CisJaW50IHNsb3Q7CisKKwlzbG90ID0gbnBjbV9pM2NfbWFzdGVyX3Jlc2VydmVfc2xvdChtYXN0 ZXIpOworCWlmIChzbG90IDwgMCkKKwkJcmV0dXJuIHNsb3Q7CisKKwlkYXRhID0ga3phbGxvYyhz aXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJbnBjbV9pM2NfbWFz dGVyX3JlbGVhc2Vfc2xvdChtYXN0ZXIsIHNsb3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK KwlkYXRhLT5pYmkgPSAtMTsKKwlkYXRhLT5pbmRleCA9IHNsb3Q7CisJbWFzdGVyLT5hZGRyc1tz bG90XSA9IGRldi0+aW5mby5keW5fYWRkciA/IGRldi0+aW5mby5keW5fYWRkciA6CisJCQkJCQkg ICBkZXYtPmluZm8uc3RhdGljX2FkZHI7CisJbWFzdGVyLT5kZXNjc1tzbG90XSA9IGRldjsKKwor CWkzY19kZXZfc2V0X21hc3Rlcl9kYXRhKGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBucGNtX2kzY19tYXN0ZXJfcmVhdHRhY2hfaTNjX2RldihzdHJ1Y3QgaTNjX2Rl dl9kZXNjICpkZXYsCisJCQkJCSAgIHU4IG9sZF9keW5fYWRkcikKK3sKKwlzdHJ1Y3QgaTNjX21h c3Rlcl9jb250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7CisJc3RydWN0IG5w Y21faTNjX21hc3RlciAqbWFzdGVyID0gdG9fbnBjbV9pM2NfbWFzdGVyKG0pOworCXN0cnVjdCBu cGNtX2kzY19pMmNfZGV2X2RhdGEgKmRhdGEgPSBpM2NfZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYp OworCisJbWFzdGVyLT5hZGRyc1tkYXRhLT5pbmRleF0gPSBkZXYtPmluZm8uZHluX2FkZHIgPyBk ZXYtPmluZm8uZHluX2FkZHIgOgorCQkJCQkJCSAgZGV2LT5pbmZvLnN0YXRpY19hZGRyOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9kZXRhY2hfaTNjX2Rl dihzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYpCit7CisJc3RydWN0IG5wY21faTNjX2kyY19kZXZf ZGF0YSAqZGF0YSA9IGkzY19kZXZfZ2V0X21hc3Rlcl9kYXRhKGRldik7CisJc3RydWN0IGkzY19t YXN0ZXJfY29udHJvbGxlciAqbSA9IGkzY19kZXZfZ2V0X21hc3RlcihkZXYpOworCXN0cnVjdCBu cGNtX2kzY19tYXN0ZXIgKm1hc3RlciA9IHRvX25wY21faTNjX21hc3RlcihtKTsKKworCW1hc3Rl ci0+YWRkcnNbZGF0YS0+aW5kZXhdID0gMDsKKwlucGNtX2kzY19tYXN0ZXJfcmVsZWFzZV9zbG90 KG1hc3RlciwgZGF0YS0+aW5kZXgpOworCisJa2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQg bnBjbV9pM2NfbWFzdGVyX2F0dGFjaF9pMmNfZGV2KHN0cnVjdCBpMmNfZGV2X2Rlc2MgKmRldikK K3sKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTJjX2Rldl9nZXRfbWFzdGVy KGRldik7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyID0gdG9fbnBjbV9pM2NfbWFz dGVyKG0pOworCXN0cnVjdCBucGNtX2kzY19pMmNfZGV2X2RhdGEgKmRhdGE7CisJaW50IHNsb3Q7 CisKKwlzbG90ID0gbnBjbV9pM2NfbWFzdGVyX3Jlc2VydmVfc2xvdChtYXN0ZXIpOworCWlmIChz bG90IDwgMCkKKwkJcmV0dXJuIHNsb3Q7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJbnBjbV9pM2NfbWFzdGVyX3JlbGVhc2Vf c2xvdChtYXN0ZXIsIHNsb3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhLT5pbmRl eCA9IHNsb3Q7CisJbWFzdGVyLT5hZGRyc1tzbG90XSA9IGRldi0+YWRkcjsKKworCWkyY19kZXZf c2V0X21hc3Rlcl9kYXRhKGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgbnBjbV9pM2NfbWFzdGVyX2RldGFjaF9pMmNfZGV2KHN0cnVjdCBpMmNfZGV2X2Rlc2MgKmRl dikKK3sKKwlzdHJ1Y3QgbnBjbV9pM2NfaTJjX2Rldl9kYXRhICpkYXRhID0gaTJjX2Rldl9nZXRf bWFzdGVyX2RhdGEoZGV2KTsKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTJj X2Rldl9nZXRfbWFzdGVyKGRldik7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyID0g dG9fbnBjbV9pM2NfbWFzdGVyKG0pOworCisJbnBjbV9pM2NfbWFzdGVyX3JlbGVhc2Vfc2xvdCht YXN0ZXIsIGRhdGEtPmluZGV4KTsKKworCWtmcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50IG5w Y21faTNjX21hc3Rlcl9yZWFkYihzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsIHU4ICpk c3QsCisJCQkJdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgcmV0LCBpOworCXUzMiByZWc7CisK Kwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0 X2F0b21pYyhtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTLAorCQkJCQkJcmVnLAorCQkJ CQkJTlBDTV9JM0NfTVNUQVRVU19SWFBFTkQocmVnKSwKKwkJCQkJCTAsIDEwMDApOworCQlpZiAo cmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkc3RbaV0gPSByZWFkbChtYXN0ZXItPnJlZ3MgKyBO UENNX0kzQ19NUkRBVEFCKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucGNt X2kzY19tYXN0ZXJfZG9fZGFhX2xvY2tlZChzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIs CisJCQkJCXU4ICphZGRycywgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKwl1NjQgcHJvdl9pZFtO UENNX0kzQ19NQVhfREVWU10gPSB7fSwgbmFja2luZ19wcm92X2lkID0gMDsKKwl1bnNpZ25lZCBp bnQgZGV2X25iID0gMCwgbGFzdF9hZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlm ZmllczsKKwl1MzIgcmVnOworCWludCByZXQsIGk7CisJaW50IGR5bl9hZGRyOworCisJbnBjbV9p M2NfbWFzdGVyX2ZsdXNoX2ZpZm8obWFzdGVyKTsKKworCXdoaWxlICh0cnVlKSB7CisJCS8qIEVu dGVyL3Byb2NlZWQgd2l0aCBEQUEgKi8KKwkJd3JpdGVsKE5QQ01fSTNDX01DVFJMX1JFUVVFU1Rf UFJPQ19EQUEgfAorCQkgICAgICAgTlBDTV9JM0NfTUNUUkxfVFlQRV9JM0MgfAorCQkgICAgICAg TlBDTV9JM0NfTUNUUkxfSUJJUkVTUF9NQU5VQUwgfAorCQkgICAgICAgTlBDTV9JM0NfTUNUUkxf RElSKE5QQ01fSTNDX01DVFJMX0RJUl9XUklURSksCisJCSAgICAgICBtYXN0ZXItPnJlZ3MgKyBO UENNX0kzQ19NQ1RSTCk7CisKKwkJLyoKKwkJICogRWl0aGVyIG9uZSBzbGF2ZSB3aWxsIHNlbmQg aXRzIElELCBvciB0aGUgYXNzaWdubWVudCBwcm9jZXNzCisJCSAqIGlzIGRvbmUuCisJCSAqLwor CQlyZXQgPSByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dF9hdG9taWMobWFzdGVyLT5yZWdzICsg TlBDTV9JM0NfTVNUQVRVUywKKwkJCQkJCXJlZywKKwkJCQkJCU5QQ01fSTNDX01TVEFUVVNfUlhQ RU5EKHJlZykgfAorCQkJCQkJTlBDTV9JM0NfTVNUQVRVU19NQ1RSTERPTkUocmVnKSwKKwkJCQkJ CTAsIDEwMDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAodGltZV9hZnRl cihqaWZmaWVzLCBzdGFydCArIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpKSB7CisJCQlucGNtX2kz Y19tYXN0ZXJfZW1pdF9zdG9wKG1hc3Rlcik7CisJCQlkZXZfaW5mbyhtYXN0ZXItPmRldiwgImRv X2RhYSBleHBpcmVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIHJ1bnRpbWUgZG9fZGFhIG1h eSBpYml3b24gYnkgb3RoZXJzIHNsYXZlIGRldmljZXMgKi8KKwkJaWYgKE5QQ01fSTNDX01TVEFU VVNfSUJJV09OKHJlZykpIHsKKwkJCXJldCA9IG5wY21faTNjX21hc3Rlcl9oYW5kbGVfaWJpd29u KG1hc3RlciwgZmFsc2UpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIobWFzdGVyLT5kZXYs ICJkYWE6IGhhbmRsZSBpYmkgZXZlbnQgZmFpbCwgcmV0PSVkXG4iLCByZXQpOworCQkJCXJldHVy biByZXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkZXZfbmIgPT0gTlBDTV9J M0NfTUFYX0RFVlMpIHsKKwkJCW5wY21faTNjX21hc3Rlcl9lbWl0X3N0b3AobWFzdGVyKTsKKwkJ CWRldl9pbmZvKG1hc3Rlci0+ZGV2LCAiUmVhY2ggbWF4IGRldnNcbiIpOworCQkJYnJlYWs7CisJ CX0KKwkJaWYgKE5QQ01fSTNDX01TVEFUVVNfUlhQRU5EKHJlZykpIHsKKwkJCXU4IGRhdGFbNl07 CisKKwkJCS8qIEdpdmUgdGhlIHNsYXZlIGRldmljZSBhIHN1aXRhYmxlIGR5bmFtaWMgYWRkcmVz cyAqLworCQkJZHluX2FkZHIgPSBpM2NfbWFzdGVyX2dldF9mcmVlX2FkZHIoJm1hc3Rlci0+YmFz ZSwgbGFzdF9hZGRyICsgMSk7CisJCQlpZiAoZHluX2FkZHIgPCAwKQorCQkJCXJldHVybiBkeW5f YWRkcjsKKwkJCXdyaXRlbChkeW5fYWRkciwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVdEQVRB Qik7CisKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIDQ4LWJpdCBwcm92aXNp b25hbCBJRCB5ZXQgdG8KKwkJCSAqIGJlIHN1cmUgYSBkZXZpY2UgZG9lcyBub3QgbmFjayBhbiBh ZGRyZXNzIHR3aWNlLgorCQkJICogT3RoZXJ3aXNlLCB3ZSB3b3VsZCBqdXN0IG5lZWQgdG8gZmx1 c2ggdGhlIFJYIEZJRk8uCisJCQkgKi8KKwkJCXJldCA9IG5wY21faTNjX21hc3Rlcl9yZWFkYiht YXN0ZXIsIGRhdGEsIDYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlmb3Ig KGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJCXByb3ZfaWRbZGV2X25iXSB8PSAodTY0KShkYXRhW2ld KSA8PCAoOCAqICg1IC0gaSkpOworCisJCQkvKiBXZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgQkNS IGFuZCBEQ1IgeWV0ICovCisJCQlyZXQgPSBucGNtX2kzY19tYXN0ZXJfcmVhZGIobWFzdGVyLCBk YXRhLCAyKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChOUENN X0kzQ19NU1RBVFVTX01DVFJMRE9ORShyZWcpKSB7CisJCQlpZiAoKE5QQ01fSTNDX01TVEFUVVNf U1RBVEVfSURMRShyZWcpIHwKKwkJCSAgICAgTlBDTV9JM0NfTVNUQVRVU19TVEFURV9TTFZSRVEo cmVnKSkgJiYKKwkJCSAgICBOUENNX0kzQ19NU1RBVFVTX0NPTVBMRVRFKHJlZykpIHsKKwkJCQkv KgorCQkJCSAqIFNvbWV0aW1lcyB0aGUgY29udHJvbGxlciBzdGF0ZSBpcyBTTFZSRVEgYWZ0ZXIK KwkJCQkgKiBEQUEgcmVxdWVzdCBjb21wbGV0ZWQsIHRyZWF0IGl0IGFzIG5vcm1hbCBlbmQuCisJ CQkJICoKKwkJCQkgKiBBbGwgZGV2aWNlcyByZWNlaXZlZCBhbmQgYWNrZWQgdGhleSBkeW5hbWlj CisJCQkJICogYWRkcmVzcywgdGhpcyBpcyB0aGUgbmF0dXJhbCBlbmQgb2YgdGhlIERBQQorCQkJ CSAqIHByb2NlZHVyZS4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoTlBDTV9J M0NfTVNUQVRVU19OQUNLRUQocmVnKSkgeworCQkJCS8qIE5vIEkzQyBkZXZpY2VzIGF0dGFjaGVk ICovCisJCQkJaWYgKGRldl9uYiA9PSAwKSB7CisJCQkJCW5wY21faTNjX21hc3Rlcl9lbWl0X3N0 b3AobWFzdGVyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBBIHNsYXZl IGRldmljZSBuYWNrZWQgdGhlIGFkZHJlc3MsIHRoaXMgaXMKKwkJCQkgKiBhbGxvd2VkIG9ubHkg b25jZSwgREFBIHdpbGwgYmUgc3RvcHBlZCBhbmQKKwkJCQkgKiB0aGVuIHJlc3VtZWQuIFRoZSBz YW1lIGRldmljZSBpcyBzdXBwb3NlZCB0bworCQkJCSAqIGFuc3dlciBhZ2FpbiBpbW1lZGlhdGVs eSBhbmQgc2hhbGwgYWNrIHRoZQorCQkJCSAqIGFkZHJlc3MgdGhpcyB0aW1lLgorCQkJCSAqLwor CQkJCWlmIChwcm92X2lkW2Rldl9uYl0gPT0gbmFja2luZ19wcm92X2lkKQorCQkJCQlyZXR1cm4g LUVJTzsKKworCQkJCWRldl9uYi0tOworCQkJCW5hY2tpbmdfcHJvdl9pZCA9IHByb3ZfaWRbZGV2 X25iXTsKKwkJCQlucGNtX2kzY19tYXN0ZXJfZW1pdF9zdG9wKG1hc3Rlcik7CisKKwkJCQljb250 aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBX YWl0IGZvciB0aGUgc2xhdmUgdG8gYmUgcmVhZHkgdG8gcmVjZWl2ZSBpdHMgYWRkcmVzcyAqLwor CQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKG1hc3Rlci0+cmVncyArIE5QQ01fSTND X01TVEFUVVMsCisJCQkJCQlyZWcsCisJCQkJCQlOUENNX0kzQ19NU1RBVFVTX01DVFJMRE9ORShy ZWcpICYmCisJCQkJCQlOUENNX0kzQ19NU1RBVFVTX1NUQVRFX0RBQShyZWcpICYmCisJCQkJCQlO UENNX0kzQ19NU1RBVFVTX0JFVFdFRU4ocmVnKSwKKwkJCQkJCTAsIDEwMDApOworCQlpZiAocmV0 KQorCQkJcmV0dXJuIHJldDsKKworCQlhZGRyc1tkZXZfbmJdID0gZHluX2FkZHI7CisJCWRldl9k YmcobWFzdGVyLT5kZXYsICJEQUE6IGRldmljZSAlZCBhc3NpZ25lZCB0byAweCUwMnhcbiIsCisJ CQlkZXZfbmIsIGFkZHJzW2Rldl9uYl0pOworCQlsYXN0X2FkZHIgPSBhZGRyc1tkZXZfbmIrK107 CisJfQorCisJKmNvdW50ID0gZGV2X25iOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg bnBjbV9pM2NfdXBkYXRlX2liaXJ1bGVzKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikK K3sKKwlzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXY7CisJdTMyIHJlZ19tYnl0ZSA9IDAsIHJlZ19u b2J5dGUgPSBOUENNX0kzQ19JQklSVUxFU19OT0JZVEU7CisJdW5zaWduZWQgaW50IG1ieXRlX2Fk ZHJfb2sgPSAwLCBtYnl0ZV9hZGRyX2tvID0gMCwgbm9ieXRlX2FkZHJfb2sgPSAwLAorCQlub2J5 dGVfYWRkcl9rbyA9IDA7CisJYm9vbCBsaXN0X21ieXRlID0gZmFsc2UsIGxpc3Rfbm9ieXRlID0g ZmFsc2U7CisKKwkvKiBDcmVhdGUgdGhlIElCSVJVTEVTIHJlZ2lzdGVyIGZvciBib3RoIGNhc2Vz ICovCisJaTNjX2J1c19mb3JfZWFjaF9pM2NkZXYoJm1hc3Rlci0+YmFzZS5idXMsIGRldikgewor CQlpZiAoSTNDX0JDUl9ERVZJQ0VfUk9MRShkZXYtPmluZm8uYmNyKSA9PSBJM0NfQkNSX0kzQ19N QVNURVIpIHsKKwkJCWlmICghKGRldi0+aW5mby5iY3IgJiBJM0NfQkNSX0lCSV9SRVFfQ0FQKSkK KwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkZXYtPmluZm8uYmNyICYgSTNDX0JDUl9JQklf UEFZTE9BRCkgeworCQkJcmVnX21ieXRlIHw9IE5QQ01fSTNDX0lCSVJVTEVTX0FERFIobWJ5dGVf YWRkcl9vaywKKwkJCQkJCQkgICBkZXYtPmluZm8uZHluX2FkZHIpOworCisJCQkvKiBJQkkgcnVs ZXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gZGV2aWNlcyB3aXRoIE1TYj0xICovCisJCQlpZiAoZGV2 LT5pbmZvLmR5bl9hZGRyICYgQklUKDcpKQorCQkJCW1ieXRlX2FkZHJfa28rKzsKKwkJCWVsc2UK KwkJCQltYnl0ZV9hZGRyX29rKys7CisJCX0gZWxzZSB7CisJCQlyZWdfbm9ieXRlIHw9IE5QQ01f STNDX0lCSVJVTEVTX0FERFIobm9ieXRlX2FkZHJfb2ssCisJCQkJCQkJICAgIGRldi0+aW5mby5k eW5fYWRkcik7CisKKwkJCS8qIElCSSBydWxlcyBjYW5ub3QgYmUgYXBwbGllZCB0byBkZXZpY2Vz IHdpdGggTVNiPTEgKi8KKwkJCWlmIChkZXYtPmluZm8uZHluX2FkZHIgJiBCSVQoNykpCisJCQkJ bm9ieXRlX2FkZHJfa28rKzsKKwkJCWVsc2UKKwkJCQlub2J5dGVfYWRkcl9vaysrOworCQl9CisJ fQorCisJLyogRGV2aWNlIGxpc3QgY2Fubm90IGJlIGhhbmRsZWQgYnkgaGFyZHdhcmUgKi8KKwlp ZiAoIW1ieXRlX2FkZHJfa28gJiYgbWJ5dGVfYWRkcl9vayA8PSBOUENNX0kzQ19JQklSVUxFU19B RERSUykKKwkJbGlzdF9tYnl0ZSA9IHRydWU7CisKKwlpZiAoIW5vYnl0ZV9hZGRyX2tvICYmIG5v Ynl0ZV9hZGRyX29rIDw9IE5QQ01fSTNDX0lCSVJVTEVTX0FERFJTKQorCQlsaXN0X25vYnl0ZSA9 IHRydWU7CisKKwkvKiBObyBsaXN0IGNhbiBiZSBwcm9wZXJseSBoYW5kbGVkLCByZXR1cm4gYW4g ZXJyb3IgKi8KKwlpZiAoIWxpc3RfbWJ5dGUgJiYgIWxpc3Rfbm9ieXRlKQorCQlyZXR1cm4gLUVS QU5HRTsKKworCS8qIFBpY2sgdGhlIGZpcnN0IGxpc3QgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSBo YXJkd2FyZSwgcmFuZG9tbHkgKi8KKwlpZiAobGlzdF9tYnl0ZSkKKwkJd3JpdGVsKHJlZ19tYnl0 ZSwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfSUJJUlVMRVMpOworCWVsc2UKKwkJd3JpdGVsKHJl Z19ub2J5dGUsIG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX0lCSVJVTEVTKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rlcl9kb19kYWEoc3RydWN0IGkzY19tYXN0 ZXJfY29udHJvbGxlciAqbSkKK3sKKwlzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIgPSB0 b19ucGNtX2kzY19tYXN0ZXIobSk7CisJdTggYWRkcnNbTlBDTV9JM0NfTUFYX0RFVlNdOworCXVu c2lnbmVkIGludCBkZXZfbmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0LCBpOwor CisJbXV0ZXhfbG9jaygmbWFzdGVyLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVy LT5yZXFfbG9jaywgZmxhZ3MpOworCS8qCisJICogRml4IFNDTC9TREEgdGltaW5nIGlzc3VlIGR1 cmluZyBEQUEuCisJICogU2V0IFNLRVcgYml0IHRvIDEgYmVmb3JlIGluaXRpYXRpbmcgYSBEQUEs IHNldCBTS0VXIGJpdCB0byAwCisJICogYWZ0ZXIgREFBIGlzIGNvbXBsZXRlZC4KKwkgKi8KKwlu cGNtX2kzY19tYXN0ZXJfc2V0X3NkYV9za2V3KG1hc3RlciwgMSk7CisJcmV0ID0gbnBjbV9pM2Nf bWFzdGVyX2RvX2RhYV9sb2NrZWQobWFzdGVyLCBhZGRycywgJmRldl9uYik7CisJbnBjbV9pM2Nf bWFzdGVyX3NldF9zZGFfc2tldyhtYXN0ZXIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jm1hc3Rlci0+cmVxX2xvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJm1hc3Rlci0+bG9jayk7 CisJaWYgKHJldCkgeworCQlucGNtX2kzY19tYXN0ZXJfZW1pdF9zdG9wKG1hc3Rlcik7CisJCW5w Y21faTNjX21hc3Rlcl9jbGVhcl9tZXJyd2FybihtYXN0ZXIpOworCQlnb3RvIGRhYV9vdXQ7CisJ fQorCisJLyogUmVnaXN0ZXIgYWxsIGRldmljZXMgd2hvIHBhcnRpY2lwYXRlZCB0byB0aGUgY29y ZSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXZfbmI7IGkrKykgeworCQlyZXQgPSBpM2NfbWFzdGVy X2FkZF9pM2NfZGV2X2xvY2tlZChtLCBhZGRyc1tpXSk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJy KG1hc3Rlci0+ZGV2LCAiVW5hYmxlIHRvIGFkZCBpM2MgZGV2QDB4JXgsIGVyciAlZFxuIiwKKwkJ CQlhZGRyc1tpXSwgcmV0KTsKKwl9CisKKwkvKiBDb25maWd1cmUgSUJJIGF1dG8tcnVsZXMgKi8K KwlyZXQgPSBucGNtX2kzY191cGRhdGVfaWJpcnVsZXMobWFzdGVyKTsKKwlpZiAocmV0KQorCQlk ZXZfZXJyKG1hc3Rlci0+ZGV2LCAiQ2Fubm90IGhhbmRsZSBzdWNoIGEgbGlzdCBvZiBkZXZpY2Vz Iik7CisKK2RhYV9vdXQ6CisJLyogTm8gU2xhdmUgQUNLICovCisJaWYgKHJldCA9PSAtRUlPKQor CQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFz dGVyX3JlYWQoc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyLAorCQkJICAgICAgIHU4ICpp biwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgb2Zmc2V0ID0gMCwgaTsKKwl1MzIgbWRjdHJs LCBtc3RhdHVzOworCWJvb2wgY29tcGxldGVkID0gZmFsc2U7CisJdW5zaWduZWQgaW50IGNvdW50 OworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUgKCFjb21wbGV0ZWQp IHsKKwkJbXN0YXR1cyA9IHJlYWRsKG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01TVEFUVVMpOwor CQlpZiAoTlBDTV9JM0NfTVNUQVRVU19DT01QTEVURShtc3RhdHVzKSAhPSAwKQorCQkJY29tcGxl dGVkID0gdHJ1ZTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIG1zZWNzX3Rv X2ppZmZpZXMoMTAwMCkpKSB7CisJCQlkZXZfZGJnKG1hc3Rlci0+ZGV2LCAiSTNDIHJlYWQgdGlt ZW91dFxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCW1kY3RybCA9IHJlYWRs KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRBQ1RSTCk7CisJCWNvdW50ID0gTlBDTV9JM0Nf TURBVEFDVFJMX1JYQ09VTlQobWRjdHJsKTsKKwkJaWYgKG9mZnNldCArIGNvdW50ID4gbGVuKSB7 CisJCQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAiSTNDIHJlY2VpdmUgbGVuZ3RoIHRvbyBsb25nIVxu Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkr KykKKwkJCWluW29mZnNldCArIGldID0gcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVJE QVRBQik7CisKKwkJb2Zmc2V0ICs9IGNvdW50OworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisK K3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX3dyaXRlKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIg Km1hc3RlciwKKwkJCQljb25zdCB1OCAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBv ZmZzZXQgPSAwLCByZXQ7CisJdTMyIG1kY3RybDsKKworCXdoaWxlIChvZmZzZXQgPCBsZW4pIHsK KwkJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRB Q1RSTCwKKwkJCQkJIG1kY3RybCwKKwkJCQkJICEobWRjdHJsICYgTlBDTV9JM0NfTURBVEFDVFJM X1RYRlVMTCksCisJCQkJCSAwLCAxMDAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisK KwkJLyoKKwkJICogVGhlIGxhc3QgYnl0ZSB0byBiZSBzZW50IG92ZXIgdGhlIGJ1cyBtdXN0IGVp dGhlciBoYXZlIHRoZQorCQkgKiAiZW5kIiBiaXQgc2V0IG9yIGJlIHdyaXR0ZW4gaW4gTVdEQVRB QkUuCisJCSAqLworCQlpZiAobGlrZWx5KG9mZnNldCA8IChsZW4gLSAxKSkpCisJCQl3cml0ZWwo b3V0W29mZnNldCsrXSwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVdEQVRBQik7CisJCWVsc2UK KwkJCXdyaXRlbChvdXRbb2Zmc2V0KytdLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NV0RBVEFC RSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9z dG9wX2RtYShzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIpCit7CisJd3JpdGVsKDAsIG1h c3Rlci0+ZG1hX3JlZ3MgKyBOUENNX0dETUFfQ1RMKERNQV9DSF9UWCkpOworCXdyaXRlbCgwLCBt YXN0ZXItPmRtYV9yZWdzICsgTlBDTV9HRE1BX0NUTChETUFfQ0hfUlgpKTsKKwl3cml0ZWwoMCwg bWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTURNQUNUUkwpOworCisJLyogRGlzYWJsZSBDT01QTEVU RSBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoTlBDTV9JM0NfTUlOVF9DT01QTEVURSwgbWFzdGVyLT5y ZWdzICsgTlBDTV9JM0NfTUlOVENMUik7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rl cl93cml0ZV9kbWFfdGFibGUoY29uc3QgdTggKnNyYywgdTMyICpkc3QsIGludCBsZW4pCit7CisJ aW50IGk7CisKKwlpZiAobGVuID4gTUFYX0RNQV9DT1VOVCkKKwkJcmV0dXJuOworCisJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKQorCQlkc3RbaV0gPSAodTMyKXNyY1tpXSAmIDB4RkY7CisKKwkv KiBTZXQgZW5kIGJpdCBmb3IgbGFzdCBieXRlICovCisJZHN0W2xlbiAtIDFdIHw9IDB4MTAwOwor fQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rlcl9zdGFydF9kbWEoc3RydWN0IG5wY21faTNj X21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBucGNtX2RtYV94ZmVyX2Rlc2MgKnhmZXIgPSAm bWFzdGVyLT5kbWFfeGZlcjsKKwlpbnQgY2ggPSB4ZmVyLT5ybncgPyBETUFfQ0hfUlggOiBETUFf Q0hfVFg7CisJdTMyIHZhbDsKKworCWlmICgheGZlci0+bGVuKQorCQlyZXR1cm4gMDsKKworCWRl dl9kYmcobWFzdGVyLT5kZXYsICJzdGFydCBkbWEgZm9yICVzLCBjb3VudCAlZFxuIiwKKwkJeGZl ci0+cm53ID8gIlIiIDogIlciLCB4ZmVyLT5sZW4pOworCisJLyogU2V0IERNQSB0cmFuc2ZlciBj b3VudCAqLworCXdyaXRlbCh4ZmVyLT5sZW4sIG1hc3Rlci0+ZG1hX3JlZ3MgKyBOUENNX0dETUFf VENOVChjaCkpOworCisJLyogV3JpdGUgZGF0YSB0byBETUEgVFggdGFibGUgKi8KKwlpZiAoIXhm ZXItPnJudykKKwkJbnBjbV9pM2NfbWFzdGVyX3dyaXRlX2RtYV90YWJsZSh4ZmVyLT5vdXQsCisJ CQkJCSAgICAgICAodTMyICopbWFzdGVyLT5kbWFfdHhfYnVmLAorCQkJCQkgICAgICAgeGZlci0+ bGVuKTsKKworCS8qCisJICogU2V0dXAgSTNDIERNQSBjb250cm9sCisJICogMSBieXRlIERNQSB3 aWR0aAorCSAqIEVuYWJsZSBETUEgdXRpbCBkaXNhYmxlZAorCSAqLworCXZhbCA9IE5QQ01fSTND X01ETUFDVFJMX0RNQVdJRFRIKDEpOworCXZhbCB8PSB4ZmVyLT5ybncgPyBOUENNX0kzQ19NRE1B Q1RSTF9ETUFGQigyKSA6IE5QQ01fSTNDX01ETUFDVFJMX0RNQVRCKDIpOworCXdyaXRlbCh2YWws IG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01ETUFDVFJMKTsKKworCS8qCisJICogRW5hYmxlIERN QQorCSAqIFNvdXJjZSBBZGRyZXNzIEZpeGVkIGZvciBSWAorCSAqIERlc3RpbmF0aW9uIEFkZHJl c3MgRml4ZWQgZm9yIFRYCisJICogVXNlIDMyLWJpdCB0cmFuc2ZlciB3aWR0aCBmb3IgVFggKHF1 ZWFsIHRvIE1XREFUQUIgcmVnaXN0ZXIgd2lkdGgpCisJICovCisJdmFsID0gTlBDTV9HRE1BX0NU TF9HRE1BRU47CisJaWYgKHhmZXItPnJudykKKwkJdmFsIHw9IE5QQ01fR0RNQV9DVExfU0FGSVgg fCBOUENNX0dETUFfQ1RMX0dETUFNUygyKTsKKwllbHNlCisJCXZhbCB8PSBOUENNX0dETUFfQ1RM X0RBRklYIHwgTlBDTV9HRE1BX0NUTF9HRE1BTVMoMSkgfCBOUENNX0dETUFfQ1RMX1RXUygyKTsK Kwl3cml0ZWwodmFsLCBtYXN0ZXItPmRtYV9yZWdzICsgTlBDTV9HRE1BX0NUTChjaCkpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX3dhaXRfZm9yX2NvbXBs ZXRlKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgbnBjbV9kbWFf eGZlcl9kZXNjICp4ZmVyID0gJm1hc3Rlci0+ZG1hX3hmZXI7CisJaW50IGNoID0geGZlci0+cm53 ID8gRE1BX0NIX1JYIDogRE1BX0NIX1RYOworCXUzMiBjb3VudDsKKwlpbnQgcmV0OworCisJcmV0 ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYXN0ZXItPnhmZXJfY29tcCwgbXNlY3Nf dG9famlmZmllcygxMDApKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAi RE1BIHRyYW5zZmVyIHRpbWVvdXQgKCVzKVxuIiwgeGZlci0+cm53ID8gIlJlYWQiIDogIndyaXRl Iik7CisJCWRldl9lcnIobWFzdGVyLT5kZXYsICJtc3RhdHVzID0gMHglMDJ4XG4iLCByZWFkbCht YXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKSk7CisJCXJldHVybiAtRVRJTUVET1VUOwor CX0KKworCS8qIEdldCB0aGUgRE1BIHRyYW5zZmVyIGNvdW50ICovCisJY291bnQgPSByZWFkbCht YXN0ZXItPmRtYV9yZWdzICsgTlBDTV9HRE1BX0NUQ05UKGNoKSk7CisJY291bnQgPSAoY291bnQg PiB4ZmVyLT5sZW4pID8gMCA6ICh4ZmVyLT5sZW4gLSBjb3VudCk7CisJZGV2X2RiZyhtYXN0ZXIt PmRldiwgImRtYSB4ZmVyIGNvdW50ICV1XG4iLCBjb3VudCk7CisJaWYgKHhmZXItPnJudykKKwkJ bWVtY3B5KHhmZXItPmluLCBtYXN0ZXItPmRtYV9yeF9idWYsIGNvdW50KTsKKwlpZiAoY291bnQg IT0geGZlci0+bGVuKQorCQlkZXZfZGJnKG1hc3Rlci0+ZGV2LCAic2hvcnQgZG1hIHhmZXIoJXMp LCB3YW50ICVkIHRyYW5zZmVyICVkXG4iLAorCQkJeGZlci0+cm53ID8gIlIiIDogIlciLCB4ZmVy LT5sZW4sIGNvdW50KTsKKworCW5wY21faTNjX21hc3Rlcl9zdG9wX2RtYShtYXN0ZXIpOworCisJ cmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG5wY21faTNjX3NlbmRfYnJvYWRjYXN0KHN0 cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikKK3sKKwl1MzIgcmVnOworCWludCByZXQ7CisK Kwl3cml0ZWwoTlBDTV9JM0NfTUNUUkxfUkVRVUVTVF9TVEFSVF9BRERSIHwKKwkgICAgICAgTlBD TV9JM0NfTUNUUkxfVFlQRV9JM0MgfAorCSAgICAgICBOUENNX0kzQ19NQ1RSTF9JQklSRVNQX0FV VE8gfAorCSAgICAgICBOUENNX0kzQ19NQ1RSTF9ESVIoMCkgfAorCSAgICAgICBOUENNX0kzQ19N Q1RSTF9BRERSKEkzQ19CUk9BRENBU1RfQUREUikgfAorCSAgICAgICBOUENNX0kzQ19NQ1RSTF9S RFRFUk0oTlBDTV9JM0NfTUFYX0lCSV9QQVlMT0FEX1NJWkUpLAorCSAgICAgICBtYXN0ZXItPnJl Z3MgKyBOUENNX0kzQ19NQ1RSTCk7CisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+ cmVncyArIE5QQ01fSTNDX01TVEFUVVMsIHJlZywKKwkJCQkgTlBDTV9JM0NfTVNUQVRVU19NQ1RS TERPTkUocmVnKSwgMCwgMTAwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAo TlBDTV9JM0NfTVNUQVRVU19JQklXT04ocmVnKSkgeworCQlyZXQgPSBucGNtX2kzY19tYXN0ZXJf aGFuZGxlX2liaXdvbihtYXN0ZXIsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1h c3Rlci0+ZGV2LCAieGZlciByZWFkOiBoYW5kbGUgaWJpIGV2ZW50IGZhaWwsIHJldD0lZFxuIiwg cmV0KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogQ2xlYXIgQ09NUExFVEUgc3RhdHVz IG9mIHRoaXMgSUJJIHRyYW5zYWN0aW9uICovCisJCXdyaXRlbChOUENNX0kzQ19NSU5UX0NPTVBM RVRFLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKTsKKwkJcmV0dXJuIDE7CisJfQor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX3hmZXIoc3RydWN0 IG5wY21faTNjX21hc3RlciAqbWFzdGVyLAorCQkJICAgICAgIGJvb2wgcm53LCB1bnNpZ25lZCBp bnQgeGZlcl90eXBlLCB1OCBhZGRyLAorCQkJICAgICAgIHU4ICppbiwgY29uc3QgdTggKm91dCwg dW5zaWduZWQgaW50IHhmZXJfbGVuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmVhZF9sZW4s IGJvb2wgY29udGludWVkLAorCQkJICAgICAgIGJvb2wgdXNlX2RtYSwgYm9vbCBmaXJzdCkKK3sK Kwl1MzIgcmVnLCByZHRlcm0gPSAqcmVhZF9sZW4sIG1zdGF0dXMsIGliaXJlc3A7CisJaW50IHJl dCwgaSwgY291bnQsIHNwYWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9u ZyBzdGFydDsKKwlib29sIGJ1c19sb2NrZWQgPSBmYWxzZTsKKworCWlmIChyZHRlcm0gPiBOUENN X0kzQ19NQVhfUkRURVJNKQorCQlyZHRlcm0gPSBOUENNX0kzQ19NQVhfUkRURVJNOworCisJLyog UHJldmVudCBmaWZvIG9wZXJhdGlvbiBmcm9tIGRlbGF5IGJ5IGludGVycnVwdCAqLworCWlmICgh dXNlX2RtYSkKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwllbHNlCisJCW5wY21faTNjX21hc3Rl cl9kbWFfbG9jaygpOworCisJLyogUHJldmVudCBETUEgc3RhcnQgd2hpbGUgSUJJIGlzciBpcyBy dW5uaW5nICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hc3Rlci0+cmVxX2xvY2ssIGZsYWdzKTsK KwlidXNfbG9ja2VkID0gdHJ1ZTsKKworCS8qCisJICogVGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBm aXJzdCB0eCBkYXRhIGJpdCBpcyBsb3N0IHdoZW4gaXQKKwkgKiBpcyBub3QgcmVhZHkgaW4gRklG TyByaWdodCBhZnRlciBhZGRyZXNzIHBoYXNlLgorCSAqIFByZXBhcmUgZGF0YSBiZWZvcmUgc3Rh cnRpbmcgdGhlIHRyYW5zZmVyIHRvIGZpeCB0aGlzIHByb2JsZW0uCisJICovCisJaWYgKCFybncg JiYgeGZlcl9sZW4gJiYgIXVzZV9kbWEpIHsKKwkJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KG1h c3Rlci0+cmVncyArIE5QQ01fSTNDX01EQVRBQ1RSTCwKKwkJCQkJIHJlZywKKwkJCQkJICEocmVn ICYgTlBDTV9JM0NfTURBVEFDVFJMX1RYRlVMTCksCisJCQkJCSAwLCAxMDAwKTsKKwkJaWYgKHJl dCkgeworCQkJYnVzX2xvY2tlZCA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm bWFzdGVyLT5yZXFfbG9jaywgZmxhZ3MpOworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJcmV0 dXJuIHJldDsKKwkJfQorCisJCXJlZyA9IHJlYWRsKG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01E QVRBQ1RSTCk7CisJCXNwYWNlID0gTlBDTV9JM0NfRklGT19TSVpFIC0gTlBDTV9JM0NfTURBVEFD VFJMX1RYQ09VTlQocmVnKTsKKwkJY291bnQgPSB4ZmVyX2xlbiA+IHNwYWNlID8gc3BhY2UgOiB4 ZmVyX2xlbjsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChpID09IHhm ZXJfbGVuIC0gMSkKKwkJCQl3cml0ZWwob3V0WzBdLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19N V0RBVEFCRSk7CisJCQllbHNlCisJCQkJd3JpdGVsKG91dFswXSwgbWFzdGVyLT5yZWdzICsgTlBD TV9JM0NfTVdEQVRBQik7CisJCQlvdXQrKzsKKwkJfQorCQl4ZmVyX2xlbiAtPSBjb3VudDsKKwl9 CisKKwlpZiAodXNlX2RtYSkgeworCQlpZiAoeGZlcl9sZW4gPiBNQVhfRE1BX0NPVU5UKSB7CisJ CQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAiZGF0YSBpcyBsYXJnZXIgdGhhbiBidWZmZXIgc2l6ZSAo JWQpXG4iLAorCQkJCU1BWF9ETUFfQ09VTlQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm bWFzdGVyLT5yZXFfbG9jaywgZmxhZ3MpOworCQkJbnBjbV9pM2NfbWFzdGVyX2RtYV91bmxvY2so KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1hc3Rlci0+ZG1hX3hmZXIub3V0ID0gb3V0 OworCQltYXN0ZXItPmRtYV94ZmVyLmluID0gaW47CisJCW1hc3Rlci0+ZG1hX3hmZXIubGVuID0g eGZlcl9sZW47CisJCW1hc3Rlci0+ZG1hX3hmZXIucm53ID0gcm53OworCQltYXN0ZXItPmRtYV94 ZmVyLmVuZCA9ICFjb250aW51ZWQ7CisJCWluaXRfY29tcGxldGlvbigmbWFzdGVyLT54ZmVyX2Nv bXApOworCX0KKworCXN0YXJ0ID0gamlmZmllczsKKworYnJvYWRjYXN0X3N0YXJ0OgorCWlmIChm aXJzdCAmJiBybncpIHsKKwkJLyogU2VuZCA3RSBmaXJzdCB0byBhdm9pZCBjb2xsaXNpb24gZHVy aW5nIG1hc3RlciByZWFkICovCisJCXJldCA9IG5wY21faTNjX3NlbmRfYnJvYWRjYXN0KG1hc3Rl cik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAic2VuZCA3ZSBl cnJvclxuIik7CisJCQlnb3RvIGVtaXRfc3RvcDsKKwkJfQorCQlpZiAodGltZV9hZnRlcihqaWZm aWVzLCBzdGFydCArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKSB7CisJCQlkZXZfZXJyKG1hc3Rl ci0+ZGV2LCAiYWJub3JtYWwgaWJpd29uIGV2ZW50c1xuIik7CisJCQlnb3RvIGVtaXRfc3RvcDsK KwkJfQorCQlpZiAocmV0ID4gMCkKKwkJCWdvdG8gYnJvYWRjYXN0X3N0YXJ0OworCX0KKworCWlm IChybncpIHsKKwkJaWJpcmVzcCA9IE5QQ01fSTNDX01DVFJMX0lCSVJFU1BfTkFDSzsKKwkJbnBj bV9pM2NfbWFzdGVyX3NldF9zZGFfc2tldyhtYXN0ZXIsCisJCQkJbWFzdGVyLT5zY2xfdGltaW5n LmkzY19wcF9zZGFfcmRfc2tldyk7CisJfSBlbHNlIHsKKwkJaWJpcmVzcCA9IE5QQ01fSTNDX01D VFJMX0lCSVJFU1BfQVVUTzsKKwkJbnBjbV9pM2NfbWFzdGVyX3NldF9zZGFfc2tldyhtYXN0ZXIs CisJCQkJbWFzdGVyLT5zY2xfdGltaW5nLmkzY19wcF9zZGFfd3Jfc2tldyk7CisJfQorCisJaWYg KHVzZV9kbWEpCisJCW5wY21faTNjX21hc3Rlcl9zdGFydF9kbWEobWFzdGVyKTsKKworcmV0cnlf c3RhcnQ6CisJd3JpdGVsKE5QQ01fSTNDX01DVFJMX1JFUVVFU1RfU1RBUlRfQUREUiB8CisJICAg ICAgIHhmZXJfdHlwZSB8CisJICAgICAgIGliaXJlc3AgfAorCSAgICAgICBOUENNX0kzQ19NQ1RS TF9ESVIocm53KSB8CisJICAgICAgIE5QQ01fSTNDX01DVFJMX0FERFIoYWRkcikgfAorCSAgICAg ICBOUENNX0kzQ19NQ1RSTF9SRFRFUk0ocmR0ZXJtKSwKKwkgICAgICAgbWFzdGVyLT5yZWdzICsg TlBDTV9JM0NfTUNUUkwpOworCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVn cyArIE5QQ01fSTNDX01TVEFUVVMsIHJlZywKKwkJCQkgTlBDTV9JM0NfTVNUQVRVU19NQ1RSTERP TkUocmVnKSwgMCwgMTAwMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAi eGZlciAoJWQpIHdhaXQgY3RybC1kb25lIHRpbWVvdXQsIG1zdGF0dXM9MHglMDJ4XG4iLAorCQkJ cm53LCByZWcpOworCQlnb3RvIGVtaXRfc3RvcDsKKwl9CisKKwltc3RhdHVzID0gcmVhZGwobWFz dGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisJaWYgKE5QQ01fSTNDX01TVEFUVVNfSUJJ V09OKG1zdGF0dXMpKSB7CisJCWlmIChybncpIHsKKwkJCWRldl9lcnIobWFzdGVyLT5kZXYsICJ4 ZmVyIHJlYWQ6IHJlLXN0YXJ0IGJ1dCBpYml3b24sIG1zdGF0dXM9MHglMDJ4XG4iLAorCQkJCQlt c3RhdHVzKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVtaXRfc3RvcDsKKwkJfQorCisJCXJl dCA9IG5wY21faTNjX21hc3Rlcl9oYW5kbGVfaWJpd29uKG1hc3RlciwgdHJ1ZSk7CisJCWlmIChy ZXQpIHsKKwkJCWRldl9lcnIobWFzdGVyLT5kZXYsICJ4ZmVyIHJlYWQ6IGhhbmRsZSBpYmkgZXZl bnQgZmFpbCwgcmV0PSVkXG4iLCByZXQpOworCQkJZ290byBlbWl0X3N0b3A7CisJCX0KKworCQlp ZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKSB7 CisJCQlkZXZfZXJyKG1hc3Rlci0+ZGV2LCAiYWJub3JtYWwgaWJpd29uIGV2ZW50c1xuIik7CisJ CQlnb3RvIGVtaXRfc3RvcDsKKwkJfQorCisJCS8qIENsZWFyIENPTVBMRVRFIHN0YXR1cyBvZiB0 aGlzIElCSSB0cmFuc2FjdGlvbiAqLworCQl3cml0ZWwoTlBDTV9JM0NfTUlOVF9DT01QTEVURSwg bWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7CisJCWdvdG8gcmV0cnlfc3RhcnQ7CisJ fQorCisJLyogVXNlIENPTVBMRVRFIGludGVycnVwdCBhcyBub3RpZmljYXRpb24gb2YgdHJhbnNm ZXIgY29tcGxldGlvbiAqLworCWlmICh1c2VfZG1hKQorCQlucGNtX2kzY19tYXN0ZXJfZW5hYmxl X2ludGVycnVwdHMobWFzdGVyLCBOUENNX0kzQ19NSU5UX0NPTVBMRVRFKTsKKworCWJ1c19sb2Nr ZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnJlcV9sb2NrLCBm bGFncyk7CisKKwlyZWcgPSByZWFkbChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKTsK KwlpZiAoTlBDTV9JM0NfTVNUQVRVU19OQUNLRUQocmVnKSkgeworCQlkZXZfZGJnKG1hc3Rlci0+ ZGV2LCAiYWRkciAweCV4IE5BQ0tcbiIsIGFkZHIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVt aXRfc3RvcDsKKwl9CisKKwlpZiAodXNlX2RtYSkKKwkJcmV0ID0gbnBjbV9pM2NfbWFzdGVyX3dh aXRfZm9yX2NvbXBsZXRlKG1hc3Rlcik7CisJZWxzZSBpZiAocm53KQorCQlyZXQgPSBucGNtX2kz Y19tYXN0ZXJfcmVhZChtYXN0ZXIsIGluLCB4ZmVyX2xlbik7CisJZWxzZQorCQlyZXQgPSBucGNt X2kzY19tYXN0ZXJfd3JpdGUobWFzdGVyLCBvdXQsIHhmZXJfbGVuKTsKKwlpZiAocmV0IDwgMCkK KwkJZ290byBlbWl0X3N0b3A7CisKKwlpZiAocm53KQorCQkqcmVhZF9sZW4gPSByZXQ7CisKKwlp ZiAoIXVzZV9kbWEpIHsKKwkJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KG1hc3Rlci0+cmVncyAr IE5QQ01fSTNDX01TVEFUVVMsIHJlZywKKwkJCQkJIE5QQ01fSTNDX01TVEFUVVNfQ09NUExFVEUo cmVnKSwgMCwgMTAwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVtaXRfc3RvcDsKKworCQkvKiBJ ZiB1c2VfZG1hLCBDT01QTEVURSBiaXQgaXMgY2xlYXJlZCBpbiB0aGUgaXNyICovCisJCXdyaXRl bChOUENNX0kzQ19NSU5UX0NPTVBMRVRFLCBtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVT KTsKKwl9CisKKworCWlmICghY29udGludWVkICYmICF1c2VfZG1hKSB7CisJCW5wY21faTNjX21h c3Rlcl9zZXRfc2RhX3NrZXcobWFzdGVyLCAwKTsKKwkJbnBjbV9pM2NfbWFzdGVyX2VtaXRfc3Rv cChtYXN0ZXIpOworCX0KKworCWlmICghdXNlX2RtYSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwor CWVsc2UKKwkJbnBjbV9pM2NfbWFzdGVyX2RtYV91bmxvY2soKTsKKworCXJldHVybiAwOworCitl bWl0X3N0b3A6CisJaWYgKHVzZV9kbWEpCisJCW5wY21faTNjX21hc3Rlcl9zdG9wX2RtYShtYXN0 ZXIpOworCisJaWYgKGJ1c19sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hc3Rl ci0+cmVxX2xvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtYXN0ZXItPnJlcV9s b2NrLCBmbGFncyk7CisKKwlucGNtX2kzY19tYXN0ZXJfc2V0X3NkYV9za2V3KG1hc3RlciwgMCk7 CisKKwlyZWcgPSByZWFkbChtYXN0ZXItPnJlZ3MgKyBOUENNX0kzQ19NU1RBVFVTKTsKKwlucGNt X2kzY19tYXN0ZXJfZW1pdF9zdG9wKG1hc3Rlcik7CisJbnBjbV9pM2NfbWFzdGVyX2NsZWFyX21l cnJ3YXJuKG1hc3Rlcik7CisJbnBjbV9pM2NfbWFzdGVyX2ZsdXNoX2ZpZm8obWFzdGVyKTsKKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnJlcV9sb2NrLCBmbGFncyk7CisKKwlpZiAo IXVzZV9kbWEpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwllbHNlCisJCW5wY21faTNjX21hc3Rl cl9kbWFfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5wY21f aTNjX3hmZXIgKgorbnBjbV9pM2NfbWFzdGVyX2FsbG9jX3hmZXIoc3RydWN0IG5wY21faTNjX21h c3RlciAqbWFzdGVyLCB1bnNpZ25lZCBpbnQgbmNtZHMpCit7CisJc3RydWN0IG5wY21faTNjX3hm ZXIgKnhmZXI7CisKKwl4ZmVyID0ga3phbGxvYyhzdHJ1Y3Rfc2l6ZSh4ZmVyLCBjbWRzLCBuY21k cyksIEdGUF9LRVJORUwpOworCWlmICgheGZlcikKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xJ U1RfSEVBRCgmeGZlci0+bm9kZSk7CisJeGZlci0+bmNtZHMgPSBuY21kczsKKwl4ZmVyLT5yZXQg PSAtRVRJTUVET1VUOworCisJcmV0dXJuIHhmZXI7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNj X21hc3Rlcl9mcmVlX3hmZXIoc3RydWN0IG5wY21faTNjX3hmZXIgKnhmZXIpCit7CisJa2ZyZWUo eGZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl9kZXF1ZXVlX3hmZXJfbG9j a2VkKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlciwKKwkJCQkJICAgICAgIHN0cnVjdCBu cGNtX2kzY194ZmVyICp4ZmVyKQoreworCWlmIChtYXN0ZXItPnhmZXJxdWV1ZS5jdXIgPT0geGZl cikKKwkJbWFzdGVyLT54ZmVycXVldWUuY3VyID0gTlVMTDsKKwllbHNlCisJCWxpc3RfZGVsX2lu aXQoJnhmZXItPm5vZGUpOworfQorCitzdGF0aWMgdm9pZCBucGNtX2kzY19tYXN0ZXJfZGVxdWV1 ZV94ZmVyKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlciwKKwkJCQkJc3RydWN0IG5wY21f aTNjX3hmZXIgKnhmZXIpCit7CisJbnBjbV9pM2NfbWFzdGVyX2RlcXVldWVfeGZlcl9sb2NrZWQo bWFzdGVyLCB4ZmVyKTsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX3N0YXJ0X3hm ZXJfbG9ja2VkKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgbnBj bV9pM2NfeGZlciAqeGZlciA9IG1hc3Rlci0+eGZlcnF1ZXVlLmN1cjsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCWludCByZXQsIGk7CisKKwlpZiAoIXhmZXIpCisJCXJldHVybjsKKworCS8qIFBy ZXZlbnQgZmlmbyBmbHVzaCB3aGlsZSBJQkkgaXNyIGlzIHJ1bm5pbmcgKi8KKwlzcGluX2xvY2tf aXJxc2F2ZSgmbWFzdGVyLT5yZXFfbG9jaywgZmxhZ3MpOworCW5wY21faTNjX21hc3Rlcl9jbGVh cl9tZXJyd2FybihtYXN0ZXIpOworCW5wY21faTNjX21hc3Rlcl9mbHVzaF9maWZvKG1hc3Rlcik7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5yZXFfbG9jaywgZmxhZ3MpOworCisJ Zm9yIChpID0gMDsgaSA8IHhmZXItPm5jbWRzOyBpKyspIHsKKwkJc3RydWN0IG5wY21faTNjX2Nt ZCAqY21kID0gJnhmZXItPmNtZHNbaV07CisKKwkJcmV0ID0gbnBjbV9pM2NfbWFzdGVyX3hmZXIo bWFzdGVyLCBjbWQtPnJudywgeGZlci0+dHlwZSwKKwkJCQkJICBjbWQtPmFkZHIsIGNtZC0+aW4s IGNtZC0+b3V0LAorCQkJCQkgIGNtZC0+bGVuLCAmY21kLT5yZWFkX2xlbiwKKwkJCQkJICBjbWQt PmNvbnRpbnVlZCwgY21kLT51c2VfZG1hLCAoaSA9PSAwKSk7CisJCWlmIChyZXQpCisJCQlicmVh azsKKwl9CisKKwl4ZmVyLT5yZXQgPSByZXQ7CisJY29tcGxldGUoJnhmZXItPmNvbXApOworCisJ aWYgKHJldCA8IDApCisJCW5wY21faTNjX21hc3Rlcl9kZXF1ZXVlX3hmZXJfbG9ja2VkKG1hc3Rl ciwgeGZlcik7CisKKwl4ZmVyID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZtYXN0ZXItPnhm ZXJxdWV1ZS5saXN0LAorCQkJCQlzdHJ1Y3QgbnBjbV9pM2NfeGZlciwKKwkJCQkJbm9kZSk7CisJ aWYgKHhmZXIpCisJCWxpc3RfZGVsX2luaXQoJnhmZXItPm5vZGUpOworCisJbWFzdGVyLT54ZmVy cXVldWUuY3VyID0geGZlcjsKKwlucGNtX2kzY19tYXN0ZXJfc3RhcnRfeGZlcl9sb2NrZWQobWFz dGVyKTsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX2VucXVldWVfeGZlcihzdHJ1 Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIsCisJCQkJCXN0cnVjdCBucGNtX2kzY194ZmVyICp4 ZmVyKQoreworCWluaXRfY29tcGxldGlvbigmeGZlci0+Y29tcCk7CisJaWYgKG1hc3Rlci0+eGZl cnF1ZXVlLmN1cikgeworCQlsaXN0X2FkZF90YWlsKCZ4ZmVyLT5ub2RlLCAmbWFzdGVyLT54ZmVy cXVldWUubGlzdCk7CisJfSBlbHNlIHsKKwkJbWFzdGVyLT54ZmVycXVldWUuY3VyID0geGZlcjsK KwkJbnBjbV9pM2NfbWFzdGVyX3N0YXJ0X3hmZXJfbG9ja2VkKG1hc3Rlcik7CisJfQorfQorCitz dGF0aWMgYm9vbAorbnBjbV9pM2NfbWFzdGVyX3N1cHBvcnRzX2NjY19jbWQoc3RydWN0IGkzY19t YXN0ZXJfY29udHJvbGxlciAqbWFzdGVyLAorCQkJCWNvbnN0IHN0cnVjdCBpM2NfY2NjX2NtZCAq Y21kKQoreworCS8qIE5vIHNvZnR3YXJlIHN1cHBvcnQgZm9yIENDQyBjb21tYW5kcyB0YXJnZXRp bmcgbW9yZSB0aGFuIG9uZSBzbGF2ZSAqLworCXJldHVybiAoY21kLT5uZGVzdHMgPT0gMSk7Cit9 CisKK3N0YXRpYyBpbnQgbnBjbV9pM2NfbWFzdGVyX3NlbmRfYmRjYXN0X2NjY19jbWQoc3RydWN0 IG5wY21faTNjX21hc3RlciAqbWFzdGVyLAorCQkJCQkgICAgICBzdHJ1Y3QgaTNjX2NjY19jbWQg KmNjYykKK3sKKwl1bnNpZ25lZCBpbnQgeGZlcl9sZW4gPSBjY2MtPmRlc3RzWzBdLnBheWxvYWQu bGVuICsgMTsKKwlzdHJ1Y3QgbnBjbV9pM2NfeGZlciAqeGZlcjsKKwlzdHJ1Y3QgbnBjbV9pM2Nf Y21kICpjbWQ7CisJdTggKmJ1ZjsKKwlpbnQgcmV0OworCisJeGZlciA9IG5wY21faTNjX21hc3Rl cl9hbGxvY194ZmVyKG1hc3RlciwgMSk7CisJaWYgKCF4ZmVyKQorCQlyZXR1cm4gLUVOT01FTTsK KworCWJ1ZiA9IGttYWxsb2MoeGZlcl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJ CW5wY21faTNjX21hc3Rlcl9mcmVlX3hmZXIoeGZlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0K KworCWJ1ZlswXSA9IGNjYy0+aWQ7CisJbWVtY3B5KCZidWZbMV0sIGNjYy0+ZGVzdHNbMF0ucGF5 bG9hZC5kYXRhLCBjY2MtPmRlc3RzWzBdLnBheWxvYWQubGVuKTsKKworCXhmZXItPnR5cGUgPSBO UENNX0kzQ19NQ1RSTF9UWVBFX0kzQzsKKworCWNtZCA9ICZ4ZmVyLT5jbWRzWzBdOworCWNtZC0+ YWRkciA9IGNjYy0+ZGVzdHNbMF0uYWRkcjsKKwljbWQtPnJudyA9IGNjYy0+cm53OworCWNtZC0+ aW4gPSBOVUxMOworCWNtZC0+b3V0ID0gYnVmOworCWNtZC0+bGVuID0geGZlcl9sZW47CisJY21k LT5yZWFkX2xlbiA9IDA7CisJY21kLT5jb250aW51ZWQgPSBmYWxzZTsKKworCW11dGV4X2xvY2so Jm1hc3Rlci0+bG9jayk7CisJbnBjbV9pM2NfbWFzdGVyX2VucXVldWVfeGZlcihtYXN0ZXIsIHhm ZXIpOworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ4ZmVyLT5jb21wLCBtc2Vj c190b19qaWZmaWVzKDEwMDApKSkKKwkJbnBjbV9pM2NfbWFzdGVyX2RlcXVldWVfeGZlcihtYXN0 ZXIsIHhmZXIpOworCW11dGV4X3VubG9jaygmbWFzdGVyLT5sb2NrKTsKKworCXJldCA9IHhmZXIt PnJldDsKKwlrZnJlZShidWYpOworCW5wY21faTNjX21hc3Rlcl9mcmVlX3hmZXIoeGZlcik7CisK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rlcl9zZW5kX2RpcmVj dF9jY2NfY21kKHN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlciwKKwkJCQkJICAgICAgc3Ry dWN0IGkzY19jY2NfY21kICpjY2MpCit7CisJdW5zaWduZWQgaW50IHhmZXJfbGVuID0gY2NjLT5k ZXN0c1swXS5wYXlsb2FkLmxlbjsKKwl1bnNpZ25lZCBpbnQgcmVhZF9sZW4gPSBjY2MtPnJudyA/ IHhmZXJfbGVuIDogMDsKKwlzdHJ1Y3QgbnBjbV9pM2NfeGZlciAqeGZlcjsKKwlzdHJ1Y3QgbnBj bV9pM2NfY21kICpjbWQ7CisJaW50IHJldDsKKworCXhmZXIgPSBucGNtX2kzY19tYXN0ZXJfYWxs b2NfeGZlcihtYXN0ZXIsIDIpOworCWlmICgheGZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl4 ZmVyLT50eXBlID0gTlBDTV9JM0NfTUNUUkxfVFlQRV9JM0M7CisKKwkvKiBCcm9hZGNhc3RlZCBt ZXNzYWdlICovCisJY21kID0gJnhmZXItPmNtZHNbMF07CisJY21kLT5hZGRyID0gSTNDX0JST0FE Q0FTVF9BRERSOworCWNtZC0+cm53ID0gMDsKKwljbWQtPmluID0gTlVMTDsKKwljbWQtPm91dCA9 ICZjY2MtPmlkOworCWNtZC0+bGVuID0gMTsKKwljbWQtPnJlYWRfbGVuID0gMDsKKwljbWQtPmNv bnRpbnVlZCA9IHRydWU7CisKKwkvKiBEaXJlY3RlZCBtZXNzYWdlICovCisJY21kID0gJnhmZXIt PmNtZHNbMV07CisJY21kLT5hZGRyID0gY2NjLT5kZXN0c1swXS5hZGRyOworCWNtZC0+cm53ID0g Y2NjLT5ybnc7CisJY21kLT5pbiA9IGNjYy0+cm53ID8gY2NjLT5kZXN0c1swXS5wYXlsb2FkLmRh dGEgOiBOVUxMOworCWNtZC0+b3V0ID0gY2NjLT5ybncgPyBOVUxMIDogY2NjLT5kZXN0c1swXS5w YXlsb2FkLmRhdGEsCisJY21kLT5sZW4gPSB4ZmVyX2xlbjsKKwljbWQtPnJlYWRfbGVuID0gcmVh ZF9sZW47CisJY21kLT5jb250aW51ZWQgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJm1hc3Rlci0+ bG9jayk7CisJbnBjbV9pM2NfbWFzdGVyX2VucXVldWVfeGZlcihtYXN0ZXIsIHhmZXIpOworCWlm ICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ4ZmVyLT5jb21wLCBtc2Vjc190b19qaWZm aWVzKDEwMDApKSkKKwkJbnBjbV9pM2NfbWFzdGVyX2RlcXVldWVfeGZlcihtYXN0ZXIsIHhmZXIp OworCW11dGV4X3VubG9jaygmbWFzdGVyLT5sb2NrKTsKKworCWlmIChjbWQtPnJlYWRfbGVuICE9 IHhmZXJfbGVuKQorCQljY2MtPmRlc3RzWzBdLnBheWxvYWQubGVuID0gY21kLT5yZWFkX2xlbjsK KworCXJldCA9IHhmZXItPnJldDsKKwlucGNtX2kzY19tYXN0ZXJfZnJlZV94ZmVyKHhmZXIpOwor CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBucGNtX2kzY19tYXN0ZXJfc2VuZF9jY2Nf Y21kKHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0sCisJCQkJICAgICAgIHN0cnVjdCBp M2NfY2NjX2NtZCAqY21kKQoreworCXN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3RlciA9IHRv X25wY21faTNjX21hc3RlcihtKTsKKwlib29sIGJyb2FkY2FzdCA9IGNtZC0+aWQgPCAweDgwOwor CWludCByZXQ7CisKKwlpZiAoYnJvYWRjYXN0KQorCQlyZXQgPSBucGNtX2kzY19tYXN0ZXJfc2Vu ZF9iZGNhc3RfY2NjX2NtZChtYXN0ZXIsIGNtZCk7CisJZWxzZQorCQlyZXQgPSBucGNtX2kzY19t YXN0ZXJfc2VuZF9kaXJlY3RfY2NjX2NtZChtYXN0ZXIsIGNtZCk7CisKKwlpZiAocmV0KSB7CisJ CWRldl9kYmcobWFzdGVyLT5kZXYsICJzZW5kIGNjYyAweCUwMnggJXMsIHJldCA9ICVkXG4iLAor CQkJCWNtZC0+aWQsIGJyb2FkY2FzdCA/ICIoYnJvYWRjYXN0KSIgOiAiIiwgcmV0KTsKKwkJY21k LT5lcnIgPSBJM0NfRVJST1JfTTI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBucGNtX2kzY19tYXN0ZXJfcHJpdl94ZmVycyhzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYsCisJ CQkJICAgICBzdHJ1Y3QgaTNjX3ByaXZfeGZlciAqeGZlcnMsCisJCQkJICAgICBpbnQgbnhmZXJz KQoreworCXN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpM2NfZGV2X2dldF9tYXN0 ZXIoZGV2KTsKKwlzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIgPSB0b19ucGNtX2kzY19t YXN0ZXIobSk7CisJc3RydWN0IG5wY21faTNjX2kyY19kZXZfZGF0YSAqZGF0YSA9IGkzY19kZXZf Z2V0X21hc3Rlcl9kYXRhKGRldik7CisJc3RydWN0IG5wY21faTNjX3hmZXIgKnhmZXI7CisJaW50 IHJldCwgaTsKKworCXhmZXIgPSBucGNtX2kzY19tYXN0ZXJfYWxsb2NfeGZlcihtYXN0ZXIsIG54 ZmVycyk7CisJaWYgKCF4ZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhmZXItPnR5cGUgPSBO UENNX0kzQ19NQ1RSTF9UWVBFX0kzQzsKKworCWZvciAoaSA9IDA7IGkgPCBueGZlcnM7IGkrKykg eworCQlzdHJ1Y3QgbnBjbV9pM2NfY21kICpjbWQgPSAmeGZlci0+Y21kc1tpXTsKKworCQljbWQt PmFkZHIgPSBtYXN0ZXItPmFkZHJzW2RhdGEtPmluZGV4XTsKKwkJY21kLT5ybncgPSB4ZmVyc1tp XS5ybnc7CisJCWNtZC0+aW4gPSB4ZmVyc1tpXS5ybncgPyB4ZmVyc1tpXS5kYXRhLmluIDogTlVM TDsKKwkJY21kLT5vdXQgPSB4ZmVyc1tpXS5ybncgPyBOVUxMIDogeGZlcnNbaV0uZGF0YS5vdXQ7 CisJCWNtZC0+bGVuID0geGZlcnNbaV0ubGVuOworCQljbWQtPnJlYWRfbGVuID0geGZlcnNbaV0u cm53ID8geGZlcnNbaV0ubGVuIDogMDsKKwkJY21kLT5jb250aW51ZWQgPSAoaSArIDEpIDwgbnhm ZXJzOworCQlpZiAobWFzdGVyLT51c2VfZG1hICYmIHhmZXJzW2ldLmxlbiA+IDEpCisJCQljbWQt PnVzZV9kbWEgPSB0cnVlOworCX0KKworCW11dGV4X2xvY2soJm1hc3Rlci0+bG9jayk7CisJbnBj bV9pM2NfbWFzdGVyX2VucXVldWVfeGZlcihtYXN0ZXIsIHhmZXIpOworCWlmICghd2FpdF9mb3Jf Y29tcGxldGlvbl90aW1lb3V0KCZ4ZmVyLT5jb21wLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKSkK KwkJbnBjbV9pM2NfbWFzdGVyX2RlcXVldWVfeGZlcihtYXN0ZXIsIHhmZXIpOworCW11dGV4X3Vu bG9jaygmbWFzdGVyLT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBueGZlcnM7IGkrKykgewor CQlzdHJ1Y3QgbnBjbV9pM2NfY21kICpjbWQgPSAmeGZlci0+Y21kc1tpXTsKKworCQlpZiAoeGZl cnNbaV0ucm53KQorCQkJeGZlcnNbaV0ubGVuID0gY21kLT5yZWFkX2xlbjsKKwl9CisJcmV0ID0g eGZlci0+cmV0OworCW5wY21faTNjX21hc3Rlcl9mcmVlX3hmZXIoeGZlcik7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rlcl9pMmNfeGZlcnMoc3RydWN0IGky Y19kZXZfZGVzYyAqZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX21zZyAqeGZlcnMsCisJ CQkJICAgIGludCBueGZlcnMpCit7CisJc3RydWN0IGkzY19tYXN0ZXJfY29udHJvbGxlciAqbSA9 IGkyY19kZXZfZ2V0X21hc3RlcihkZXYpOworCXN0cnVjdCBucGNtX2kzY19tYXN0ZXIgKm1hc3Rl ciA9IHRvX25wY21faTNjX21hc3RlcihtKTsKKwlzdHJ1Y3QgbnBjbV9pM2NfaTJjX2Rldl9kYXRh ICpkYXRhID0gaTJjX2Rldl9nZXRfbWFzdGVyX2RhdGEoZGV2KTsKKwlzdHJ1Y3QgbnBjbV9pM2Nf eGZlciAqeGZlcjsKKwlpbnQgcmV0LCBpOworCisJeGZlciA9IG5wY21faTNjX21hc3Rlcl9hbGxv Y194ZmVyKG1hc3RlciwgbnhmZXJzKTsKKwlpZiAoIXhmZXIpCisJCXJldHVybiAtRU5PTUVNOwor CisJeGZlci0+dHlwZSA9IE5QQ01fSTNDX01DVFJMX1RZUEVfSTJDOworCisJZm9yIChpID0gMDsg aSA8IG54ZmVyczsgaSsrKSB7CisJCXN0cnVjdCBucGNtX2kzY19jbWQgKmNtZCA9ICZ4ZmVyLT5j bWRzW2ldOworCisJCWNtZC0+YWRkciA9IG1hc3Rlci0+YWRkcnNbZGF0YS0+aW5kZXhdOworCQlj bWQtPnJudyA9IHhmZXJzW2ldLmZsYWdzICYgSTJDX01fUkQ7CisJCWNtZC0+aW4gPSBjbWQtPnJu dyA/IHhmZXJzW2ldLmJ1ZiA6IE5VTEw7CisJCWNtZC0+b3V0ID0gY21kLT5ybncgPyBOVUxMIDog eGZlcnNbaV0uYnVmOworCQljbWQtPmxlbiA9IHhmZXJzW2ldLmxlbjsKKwkJY21kLT5yZWFkX2xl biA9IGNtZC0+cm53ID8geGZlcnNbaV0ubGVuIDogMDsKKwkJY21kLT5jb250aW51ZWQgPSAoaSAr IDEgPCBueGZlcnMpOworCX0KKworCW11dGV4X2xvY2soJm1hc3Rlci0+bG9jayk7CisJbnBjbV9p M2NfbWFzdGVyX2VucXVldWVfeGZlcihtYXN0ZXIsIHhmZXIpOworCWlmICghd2FpdF9mb3JfY29t cGxldGlvbl90aW1lb3V0KCZ4ZmVyLT5jb21wLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKSkKKwkJ bnBjbV9pM2NfbWFzdGVyX2RlcXVldWVfeGZlcihtYXN0ZXIsIHhmZXIpOworCW11dGV4X3VubG9j aygmbWFzdGVyLT5sb2NrKTsKKworCXJldCA9IHhmZXItPnJldDsKKwlucGNtX2kzY19tYXN0ZXJf ZnJlZV94ZmVyKHhmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBucGNtX2kz Y19tYXN0ZXJfcmVxdWVzdF9pYmkoc3RydWN0IGkzY19kZXZfZGVzYyAqZGV2LAorCQkJCSAgICAg IGNvbnN0IHN0cnVjdCBpM2NfaWJpX3NldHVwICpyZXEpCit7CisJc3RydWN0IGkzY19tYXN0ZXJf Y29udHJvbGxlciAqbSA9IGkzY19kZXZfZ2V0X21hc3RlcihkZXYpOworCXN0cnVjdCBucGNtX2kz Y19tYXN0ZXIgKm1hc3RlciA9IHRvX25wY21faTNjX21hc3RlcihtKTsKKwlzdHJ1Y3QgbnBjbV9p M2NfaTJjX2Rldl9kYXRhICpkYXRhID0gaTNjX2Rldl9nZXRfbWFzdGVyX2RhdGEoZGV2KTsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpM2NfaWJpX3Nl dHVwIGliaV9yZXE7CisKKwlpZiAoZGV2LT5pYmktPm1heF9wYXlsb2FkX2xlbiA+IE5QQ01fSTND X01BWF9JQklfUEFZTE9BRF9TSVpFKSB7CisJCWRldl9lcnIobWFzdGVyLT5kZXYsICJJQkkgbWF4 IHBheWxvYWQgJWQgc2hvdWxkIGJlIDwgJWRcbiIsCisJCQlkZXYtPmliaS0+bWF4X3BheWxvYWRf bGVuLCBOUENNX0kzQ19NQVhfSUJJX1BBWUxPQURfU0laRSArIDEpOworCQlyZXR1cm4gLUVSQU5H RTsKKwl9CisKKwltZW1jcHkoJmliaV9yZXEsIHJlcSwgc2l6ZW9mKHN0cnVjdCBpM2NfaWJpX3Nl dHVwKSk7CisJaWJpX3JlcS5tYXhfcGF5bG9hZF9sZW4gPSBOUENNX0kzQ19NQVhfSUJJX1BBWUxP QURfU0laRTsKKwlkYXRhLT5pYmlfcG9vbCA9IGkzY19nZW5lcmljX2liaV9hbGxvY19wb29sKGRl diwgJmliaV9yZXEpOworCWlmIChJU19FUlIoZGF0YS0+aWJpX3Bvb2wpKQorCQlyZXR1cm4gUFRS X0VSUihkYXRhLT5pYmlfcG9vbCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5pYmku bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPmliaS5udW1fc2xvdHM7IGkr KykgeworCQlpZiAoIW1hc3Rlci0+aWJpLnNsb3RzW2ldKSB7CisJCQlkYXRhLT5pYmkgPSBpOwor CQkJbWFzdGVyLT5pYmkuc2xvdHNbaV0gPSBkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmliaS5sb2NrLCBmbGFncyk7CisKKwlpZiAoaSA8 IG1hc3Rlci0+aWJpLm51bV9zbG90cykKKwkJcmV0dXJuIDA7CisKKwlpM2NfZ2VuZXJpY19pYmlf ZnJlZV9wb29sKGRhdGEtPmliaV9wb29sKTsKKwlkYXRhLT5pYmlfcG9vbCA9IE5VTEw7CisKKwly ZXR1cm4gLUVOT1NQQzsKK30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX2ZyZWVfaWJp KHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRldikKK3sKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9s bGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7CisJc3RydWN0IG5wY21faTNjX21hc3Rl ciAqbWFzdGVyID0gdG9fbnBjbV9pM2NfbWFzdGVyKG0pOworCXN0cnVjdCBucGNtX2kzY19pMmNf ZGV2X2RhdGEgKmRhdGEgPSBpM2NfZGV2X2dldF9tYXN0ZXJfZGF0YShkZXYpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5pYmkubG9jaywgZmxh Z3MpOworCW1hc3Rlci0+aWJpLnNsb3RzW2RhdGEtPmliaV0gPSBOVUxMOworCWRhdGEtPmliaSA9 IC0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hc3Rlci0+aWJpLmxvY2ssIGZsYWdzKTsK KworCWkzY19nZW5lcmljX2liaV9mcmVlX3Bvb2woZGF0YS0+aWJpX3Bvb2wpOworfQorCitzdGF0 aWMgaW50IG5wY21faTNjX21hc3Rlcl9lbmFibGVfaWJpKHN0cnVjdCBpM2NfZGV2X2Rlc2MgKmRl dikKK3sKKwlzdHJ1Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFz dGVyKGRldik7CisJc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyID0gdG9fbnBjbV9pM2Nf bWFzdGVyKG0pOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgKi8KKwl3cml0ZWwo TlBDTV9JM0NfTUlOVF9TTFZTVEFSVCwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUyk7 CisJbnBjbV9pM2NfbWFzdGVyX2VuYWJsZV9pbnRlcnJ1cHRzKG1hc3RlciwgTlBDTV9JM0NfTUlO VF9TTFZTVEFSVCk7CisKKwlyZXR1cm4gaTNjX21hc3Rlcl9lbmVjX2xvY2tlZChtLCBkZXYtPmlu Zm8uZHluX2FkZHIsIEkzQ19DQ0NfRVZFTlRfU0lSKTsKK30KKworc3RhdGljIGludCBucGNtX2kz Y19tYXN0ZXJfZGlzYWJsZV9pYmkoc3RydWN0IGkzY19kZXZfZGVzYyAqZGV2KQoreworCXN0cnVj dCBpM2NfbWFzdGVyX2NvbnRyb2xsZXIgKm0gPSBpM2NfZGV2X2dldF9tYXN0ZXIoZGV2KTsKKwlz dHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIgPSB0b19ucGNtX2kzY19tYXN0ZXIobSk7CisJ aW50IHJldDsKKworCXdyaXRlbChOUENNX0kzQ19NSU5UX1NMVlNUQVJULCBtYXN0ZXItPnJlZ3Mg KyBOUENNX0kzQ19NSU5UQ0xSKTsKKworCXJldCA9IGkzY19tYXN0ZXJfZGlzZWNfbG9ja2VkKG0s IGRldi0+aW5mby5keW5fYWRkciwgSTNDX0NDQ19FVkVOVF9TSVIpOworCisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIHZvaWQgbnBjbV9pM2NfbWFzdGVyX3JlY3ljbGVfaWJpX3Nsb3Qoc3RydWN0 IGkzY19kZXZfZGVzYyAqZGV2LAorCQkJCQkgICAgc3RydWN0IGkzY19pYmlfc2xvdCAqc2xvdCkK K3sKKwlzdHJ1Y3QgbnBjbV9pM2NfaTJjX2Rldl9kYXRhICpkYXRhID0gaTNjX2Rldl9nZXRfbWFz dGVyX2RhdGEoZGV2KTsKKworCWkzY19nZW5lcmljX2liaV9yZWN5Y2xlX3Nsb3QoZGF0YS0+aWJp X3Bvb2wsIHNsb3QpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkzY19tYXN0ZXJfY29udHJv bGxlcl9vcHMgbnBjbV9pM2NfbWFzdGVyX29wcyA9IHsKKwkuYnVzX2luaXQgPSBucGNtX2kzY19t YXN0ZXJfYnVzX2luaXQsCisJLmJ1c19jbGVhbnVwID0gbnBjbV9pM2NfbWFzdGVyX2J1c19jbGVh bnVwLAorCS5hdHRhY2hfaTNjX2RldiA9IG5wY21faTNjX21hc3Rlcl9hdHRhY2hfaTNjX2RldiwK KwkuZGV0YWNoX2kzY19kZXYgPSBucGNtX2kzY19tYXN0ZXJfZGV0YWNoX2kzY19kZXYsCisJLnJl YXR0YWNoX2kzY19kZXYgPSBucGNtX2kzY19tYXN0ZXJfcmVhdHRhY2hfaTNjX2RldiwKKwkuYXR0 YWNoX2kyY19kZXYgPSBucGNtX2kzY19tYXN0ZXJfYXR0YWNoX2kyY19kZXYsCisJLmRldGFjaF9p MmNfZGV2ID0gbnBjbV9pM2NfbWFzdGVyX2RldGFjaF9pMmNfZGV2LAorCS5kb19kYWEgPSBucGNt X2kzY19tYXN0ZXJfZG9fZGFhLAorCS5zdXBwb3J0c19jY2NfY21kID0gbnBjbV9pM2NfbWFzdGVy X3N1cHBvcnRzX2NjY19jbWQsCisJLnNlbmRfY2NjX2NtZCA9IG5wY21faTNjX21hc3Rlcl9zZW5k X2NjY19jbWQsCisJLnByaXZfeGZlcnMgPSBucGNtX2kzY19tYXN0ZXJfcHJpdl94ZmVycywKKwku aTJjX3hmZXJzID0gbnBjbV9pM2NfbWFzdGVyX2kyY194ZmVycywKKwkucmVxdWVzdF9pYmkgPSBu cGNtX2kzY19tYXN0ZXJfcmVxdWVzdF9pYmksCisJLmZyZWVfaWJpID0gbnBjbV9pM2NfbWFzdGVy X2ZyZWVfaWJpLAorCS5yZWN5Y2xlX2liaV9zbG90ID0gbnBjbV9pM2NfbWFzdGVyX3JlY3ljbGVf aWJpX3Nsb3QsCisJLmVuYWJsZV9pYmkgPSBucGNtX2kzY19tYXN0ZXJfZW5hYmxlX2liaSwKKwku ZGlzYWJsZV9pYmkgPSBucGNtX2kzY19tYXN0ZXJfZGlzYWJsZV9pYmksCit9OworCitzdGF0aWMg aW50IG5wY21faTNjX21hc3Rlcl9wcmVwYXJlX2Nsa3Moc3RydWN0IG5wY21faTNjX21hc3RlciAq bWFzdGVyKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1h c3Rlci0+cGNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVw YXJlX2VuYWJsZShtYXN0ZXItPmZjbGspOworCWlmIChyZXQpIHsKKwkJY2xrX2Rpc2FibGVfdW5w cmVwYXJlKG1hc3Rlci0+cGNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIG5wY21faTNjX21hc3Rlcl91bnByZXBhcmVfY2xrcyhzdHJ1Y3QgbnBj bV9pM2NfbWFzdGVyICptYXN0ZXIpCit7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1hc3Rlci0+ cGNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1hc3Rlci0+ZmNsayk7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgZGVudHJ5ICpucGNtX2kzY19kZWJ1Z2ZzX2RpcjsKK3N0YXRpYyBpbnQgZGVidWdf c2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbnBjbV9pM2Nf bWFzdGVyICptYXN0ZXIgPSBzZXEtPnByaXZhdGU7CisKKwlzZXFfcHJpbnRmKHNlcSwgIk1TVEFU VVM9MHgleFxuIiwgcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTVNUQVRVUykpOworCXNl cV9wcmludGYoc2VxLCAiTUVSUldBUk49MHgleFxuIiwgcmVhZGwobWFzdGVyLT5yZWdzICsgTlBD TV9JM0NfTUVSUldBUk4pKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1DVFJMPTB4JXhcbiIsIHJlYWRs KG1hc3Rlci0+cmVncyArIE5QQ01fSTNDX01DVFJMKSk7CisJc2VxX3ByaW50ZihzZXEsICJNREFU QUNUUkw9MHgleFxuIiwgcmVhZGwobWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTURBVEFDVFJMKSk7 CisJc2VxX3ByaW50ZihzZXEsICJNQ09ORklHPTB4JXhcbiIsIHJlYWRsKG1hc3Rlci0+cmVncyAr IE5QQ01fSTNDX01DT05GSUcpKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0hPV19BVFRS SUJVVEUoZGVidWcpOworCitzdGF0aWMgdm9pZCBucGNtX2kzY19pbml0X2RlYnVnZnMoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgc3RydWN0IG5wY21faTNjX21hc3RlciAqbWFz dGVyKQoreworCWlmICghbnBjbV9pM2NfZGVidWdmc19kaXIpIHsKKwkJbnBjbV9pM2NfZGVidWdm c19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm5wY21faTNjIiwgTlVMTCk7CisJCWlmICghbnBj bV9pM2NfZGVidWdmc19kaXIpCisJCQlyZXR1cm47CisJfQorCisJbWFzdGVyLT5kZWJ1Z2ZzID0g ZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKCZwZGV2LT5kZXYpLAorCQkJCQkgICAgIG5wY21f aTNjX2RlYnVnZnNfZGlyKTsKKwlpZiAoIW1hc3Rlci0+ZGVidWdmcykKKwkJcmV0dXJuOworCisJ ZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCAwNDQ0LCBtYXN0ZXItPmRlYnVnZnMsIG1hc3Rl ciwgJmRlYnVnX2ZvcHMpOworfQorCitzdGF0aWMgaW50IG5wY21faTNjX3NldHVwX2RtYShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbnBjbV9pM2NfbWFzdGVyICptYXN0ZXIp Cit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwl1MzIgZG1hX2Nvbm4sIGRt YV9jdGwsIHJlZ19iYXNlOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9u b2RlLCAidXNlLWRtYSIpKQorCQlyZXR1cm4gMDsKKworCW1hc3Rlci0+ZG1hX3JlZ3MgPSBkZXZt X3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2VfYnluYW1lKHBkZXYsICJkbWEiKTsKKwlpZiAoSVNf RVJSKG1hc3Rlci0+ZG1hX3JlZ3MpKQorCQlyZXR1cm4gMDsKKworCW1hc3Rlci0+ZG1hX2N0bF9y ZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlX2J5bmFtZShwZGV2LCAiZG1hX2N0 bCIpOworCWlmIChJU19FUlIobWFzdGVyLT5kbWFfY3RsX3JlZ3MpKQorCQlyZXR1cm4gMDsKKwor CS8qIERNQSBUWCB0cmFuc2ZlciB3aWR0aCBpcyAzMiBiaXRzKE1XREFUQUIgd2lkdGgpIGZvciBl YWNoIGJ5dGUgc2VudCB0byBJM0MgYnVzICovCisJbWFzdGVyLT5kbWFfdHhfYnVmID0gZG1hX2Fs bG9jX2NvaGVyZW50KGRldiwgTUFYX0RNQV9DT1VOVCAqIDQsCisJCQkJCQkmbWFzdGVyLT5kbWFf dHhfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYXN0ZXItPmRtYV90eF9idWYpCisJCXJldHVy biAtRU5PTUVNOworCisJbWFzdGVyLT5kbWFfcnhfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KGRl diwgTUFYX0RNQV9DT1VOVCwKKwkJCQkJCSZtYXN0ZXItPmRtYV9yeF9hZGRyLCBHRlBfS0VSTkVM KTsKKwlpZiAoIW1hc3Rlci0+ZG1hX3J4X2J1ZikgeworCQlkbWFfZnJlZV9jb2hlcmVudChtYXN0 ZXItPmRldiwgTUFYX0RNQV9DT1VOVCAqIDQsIG1hc3Rlci0+ZG1hX3R4X2J1ZiwKKwkJCQkgIG1h c3Rlci0+ZG1hX3R4X2FkZHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFNl dCBETUEgY2hhbm5lbCBjb25uZWN0aXZpdHkKKwkgKiBjaGFubmVsIDA6IEkzQyBUWCwgY2hhbm5l bCAxOiBJM0MgUlgKKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25v ZGUsICJyZWciLCAwLCAmcmVnX2Jhc2UpOworCWRtYV9jb25uID0gTlBDTV9HRE1BX01VWChyZWdf YmFzZSk7CisJZG1hX2N0bCA9IEdETUFfQ0gwX0VOIHwgR0RNQV9DSDFfRU4gfCAoZG1hX2Nvbm4g KyAxKSA8PCAxNiB8IGRtYV9jb25uOworCXdyaXRlbChkbWFfY3RsLCBtYXN0ZXItPmRtYV9jdGxf cmVncyk7CisJbWFzdGVyLT51c2VfZG1hID0gdHJ1ZTsKKwlkZXZfaW5mbyhkZXYsICJVc2luZyBE TUEgKHJlcV9zZWwgJWQpXG4iLCBkbWFfY29ubik7CisKKwkvKgorCSAqIFNldHVwIEdETUEgQ2hh bm5lbCBmb3IgVFggKE1lbW9yeSB0byBJM0MgRklGTykKKwkgKi8KKwl3cml0ZWwobWFzdGVyLT5k bWFfdHhfYWRkciwgbWFzdGVyLT5kbWFfcmVncyArIE5QQ01fR0RNQV9TUkNCKERNQV9DSF9UWCkp OworCXdyaXRlbChyZWdfYmFzZSArIE5QQ01fSTNDX01XREFUQUIsIG1hc3Rlci0+ZG1hX3JlZ3Mg KworCSAgICAgICBOUENNX0dETUFfRFNUQihETUFfQ0hfVFgpKTsKKwkvKgorCSAqIFNldHVwIEdE TUEgQ2hhbm5lbCBmb3IgUlggKEkzQyBGSUZPIHRvIE1lbW9yeSkKKwkgKi8KKwl3cml0ZWwocmVn X2Jhc2UgKyBOUENNX0kzQ19NUkRBVEFCLCBtYXN0ZXItPmRtYV9yZWdzICsKKwkgICAgICAgTlBD TV9HRE1BX1NSQ0IoRE1BX0NIX1JYKSk7CisJd3JpdGVsKG1hc3Rlci0+ZG1hX3J4X2FkZHIsIG1h c3Rlci0+ZG1hX3JlZ3MgKyBOUENNX0dETUFfRFNUQihETUFfQ0hfUlgpKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IG5wY21faTNjX21hc3Rlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3Ry dWN0IG5wY21faTNjX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNl dDsKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwltYXN0ZXIgPSBkZXZtX2t6YWxsb2MoZGV2LCBz aXplb2YoKm1hc3RlciksIEdGUF9LRVJORUwpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVO T01FTTsKKworCW1hc3Rlci0+cmVncyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShw ZGV2LCAwKTsKKwlpZiAoSVNfRVJSKG1hc3Rlci0+cmVncykpCisJCXJldHVybiBQVFJfRVJSKG1h c3Rlci0+cmVncyk7CisKKwltYXN0ZXItPnBjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAicGNsayIp OworCWlmIChJU19FUlIobWFzdGVyLT5wY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIobWFzdGVyLT5w Y2xrKTsKKworCW1hc3Rlci0+ZmNsayA9IGRldm1fY2xrX2dldChkZXYsICJmYXN0X2NsayIpOwor CWlmIChJU19FUlIobWFzdGVyLT5mY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIobWFzdGVyLT5mY2xr KTsKKworCW1hc3Rlci0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAobWFz dGVyLT5pcnEgPCAwKQorCQlyZXR1cm4gbWFzdGVyLT5pcnE7CisKKwltYXN0ZXItPmRldiA9IGRl djsKKworCXJldCA9IG5wY21faTNjX21hc3Rlcl9wcmVwYXJlX2Nsa3MobWFzdGVyKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJcmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZw ZGV2LT5kZXYsIE5VTEwpOworCWlmICghSVNfRVJSKHJlc2V0KSkgeworCQlyZXNldF9jb250cm9s X2Fzc2VydChyZXNldCk7CisJCXVkZWxheSg1KTsKKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChy ZXNldCk7CisJfQorCUlOSVRfV09SSygmbWFzdGVyLT5oal93b3JrLCBucGNtX2kzY19tYXN0ZXJf aGpfd29yayk7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIG1hc3Rlci0+aXJxLCBucGNt X2kzY19tYXN0ZXJfaXJxX2hhbmRsZXIsCisJCQkgICAgICAgSVJRRl9OT19TVVNQRU5ELCAibnBj bS1pM2MtaXJxIiwgbWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2Nsa3M7 CisKKwltYXN0ZXItPmZyZWVfc2xvdHMgPSBHRU5NQVNLKE5QQ01fSTNDX01BWF9ERVZTIC0gMSwg MCk7CisKKwltdXRleF9pbml0KCZtYXN0ZXItPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtYXN0 ZXItPnhmZXJxdWV1ZS5saXN0KTsKKworCXNwaW5fbG9ja19pbml0KCZtYXN0ZXItPnJlcV9sb2Nr KTsKKwlzcGluX2xvY2tfaW5pdCgmbWFzdGVyLT5pYmkubG9jayk7CisJbWFzdGVyLT5pYmkubnVt X3Nsb3RzID0gTlBDTV9JM0NfTUFYX0RFVlM7CisJbWFzdGVyLT5pYmkuc2xvdHMgPSBkZXZtX2tj YWxsb2MoJnBkZXYtPmRldiwgbWFzdGVyLT5pYmkubnVtX3Nsb3RzLAorCQkJCQkgc2l6ZW9mKCpt YXN0ZXItPmliaS5zbG90cyksCisJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hc3Rlci0+aWJp LnNsb3RzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKwl9 CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCisJbnBjbV9pM2NfbWFz dGVyX3Jlc2V0KG1hc3Rlcik7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zf bm9kZSwgImVuYWJsZS1oaiIpKQorCQltYXN0ZXItPmVuX2hqID0gdHJ1ZTsKKwlpZiAoIW9mX3By b3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImkzYy1wcC1zY2wtaGktcGVyaW9kLW5zIiwg JnZhbCkpCisJCW1hc3Rlci0+c2NsX3RpbWluZy5pM2NfcHBfaGkgPSB2YWw7CisKKwlpZiAoIW9m X3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImkzYy1wcC1zY2wtbG8tcGVyaW9kLW5z IiwgJnZhbCkpCisJCW1hc3Rlci0+c2NsX3RpbWluZy5pM2NfcHBfbG8gPSB2YWw7CisKKwlpZiAo IW9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImkzYy1wcC1zZGEtcmQtc2tldyIs ICZ2YWwpKQorCQltYXN0ZXItPnNjbF90aW1pbmcuaTNjX3BwX3NkYV9yZF9za2V3ID0gdmFsOwor CisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJpM2MtcHAtc2RhLXdy LXNrZXciLCAmdmFsKSkKKwkJbWFzdGVyLT5zY2xfdGltaW5nLmkzY19wcF9zZGFfd3Jfc2tldyA9 IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiaTNjLW9k LXNjbC1oaS1wZXJpb2QtbnMiLCAmdmFsKSkKKwkJbWFzdGVyLT5zY2xfdGltaW5nLmkzY19vZF9o aSA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiaTNj LW9kLXNjbC1sby1wZXJpb2QtbnMiLCAmdmFsKSkKKwkJbWFzdGVyLT5zY2xfdGltaW5nLmkzY19v ZF9sbyA9IHZhbDsKKworCW5wY21faTNjX21hc3Rlcl9jbGVhcl9tZXJyd2FybihtYXN0ZXIpOwor CW5wY21faTNjX21hc3Rlcl9mbHVzaF9maWZvKG1hc3Rlcik7CisKKwlyZXQgPSBucGNtX2kzY19z ZXR1cF9kbWEocGRldiwgbWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2Ns a3M7CisKKwlucGNtX2kzY19pbml0X2RlYnVnZnMocGRldiwgbWFzdGVyKTsKKworCS8qIFJlZ2lz dGVyIHRoZSBtYXN0ZXIgKi8KKwlyZXQgPSBpM2NfbWFzdGVyX3JlZ2lzdGVyKCZtYXN0ZXItPmJh c2UsICZwZGV2LT5kZXYsCisJCQkJICAmbnBjbV9pM2NfbWFzdGVyX29wcywgZmFsc2UpOworCWlm IChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKworCWlmIChtYXN0ZXItPmVuX2hqKSB7 CisJCWRldl9pbmZvKG1hc3Rlci0+ZGV2LCAiZW5hYmxlIGhvdC1qb2luXG4iKTsKKwkJbnBjbV9p M2NfbWFzdGVyX2VuYWJsZV9pbnRlcnJ1cHRzKG1hc3RlciwgTlBDTV9JM0NfTUlOVF9TTFZTVEFS VCk7CisJfQorCXJldHVybiAwOworCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1hc3Rlci0+ ZGVidWdmcyk7CisKK2Vycl9kaXNhYmxlX2Nsa3M6CisJbnBjbV9pM2NfbWFzdGVyX3VucHJlcGFy ZV9jbGtzKG1hc3Rlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5wY21faTNj X21hc3Rlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qg bnBjbV9pM2NfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwor CS8qIEF2b2lkIGliaSBldmVudHMgZHVyaW5nIGRyaXZlciB1bmJpbmRpbmcgKi8KKwl3cml0ZWwo TlBDTV9JM0NfTUlOVF9TTFZTVEFSVCwgbWFzdGVyLT5yZWdzICsgTlBDTV9JM0NfTUlOVENMUik7 CisKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobWFzdGVyLT5kZWJ1Z2ZzKTsKKworCWkzY19t YXN0ZXJfdW5yZWdpc3RlcigmbWFzdGVyLT5iYXNlKTsKKworCWlmIChtYXN0ZXItPnVzZV9kbWEp IHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQobWFzdGVyLT5kZXYsIE1BWF9ETUFfQ09VTlQgKiA0LCBt YXN0ZXItPmRtYV90eF9idWYsCisJCQkJICBtYXN0ZXItPmRtYV90eF9hZGRyKTsKKwkJZG1hX2Zy ZWVfY29oZXJlbnQobWFzdGVyLT5kZXYsIE1BWF9ETUFfQ09VTlQsIG1hc3Rlci0+ZG1hX3J4X2J1 ZiwKKwkJCQkgIG1hc3Rlci0+ZG1hX3J4X2FkZHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbnBjbV9pM2NfbWFzdGVyX29mX21hdGNoX3Ri bFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnV2b3RvbixucGNtODQ1LWkzYyIgfSwKKwl7IC8q IHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbnBjbV9pM2NfbWFz dGVyX29mX21hdGNoX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5wY21f aTNjX21hc3RlciA9IHsKKwkucHJvYmUgPSBucGNtX2kzY19tYXN0ZXJfcHJvYmUsCisJLnJlbW92 ZSA9IG5wY21faTNjX21hc3Rlcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibnBj bTg0NS1pM2MtbWFzdGVyIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gbnBjbV9pM2NfbWFzdGVyX29m X21hdGNoX3RibCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobnBjbV9pM2NfbWFz dGVyKTsKKworTU9EVUxFX0FVVEhPUigiU3RhbmxleSBDaHUgPHlzY2h1QG51dm90b24uY29tPiIp OworTU9EVUxFX0FVVEhPUigiSmFtZXMgQ2hpYW5nIDxjcGNoaWFuZzFAbnV2b3Rvbi5jb20+Iik7 CitNT0RVTEVfREVTQ1JJUFRJT04oIk51dm90b24gTlBDTTg0NSBJM0MgbWFzdGVyIGRyaXZlciIp OworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotLSAKMi4zNC4xCgoKLS0gCmxpbnV4LWkzYyBtYWls aW5nIGxpc3QKbGludXgtaTNjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1pM2MK