Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757458AbXFZMeX (ORCPT ); Tue, 26 Jun 2007 08:34:23 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757372AbXFZMd6 (ORCPT ); Tue, 26 Jun 2007 08:33:58 -0400 Received: from wa-out-1112.google.com ([209.85.146.182]:29084 "EHLO wa-out-1112.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757327AbXFZMdy (ORCPT ); Tue, 26 Jun 2007 08:33:54 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type; b=hP9VYDqZlZ/eyfZ0CaxoSK4+TOBNHQ+naLwzSxlqX1ttUlet9uexXBpPtLQiZyeKpU/ChVg2+uLnbS2nOLM+DpjVYy+EtsCjufkrG85q/0DTfMva6o7PTtvyjhQoqk2O7TmYQ35XHIxy1E2jicoWhSG/1Mw4+X1HeZ0ii2wIH4I= Message-ID: <5d5443650706260533r218c05b1u5d4336015c4a4a9b@mail.gmail.com> Date: Tue, 26 Jun 2007 18:03:53 +0530 From: "Trilok Soni" To: linux-fbdev-devel@lists.sourceforge.net, adaplas@gmail.com, akpm@linux-foundation.org Subject: [PATCH 01/17] OMAP: Add TI OMAP framebuffer driver Cc: "Tony Lindgren" , imre.deak@solidboot.com, juha.yrjola@solidboot.com, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_17288_18739357.1182861233576" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 74472 Lines: 980 ------=_Part_17288_18739357.1182861233576 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline -- --Trilok Soni ------=_Part_17288_18739357.1182861233576 Content-Type: text/x-patch; name=0001-OMAP-Add-TI-OMAP-framebuffer-driver.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f3ecy40q Content-Disposition: attachment; filename="0001-OMAP-Add-TI-OMAP-framebuffer-driver.patch" RnJvbSBhMTRlYTk4NjVjNTNhN2U0MTYxODE1NDQwMWYwMDRmZDFiYjM1YzkwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBJbXJlIERlYWsgPGltcmUuZGVha0Bzb2xpZGJvb3QuY29tPgpE YXRlOiBUdWUsIDI2IEp1biAyMDA3IDE2OjQ3OjA5ICswNTMwClN1YmplY3Q6IFtQQVRDSCAwMS8x N10gT01BUDogQWRkIFRJIE9NQVAgZnJhbWVidWZmZXIgZHJpdmVyLgoKLSBBZGQgVGV4YXMgSW5z dHJ1bWVudHMgT01BUCBmcmFtZWJ1ZmZlciBkcml2ZXIuIFRoaXMKZHJpdmVyIGlzIGJlaW5nIHVz ZWQgZm9yIHZhcmlvdXMgT01BUDEvMiBzZXJpZXMgYmFzZWQKYm9hcmRzIGFuZCBwcm9kdWN0cyBl LmcgTm9raWEgTjgwMCBJbnRlcm5ldCBUYWJsZXQsCkg0LCBIMywgU2llbWVucyBTWDEgZXRjLgoK LSBMQ0QgcGFuZWwgcmVnaXN0cmF0aW9uIGFuZCBjb250cm9sbGVyIGNvZGUgaXMgc2VwYXJhdGVk CiAgaW4gZGlmZmVyZW50IGZpbGUgYW5kIGludGVyZmFjZXMuCgpTaWduZWQtb2ZmLWJ5OiBUcmls b2sgU29uaSA8c29uaS50cmlsb2tAZ21haWwuY29tPgotLS0KIGRyaXZlcnMvdmlkZW8vS2NvbmZp ZyAgICAgICAgICAgIHwgICAgNCArCiBkcml2ZXJzL3ZpZGVvL01ha2VmaWxlICAgICAgICAgICB8 ICAgIDEgKwogZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcgICAgICAgfCAgIDM4ICsKIGRyaXZl cnMvdmlkZW8vb21hcC9NYWtlZmlsZSAgICAgIHwgICAxMCArCiBkcml2ZXJzL3ZpZGVvL29tYXAv b21hcGZiX21haW4uYyB8IDE5NDEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKIDUgZmlsZXMgY2hhbmdlZCwgMTk5NCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zp ZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggNDAzZGFjNy4uYzY0ZjJi MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8v S2NvbmZpZwpAQCAtMTgyMCw2ICsxODIwLDEwIEBAIGNvbmZpZyBGQl9YSUxJTlgKIAkgIGZyYW1l YnVmZmVyLiBNTDMwMCBjYXJyaWVzIGEgNjQwKjQ4MCBMQ0QgZGlzcGxheSBvbiB0aGUgYm9hcmQs CiAJICBNTDQwMyB1c2VzIGEgc3RhbmRhcmQgREIxNSBWR0EgY29ubmVjdG9yLgogCitpZiBBUkNI X09NQVAKKwlzb3VyY2UgImRyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIgorZW5kaWYKKwogY29u ZmlnIEZCX1ZJUlRVQUwKIAl0cmlzdGF0ZSAiVmlydHVhbCBGcmFtZSBCdWZmZXIgc3VwcG9ydCAo T05MWSBGT1IgVEVTVElORyEpIgogCWRlcGVuZHMgb24gRkIKZGlmZiAtLWdpdCBhL2RyaXZlcnMv dmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IGJkOGIwNTIuLmE1 NjJmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92 aWRlby9NYWtlZmlsZQpAQCAtMTEzLDYgKzExMyw3IEBAIG9iai0kKENPTkZJR19GQl9JQk1fR1hU NDUwMCkJICArPSBneHQ0NTAwLm8KIG9iai0kKENPTkZJR19GQl9QUzMpCQkgICs9IHBzM2ZiLm8K IG9iai0kKENPTkZJR19GQl9TTTUwMSkgICAgICAgICAgICArPSBzbTUwMWZiLm8KIG9iai0kKENP TkZJR19GQl9YSUxJTlgpICAgICAgICAgICArPSB4aWxpbnhmYi5vCitvYmotJChDT05GSUdfRkJf T01BUCkgICAgICAgICAgICAgKz0gb21hcC8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2 ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9WRVNBKSAgICAgICAgICAgICArPSB2ZXNhZmIu bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVv L29tYXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdkYjg0 Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKQEAgLTAsMCAr MSwzOCBAQAorY29uZmlnIEZCX09NQVAKKwl0cmlzdGF0ZSAiT01BUCBmcmFtZSBidWZmZXIgc3Vw cG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEZCCisJc2VsZWN0IEZCX0NGQl9GSUxM UkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAor CWhlbHAKKyAgICAgICAgICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBPTUFQIGJhc2VkIGJvYXJk cy4KKworY29uZmlnIEZCX09NQVBfQk9PVExPQURFUl9JTklUCisJYm9vbCAiQ2hlY2sgYm9vdGxv YWRlciBpbml0aWFsaXphaW9uIgorCWRlcGVuZHMgb24gRkJfT01BUAorCWhlbHAKKwkgIFNheSBZ IGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGNoZWNraW5nIGlmIHRoZSBib290bG9hZGVyIGhh cworCSAgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgZGlzcGxheSBjb250cm9sbGVyLiBJbiB0aGlz IGNhc2UgdGhlCisJICBkcml2ZXIgd2lsbCBza2lwIHRoZSBpbml0aWFsaXphdGlvbi4KKworY29u ZmlnIEZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRQorCWludCAiQ29uc2lzdGVudCBETUEgbWVt b3J5IHNpemUgKE1CKSIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwlyYW5nZSAxIDE0CisJZGVmYXVs dCAyCisJaGVscAorCSAgSW5jcmVhc2UgdGhlIERNQSBjb25zaXN0ZW50IG1lbW9yeSBzaXplIGFj Y29yZGluZyB0byB5b3VyIHZpZGVvCisJICBtZW1vcnkgbmVlZHMsIGZvciBleGFtcGxlIGlmIHlv dSB3YW50IHRvIHVzZSBtdWx0aXBsZSBwbGFuZXMuCisJICBUaGUgc2l6ZSBtdXN0IGJlIDJNQiBh bGlnbmVkLgorCSAgSWYgdW5zdXJlIHNheSAxLgorCitjb25maWcgRkJfT01BUF9ETUFfVFVORQor ICAgICAgICBib29sICJTZXQgRE1BIFNEUkFNIGFjY2VzcyBwcmlvcml0eSBoaWdoIgorICAgICAg ICBkZXBlbmRzIG9uIEZCX09NQVAgJiYgQVJDSF9PTUFQMQorICAgICAgICBoZWxwCisgICAgICAg ICAgT24gc3lzdGVtcyBpbiB3aGljaCB2aWRlbyBtZW1vcnkgaXMgaW4gc3lzdGVtIG1lbW9yeQor ICAgICAgICAgIChTRFJBTSkgdGhpcyB3aWxsIHNwZWVkIHVwIGdyYXBoaWNzIERNQSBvcGVyYXRp b25zLgorICAgICAgICAgIElmIHlvdSBoYXZlIHN1Y2ggYSBzeXN0ZW0gYW5kIHdhbnQgdG8gdXNl IHJvdGF0aW9uCisgICAgICAgICAgYW5zd2VyIHllcy4gQW5zd2VyIG5vIGlmIHlvdSBoYXZlIGEg ZGVkaWNhdGVkIHZpZGVvCisgICAgICAgICAgbWVtb3J5LCBvciBkb24ndCB1c2UgYW55IG9mIHRo ZSBhY2NlbGVyYXRlZCBmZWF0dXJlcy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFw L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjVhYTcxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Zp ZGVvL29tYXAvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhl IG5ldyBPTUFQIGZyYW1lYnVmZmVyIGRldmljZSBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0ZC X09NQVApICs9IG9tYXBmYi5vCisKK29ianMteXkgOj0gb21hcGZiX21haW4ubworCitvbWFwZmIt b2JqcyA6PSAkKG9ianMteXkpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFw ZmJfbWFpbi5jIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkMGY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyoKKyAqIEZy YW1lYnVmZmVyIGRyaXZlciBmb3IgVEkgT01BUCBib2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMp IDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtA bm9raWEuY29tPgorICoKKyAqIEFja25vd2xlZGdlbWVudHM6CisgKiAgIEFsZXggTWNNYWlucyA8 YWFtQHJpZGdlcnVuLmNvbT4gICAgICAgLSBPcmlnaW5hbCBkcml2ZXIKKyAqICAgSnVoYSBZcmpv bGEgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4gICAtIE9yaWdpbmFsIGRyaXZlciBhbmQgaW1wcm92 ZW1lbnRzCisgKiAgIERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAgLSBjaGFu Z2VzIGZvciAyLjYga2VybmVsIEFQSQorICogICBUZXhhcyBJbnN0cnVtZW50cyAgICAgICAgICAg ICAgICAgICAgIC0gSDMgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg KgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0 aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIx MTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4K KyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4K KworI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiIgorCitzdGF0aWMgdW5zaWduZWQgaW50CWRl Zl9hY2NlbDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWRlZl92cmFtW09NQVBGQl9QTEFORV9OVU1d Oworc3RhdGljIGludAkJZGVmX3ZyYW1fY250Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3Z4 cmVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3Z5cmVzOworc3RhdGljIHVuc2lnbmVkIGlu dAlkZWZfcm90YXRlOworc3RhdGljIHVuc2lnbmVkIGludAlkZWZfbWlycm9yOworCisjaWZkZWYg Q09ORklHX0ZCX09NQVBfTUFOVUFMX1VQREFURQorc3RhdGljIGludAkJbWFudWFsX3VwZGF0ZSA9 IDE7CisjZWxzZQorc3RhdGljIGludAkJbWFudWFsX3VwZGF0ZTsKKyNlbmRpZgorCitzdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RldmljZQkqZmJkZXZfcGRldjsKK3N0YXRpYyBzdHJ1Y3QgbGNkX3Bh bmVsCQkqZmJkZXZfcGFuZWw7CitzdGF0aWMgc3RydWN0IG9tYXBmYl9kZXZpY2UJKm9tYXBmYl9k ZXY7CisKK3N0cnVjdCBjYXBzX3RhYmxlX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmbGFnOwor CWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNhcHNfdGFibGVfc3RydWN0 IGN0cmxfY2Fwc1tdID0geworCXsgT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURSwgICJtYW51YWwg dXBkYXRlIiB9LAorCXsgT01BUEZCX0NBUFNfVEVBUlNZTkMsICAgICAgICJ0ZWFyaW5nIHN5bmNo cm9uaXphdGlvbiIgfSwKKwl7IE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTSwgInJlbG9j YXRlIHBsYW5lIG1lbW9yeSIgfSwKKwl7IE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFLCAgICAic2Nh bGUgcGxhbmUiIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFLCAicGl4ZWwg ZG91YmxlIHdpbmRvdyIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19TQ0FMRSwgICAic2NhbGUg d2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVksICJvdmVybGF5IHdpbmRv dyIgfSwKKwl7IE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQsICAiYmFja2xpZ2h0IHNldHRpbmci IH0sCit9OworCitzdGF0aWMgc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IGNvbG9yX2NhcHNbXSA9 IHsKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSwJIlJHQjU2NSIsIH0sCisJeyAxIDw8IE9N QVBGQl9DT0xPUl9ZVVY0MjIsCSJZVVY0MjIiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfWVVW NDIwLAkiWVVWNDIwIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfOEJQUCwJIkNMVVQ4 IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfNEJQUCwJIkNMVVQ0IiwgfSwKKwl7IDEg PDwgT01BUEZCX0NPTE9SX0NMVVRfMkJQUCwJIkNMVVQyIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NP TE9SX0NMVVRfMUJQUCwJIkNMVVQxIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1JHQjQ0NCwJ IlJHQjQ0NCIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVk0MjIsCSJZVVk0MjIiLCB9LAor fTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTENEIHBhbmVsCisgKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqLworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBvbWFwMV9pbnRfY3RybDsK K2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfaW50X2N0cmw7CitleHRlcm4gc3RydWN0IGxj ZF9jdHJsIGh3YTc0Ml9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJs OworCitzdGF0aWMgc3RydWN0IGxjZF9jdHJsICpjdHJsc1tdID0geworI2lmZGVmIENPTkZJR19B UkNIX09NQVAxCisJJm9tYXAxX2ludF9jdHJsLAorI2Vsc2UKKwkmb21hcDJfaW50X2N0cmwsCisj ZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfSFdBNzQyCisJJmh3YTc0Ml9jdHJs LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19CTElaWkFSRAorCSZibGl6emFy ZF9jdHJsLAorI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5B TAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCitleHRlcm4gc3RydWN0IGxjZF9jdHJsX2V4dGlm IG9tYXAxX2V4dF9pZjsKKyNlbHNlCitleHRlcm4gc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAy X2V4dF9pZjsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9tYXBmYl9ycXVldWVfbG9j ayhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJbXV0ZXhfbG9jaygmZmJkZXYtPnJx dWV1ZV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9ycXVldWVfdW5sb2NrKHN0cnVj dCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF91bmxvY2soJmZiZGV2LT5ycXVldWVf bXV0ZXgpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMQ0QgY29udHJvbGxl ciBhbmQgTENEIERNQQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIExvb2t1cCB0YWJs ZSB0byBtYXAgZWxlbSBzaXplIHRvIGVsZW0gdHlwZS4gKi8KK3N0YXRpYyBjb25zdCBpbnQgZG1h X2VsZW1fdHlwZVtdID0geworCTAsCisJT01BUF9ETUFfREFUQV9UWVBFX1M4LAorCU9NQVBfRE1B X0RBVEFfVFlQRV9TMTYsCisJMCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzMyLAorfTsKKworLyoK KyAqIEFsbG9jYXRlIHJlc291cmNlcyBuZWVkZWQgZm9yIExDRCBjb250cm9sbGVyIGFuZCBMQ0Qg RE1BIG9wZXJhdGlvbnMuIFZpZGVvCisgKiBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gc3lzdGVt IG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgZGlzcGxheQorICogc2l6ZSwgZXhjZXB0 IGlmIGEgYmlnZ2VyIG1lbW9yeSBzaXplIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5IGFzIGEga2Vy bmVsCisgKiBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgY3RybF9pbml0KHN0cnVjdCBvbWFw ZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKwlpbnQgaTsKKworCS8qIGtlcm5lbC9tb2R1 bGUgdnJhbSBwYXJhbWV0ZXJzIG92ZXJyaWRlIGJvb3QgdGFncy9ib2FyZCBjb25maWcgKi8KKwlp ZiAoZGVmX3ZyYW1fY250KSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWZfdnJhbV9jbnQ7IGkrKykK KwkJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSA9CisJCQkJUEFHRV9BTElHTihkZWZf dnJhbVtpXSk7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250ID0gaTsKKwl9IGVsc2Ugewor CQlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmNvbmY7CisKKwkJY29uZiA9IGZiZGV2LT5k ZXYtPnBsYXRmb3JtX2RhdGE7CisJCWZiZGV2LT5tZW1fZGVzYyA9IGNvbmYtPm1lbV9kZXNjOwor CX0KKworCWlmICghZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQpIHsKKwkJc3RydWN0IGxjZF9w YW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJCWludCBkZWZfc2l6ZTsKKwkJaW50IGJwcCA9 IHBhbmVsLT5icHA7CisKKwkJLyogMTIgYnBwIGlzIHBhY2tlZCBpbiAxNiBiaXRzICovCisJCWlm IChicHAgPT0gMTIpCisJCQlicHAgPSAxNjsKKwkJZGVmX3NpemUgPSBkZWZfdnhyZXMgKiBkZWZf dnlyZXMgKiBicHAgLyA4OworCQlmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCA9IDE7CisJCWZi ZGV2LT5tZW1fZGVzYy5yZWdpb25bMF0uc2l6ZSA9IFBBR0VfQUxJR04oZGVmX3NpemUpOworCX0K KwlyID0gZmJkZXYtPmN0cmwtPmluaXQoZmJkZXYsIDAsICZmYmRldi0+bWVtX2Rlc2MpOworCWlm IChyIDwgMCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjb250cm9sbGVyIGluaXRpYWxpemF0 aW9uIGZhaWxlZCAoJWQpXG4iLAorCQkJcik7CisJCXJldHVybiByOworCX0KKworI2lmZGVmIERF QlVHCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsK KwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAicmVnaW9uJWQgcGh5cyAlMDh4IHZpcnQgJXAgc2l6ZT0l bHVcbiIsCisJCQkgaSwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnBhZGRyLAorCQkJ IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0udmFkZHIsCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJl Z2lvbltpXS5zaXplKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg Y3RybF9jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlmYmRldi0+Y3Ry bC0+Y2xlYW51cCgpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGZiZGV2LT5ycXVldWVf bXV0ZXggaGVsZC4gKi8KK3N0YXRpYyBpbnQgY3RybF9jaGFuZ2VfbW9kZShzdHJ1Y3QgZmJfaW5m byAqZmJpKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBvbWFw ZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNl ICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9 ICZmYmktPnZhcjsKKworCW9mZnNldCA9IHZhci0+eW9mZnNldCAqIGZiaS0+Zml4LmxpbmVfbGVu Z3RoICsKKwkJIHZhci0+eG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCisJaWYg KGZiZGV2LT5jdHJsLT5zeW5jKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCXIgPSBmYmRldi0+ Y3RybC0+c2V0dXBfcGxhbmUocGxhbmUtPmlkeCwgcGxhbmUtPmluZm8uY2hhbm5lbF9vdXQsCisJ CQkJIG9mZnNldCwgdmFyLT54cmVzX3ZpcnR1YWwsCisJCQkJIHBsYW5lLT5pbmZvLnBvc194LCBw bGFuZS0+aW5mby5wb3NfeSwKKwkJCQkgdmFyLT54cmVzLCB2YXItPnlyZXMsIHBsYW5lLT5jb2xv cl9tb2RlKTsKKwlpZiAoZmJkZXYtPmN0cmwtPnNldF9zY2FsZSAhPSBOVUxMKQorCQlyID0gZmJk ZXYtPmN0cmwtPnNldF9zY2FsZShwbGFuZS0+aWR4LAorCQkJCSAgIHZhci0+eHJlcywgdmFyLT55 cmVzLAorCQkJCSAgIHBsYW5lLT5pbmZvLm91dF93aWR0aCwKKwkJCQkgICBwbGFuZS0+aW5mby5v dXRfaGVpZ2h0KTsKKworCXJldHVybiByOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKiBmYmRldiBmcmFtZXdvcmsgY2FsbGJhY2tzIGFuZCB0aGUgaW9jdGwgaW50ZXJmYWNlCisg KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogQ2FsbGVkIGVhY2ggdGltZSB0aGUgb21hcGZi IGRldmljZSBpcyBvcGVuZWQgKi8KK3N0YXRpYyBpbnQgb21hcGZiX29wZW4oc3RydWN0IGZiX2lu Zm8gKmluZm8sIGludCB1c2VyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbWFw ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKKy8qIENhbGxlZCB3aGVuIHRoZSBvbWFw ZmIgZGV2aWNlIGlzIGNsb3NlZC4gV2UgbWFrZSBzdXJlIHRoYXQgYW55IHBlbmRpbmcKKyAqIGdm eCBETUEgb3BlcmF0aW9ucyBhcmUgZW5kZWQsIGJlZm9yZSB3ZSByZXR1cm4uICovCitzdGF0aWMg aW50IG9tYXBmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlv bWFwZmJfc3luYyhpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcmUgYSBzaW5nbGUgY29s b3IgcGFsZXR0ZSBlbnRyeSBpbnRvIGEgcHNldWRvIHBhbGV0dGUgb3IgdGhlIGhhcmR3YXJlCisg KiBwYWxldHRlIGlmIG9uZSBpcyBhdmFpbGFibGUuIEZvciBub3cgd2Ugc3VwcG9ydCBvbmx5IDE2 YnBwIGFuZCB0aHVzIHN0b3JlCisgKiB0aGUgZW50cnkgb25seSB0byB0aGUgcHNldWRvIHBhbGV0 dGUuCisgKi8KK3N0YXRpYyBpbnQgX3NldGNvbHJlZyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9p bnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sCisJCQl1X2ludCBibHVlLCB1X2ludCB0 cmFuc3AsIGludCB1cGRhdGVfaHdfcGFsKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0 ICpwbGFuZSA9IGluZm8tPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFu ZS0+ZmJkZXY7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwor CWludCByID0gMDsKKworCXN3aXRjaCAocGxhbmUtPmNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBG Ql9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCWNhc2UgT01BUEZC X0NPTE9SX1lVWTQyMjoKKwkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NP TE9SX0NMVVRfOEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzRCUFA6CisJY2FzZSBPTUFQ RkJfQ09MT1JfQ0xVVF8yQlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfMUJQUDoKKwkJaWYg KGZiZGV2LT5jdHJsLT5zZXRjb2xyZWcpCisJCQlyID0gZmJkZXYtPmN0cmwtPnNldGNvbHJlZyhy ZWdubywgcmVkLCBncmVlbiwgYmx1ZSwKKwkJCQkJCQl0cmFuc3AsIHVwZGF0ZV9od19wYWwpOwor CQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwljYXNlIE9N QVBGQl9DT0xPUl9SR0I0NDQ6CisJCWlmIChyICE9IDApCisJCQlicmVhazsKKworCQlpZiAocmVn bm8gPCAwKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJlZ25v IDwgMTYpIHsKKwkJCXUxNiBwYWw7CisJCQlwYWwgPSAoKHJlZCA+PiAoMTYgLSB2YXItPnJlZC5s ZW5ndGgpKSA8PAorCQkJCQl2YXItPnJlZC5vZmZzZXQpIHwKKwkJCSAgICAgICgoZ3JlZW4gPj4g KDE2IC0gdmFyLT5ncmVlbi5sZW5ndGgpKSA8PAorCQkJCQl2YXItPmdyZWVuLm9mZnNldCkgfAor CQkJICAgICAgKGJsdWUgPj4gKDE2IC0gdmFyLT5ibHVlLmxlbmd0aCkpOworCQkJKCh1MzIgKiko aW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBwYWw7CisJCX0KKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJQlVHKCk7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9z ZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUs CisJCQkgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4g X3NldGNvbHJlZyhpbmZvLCByZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgdHJhbnNwLCAxKTsKK30K Kworc3RhdGljIGludCBvbWFwZmJfc2V0Y21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgc3RydWN0 IGZiX2luZm8gKmluZm8pCit7CisJaW50IGNvdW50LCBpbmRleCwgcjsKKwl1MTYgKnJlZCwgKmdy ZWVuLCAqYmx1ZSwgKnRyYW5zcDsKKwl1MTYgdHJhbnMgPSAweGZmZmY7CisKKwlyZWQgICAgID0g Y21hcC0+cmVkOworCWdyZWVuICAgPSBjbWFwLT5ncmVlbjsKKwlibHVlICAgID0gY21hcC0+Ymx1 ZTsKKwl0cmFuc3AgID0gY21hcC0+dHJhbnNwOworCWluZGV4ICAgPSBjbWFwLT5zdGFydDsKKwor CWZvciAoY291bnQgPSAwOyBjb3VudCA8IGNtYXAtPmxlbjsgY291bnQrKykgeworCQlpZiAodHJh bnNwKQorCQkJdHJhbnMgPSAqdHJhbnNwKys7CisJCXIgPSBfc2V0Y29scmVnKGluZm8sIGluZGV4 KyssICpyZWQrKywgKmdyZWVuKyssICpibHVlKyssIHRyYW5zLAorCQkJCWNvdW50ID09IGNtYXAt PmxlbiAtIDEpOworCQlpZiAociAhPSAwKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV9mdWxsX3NjcmVlbihzdHJ1Y3QgZmJfaW5m byAqZmJpKTsKKworc3RhdGljIGludCBvbWFwZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJf aW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+ cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQg ZG9fdXBkYXRlID0gMDsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYp OworCXN3aXRjaCAoYmxhbmspIHsKKwljYXNlIFZFU0FfTk9fQkxBTktJTkc6CisJCWlmIChmYmRl di0+c3RhdGUgPT0gT01BUEZCX1NVU1BFTkRFRCkgeworCQkJaWYgKGZiZGV2LT5jdHJsLT5yZXN1 bWUpCisJCQkJZmJkZXYtPmN0cmwtPnJlc3VtZSgpOworCQkJZmJkZXYtPnBhbmVsLT5lbmFibGUo ZmJkZXYtPnBhbmVsKTsKKwkJCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9BQ1RJVkU7CisJCQlpZiAo ZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpID09CisJCQkJCU9NQVBGQl9NQU5VQUxfVVBE QVRFKQorCQkJCWRvX3VwZGF0ZSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRVNBX1BPV0VS RE9XTjoKKwkJaWYgKGZiZGV2LT5zdGF0ZSA9PSBPTUFQRkJfQUNUSVZFKSB7CisJCQlmYmRldi0+ cGFuZWwtPmRpc2FibGUoZmJkZXYtPnBhbmVsKTsKKwkJCWlmIChmYmRldi0+Y3RybC0+c3VzcGVu ZCkKKwkJCQlmYmRldi0+Y3RybC0+c3VzcGVuZCgpOworCQkJZmJkZXYtPnN0YXRlID0gT01BUEZC X1NVU1BFTkRFRDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9 CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJaWYgKHIgPT0gMCAmJiBkb191cGRh dGUpCisJCXIgPSBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKGZiaSk7CisKKwlyZXR1cm4gcjsK K30KKworc3RhdGljIHZvaWQgb21hcGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlz dHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21h cGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2so ZmJkZXYpOworCWlmIChmYmRldi0+Y3RybC0+c3luYykKKwkJZmJkZXYtPmN0cmwtPnN5bmMoKTsK KwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CisKKy8qCisgKiBTZXQgZmJfaW5mby5m aXggZmllbGRzIGFuZCBhbHNvIHVwZGF0ZXMgZmJkZXYuCisgKiBXaGVuIGNhbGxpbmcgdGhpcyBm Yl9pbmZvLnZhciBtdXN0IGJlIHNldCB1cCBhbHJlYWR5LgorICovCitzdGF0aWMgdm9pZCBzZXRf ZmJfZml4KHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZv ICpmaXggPSAmZmJpLT5maXg7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJp LT52YXI7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJ c3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKwlpbnQgYnBwOworCisJcmcgPSAmcGxhbmUt PmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJZmJpLT5zY3JlZW5fYmFzZQk9 IChjaGFyIF9faW9tZW0gKilyZy0+dmFkZHI7CisJZml4LT5zbWVtX3N0YXJ0CQk9IHJnLT5wYWRk cjsKKwlmaXgtPnNtZW1fbGVuCQk9IHJnLT5zaXplOworCisJZml4LT50eXBlID0gRkJfVFlQRV9Q QUNLRURfUElYRUxTOworCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaWYgKHZhci0+bm9u c3RkKQorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwllbHNlIHN3aXRj aCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMTY6CisJY2FzZSAxMjoKKwkJZml4LT52 aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQkvKiAxMmJwcCBpcyBzdG9yZWQgaW4gMTYg Yml0cyAqLworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNl IDQ6CisJY2FzZSA4OgorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwkJ YnJlYWs7CisJfQorCWZpeC0+YWNjZWwJCT0gRkJfQUNDRUxfT01BUDE2MTA7CisJZml4LT5saW5l X2xlbmd0aAk9IHZhci0+eHJlc192aXJ0dWFsICogYnBwIC8gODsKK30KKworc3RhdGljIGludCBz ZXRfY29sb3JfbW9kZShzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUsCisJCQkgIHN0 cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCXN3aXRjaCAodmFyLT5ub25zdGQpIHsK KwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJdmFyLT5i aXRzX3Blcl9waXhlbCA9IDE2OworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOwor CQlyZXR1cm4gMDsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCXZhci0+Yml0c19wZXJf cGl4ZWwgPSAxMjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJu IDA7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0g MTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWRl ZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9w aXhlbCkgeworCWNhc2UgMToKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xV VF8xQlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDI6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01B UEZCX0NPTE9SX0NMVVRfMkJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSA0OgorCQlwbGFuZS0+Y29s b3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzRCUFA7CisJCXJldHVybiAwOworCWNhc2UgODoK KwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOworCQlyZXR1cm4g MDsKKwljYXNlIDEyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xv cl9tb2RlID0gT01BUEZCX0NPTE9SX1JHQjQ0NDsKKwkJcmV0dXJuIDA7CisJY2FzZSAxNjoKKwkJ cGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfUkdCNTY1OworCQlyZXR1cm4gMDsKKwlk ZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qCisgKiBDaGVjayB0aGUgdmFs dWVzIGluIHZhciBhZ2FpbnN0IG91ciBjYXBhYmlsaXRpZXMgYW5kIGluIGNhc2Ugb2Ygb3V0IG9m CisgKiBib3VuZCB2YWx1ZXMgdHJ5IHRvIGFkanVzdCB0aGVtLgorICovCitzdGF0aWMgaW50IHNl dF9mYl92YXIoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJICAgICAgc3RydWN0IGZiX3Zhcl9zY3Jl ZW5pbmZvICp2YXIpCit7CisJaW50CQlicHA7CisJdW5zaWduZWQgbG9uZwltYXhfZnJhbWVfc2l6 ZTsKKwl1bnNpZ25lZCBsb25nCWxpbmVfc2l6ZTsKKwlpbnQJCXhyZXNfbWluLCB4cmVzX21heDsK KwlpbnQJCXlyZXNfbWluLCB5cmVzX21heDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAq cGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ ZmJkZXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisKKwlpZiAo c2V0X2NvbG9yX21vZGUocGxhbmUsIHZhcikgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJw cCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaWYgKHBsYW5lLT5jb2xvcl9tb2RlID09IE9NQVBG Ql9DT0xPUl9SR0I0NDQpCisJCWJwcCA9IDE2OworCisJc3dpdGNoICh2YXItPnJvdGF0ZSkgewor CWNhc2UgMDoKKwljYXNlIDE4MDoKKwkJeHJlc19taW4gPSBPTUFQRkJfUExBTkVfWFJFU19NSU47 CisJCXhyZXNfbWF4ID0gcGFuZWwtPnhfcmVzOworCQl5cmVzX21pbiA9IE9NQVBGQl9QTEFORV9Z UkVTX01JTjsKKwkJeXJlc19tYXggPSBwYW5lbC0+eV9yZXM7CisJCWlmIChjcHVfaXNfb21hcDE1 eHgoKSkgeworCQkJdmFyLT54cmVzID0gcGFuZWwtPnhfcmVzOworCQkJdmFyLT55cmVzID0gcGFu ZWwtPnlfcmVzOworCQl9CisJCWJyZWFrOworCWNhc2UgOTA6CisJY2FzZSAyNzA6CisJCXhyZXNf bWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCQl4cmVzX21heCA9IHBhbmVsLT55X3JlczsK KwkJeXJlc19taW4gPSBPTUFQRkJfUExBTkVfWFJFU19NSU47CisJCXlyZXNfbWF4ID0gcGFuZWwt PnhfcmVzOworCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCXZhci0+eHJlcyA9IHBhbmVs LT55X3JlczsKKwkJCXZhci0+eXJlcyA9IHBhbmVsLT54X3JlczsKKwkJfQorCQlicmVhazsKKwlk ZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodmFyLT54cmVzIDwgeHJlc19t aW4pCisJCXZhci0+eHJlcyA9IHhyZXNfbWluOworCWlmICh2YXItPnlyZXMgPCB5cmVzX21pbikK KwkJdmFyLT55cmVzID0geXJlc19taW47CisJaWYgKHZhci0+eHJlcyA+IHhyZXNfbWF4KQorCQl2 YXItPnhyZXMgPSB4cmVzX21heDsKKwlpZiAodmFyLT55cmVzID4geXJlc19tYXgpCisJCXZhci0+ eXJlcyA9IHlyZXNfbWF4OworCisJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKQor CQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwlpZiAodmFyLT55cmVzX3ZpcnR1YWwg PCB2YXItPnlyZXMpCisJCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOworCW1heF9mcmFt ZV9zaXplID0gZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XS5zaXplOworCWxpbmVf c2l6ZSA9IHZhci0+eHJlc192aXJ0dWFsICogYnBwIC8gODsKKwlpZiAobGluZV9zaXplICogdmFy LT55cmVzX3ZpcnR1YWwgPiBtYXhfZnJhbWVfc2l6ZSkgeworCQkvKiBUcnkgdG8ga2VlcCB5cmVz X3ZpcnR1YWwgZmlyc3QgKi8KKwkJbGluZV9zaXplID0gbWF4X2ZyYW1lX3NpemUgLyB2YXItPnly ZXNfdmlydHVhbDsKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSBsaW5lX3NpemUgKiA4IC8gYnBwOwor CQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpIHsKKwkJCS8qIFN0aWxsIGRvZXNu J3QgZml0LiBTaHJpbmsgeXJlc192aXJ0dWFsIHRvbyAqLworCQkJdmFyLT54cmVzX3ZpcnR1YWwg PSB2YXItPnhyZXM7CisJCQlsaW5lX3NpemUgPSB2YXItPnhyZXMgKiBicHAgLyA4OworCQkJdmFy LT55cmVzX3ZpcnR1YWwgPSBtYXhfZnJhbWVfc2l6ZSAvIGxpbmVfc2l6ZTsKKwkJfQorCQkvKiBS ZWNoZWNrIHRoaXMsIGFzIHRoZSB2aXJ0dWFsIHNpemUgY2hhbmdlZC4gKi8KKwkJaWYgKHZhci0+ eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKQorCQkJdmFyLT54cmVzID0gdmFyLT54cmVzX3ZpcnR1 YWw7CisJCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJCXZhci0+eXJlcyA9 IHZhci0+eXJlc192aXJ0dWFsOworCQlpZiAodmFyLT54cmVzIDwgeHJlc19taW4gfHwgdmFyLT55 cmVzIDwgeXJlc19taW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZhci0+eHJlcyAr IHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsKQorCQl2YXItPnhvZmZzZXQgPSB2YXIt PnhyZXNfdmlydHVhbCAtIHZhci0+eHJlczsKKwlpZiAodmFyLT55cmVzICsgdmFyLT55b2Zmc2V0 ID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJCXZhci0+eW9mZnNldCA9IHZhci0+eXJlc192aXJ0dWFs IC0gdmFyLT55cmVzOworCWxpbmVfc2l6ZSA9IHZhci0+eHJlcyAqIGJwcCAvIDg7CisKKwlpZiAo cGxhbmUtPmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1JHQjQ0NCkgeworCQl2YXItPnJlZC5v ZmZzZXQJICA9IDg7IHZhci0+cmVkLmxlbmd0aAkgPSA0OworCQkJCQkJdmFyLT5yZWQubXNiX3Jp Z2h0ICAgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDQ7IHZhci0+Z3JlZW4ubGVuZ3RoID0g NDsKKwkJCQkJCXZhci0+Z3JlZW4ubXNiX3JpZ2h0ID0gMDsKKwkJdmFyLT5ibHVlLm9mZnNldCAg PSAwOyB2YXItPmJsdWUubGVuZ3RoICA9IDQ7CisJCQkJCQl2YXItPmJsdWUubXNiX3JpZ2h0ICA9 IDA7CisJfSBlbHNlIHsKKwkJdmFyLT5yZWQub2Zmc2V0CSA9IDExOyB2YXItPnJlZC5sZW5ndGgJ ID0gNTsKKwkJCQkJCXZhci0+cmVkLm1zYl9yaWdodCAgID0gMDsKKwkJdmFyLT5ncmVlbi5vZmZz ZXQgPSA1OyAgdmFyLT5ncmVlbi5sZW5ndGggPSA2OworCQkJCQkJdmFyLT5ncmVlbi5tc2Jfcmln aHQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsgIHZhci0+Ymx1ZS5sZW5ndGggID0gNTsK KwkJCQkJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgID0gMDsKKwl9CisKKwl2YXItPmhlaWdodAkJPSAt MTsKKwl2YXItPndpZHRoCQk9IC0xOworCXZhci0+Z3JheXNjYWxlCQk9IDA7CisKKwkvKiBwaXhj bG9jayBpbiBwcywgdGhlIHJlc3QgaW4gcGl4Y2xvY2sgKi8KKwl2YXItPnBpeGNsb2NrCQk9IDEw MDAwMDAwIC8gKHBhbmVsLT5waXhlbF9jbG9jayAvIDEwMCk7CisJdmFyLT5sZWZ0X21hcmdpbgk9 IHBhbmVsLT5oZnA7CisJdmFyLT5yaWdodF9tYXJnaW4JPSBwYW5lbC0+aGJwOworCXZhci0+dXBw ZXJfbWFyZ2luCT0gcGFuZWwtPnZmcDsKKwl2YXItPmxvd2VyX21hcmdpbgk9IHBhbmVsLT52YnA7 CisJdmFyLT5oc3luY19sZW4JCT0gcGFuZWwtPmhzdzsKKwl2YXItPnZzeW5jX2xlbgkJPSBwYW5l bC0+dnN3OworCisJLyogVE9ETzogZ2V0IHRoZXNlIGZyb20gcGFuZWwtPmNvbmZpZyAqLworCXZh ci0+dm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKwl2YXItPnN5bmMJCT0gMDsKKwor CXJldHVybiAwOworfQorCisKKy8qIFNldCByb3RhdGlvbiAoMCwgOTAsIDE4MCwgMjcwIGRlZ3Jl ZSksIGFuZCBzd2l0Y2ggdG8gdGhlIG5ldyBtb2RlLiAqLworc3RhdGljIHZvaWQgb21hcGZiX3Jv dGF0ZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgcm90YXRlKQoreworCXN0cnVjdCBvbWFwZmJf cGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpm YmRldiA9IHBsYW5lLT5mYmRldjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYg KGNwdV9pc19vbWFwMTV4eCgpICYmIHJvdGF0ZSAhPSBmYmktPnZhci5yb3RhdGUpIHsKKwkJc3Ry dWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCisJCW1l bWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQluZXdfdmFyLT5y b3RhdGUgPSByb3RhdGU7CisJCWlmIChzZXRfZmJfdmFyKGZiaSwgbmV3X3ZhcikgPT0gMCAmJgor CQkgICAgbWVtY21wKG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSkpIHsKKwkJ CW1lbWNweSgmZmJpLT52YXIsIG5ld192YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQkJY3RybF9j aGFuZ2VfbW9kZShmYmkpOworCQl9CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsK K30KKworLyoKKyAqIFNldCBuZXcgeCx5IG9mZnNldHMgaW4gdGhlIHZpcnR1YWwgZGlzcGxheSBm b3IgdGhlIHZpc2libGUgYXJlYSBhbmQgc3dpdGNoCisgKiB0byB0aGUgbmV3IG1vZGUuCisgKi8K K3N0YXRpYyBpbnQgb21hcGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAq dmFyLAorCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9w bGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZi ZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhm YmRldik7CisJaWYgKHZhci0+eG9mZnNldCAhPSBmYmktPnZhci54b2Zmc2V0IHx8CisJICAgIHZh ci0+eW9mZnNldCAhPSBmYmktPnZhci55b2Zmc2V0KSB7CisJCXN0cnVjdCBmYl92YXJfc2NyZWVu aW5mbyAqbmV3X3ZhciA9ICZmYmRldi0+bmV3X3ZhcjsKKworCQltZW1jcHkobmV3X3ZhciwgJmZi aS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJbmV3X3Zhci0+eG9mZnNldCA9IHZhci0+eG9m ZnNldDsKKwkJbmV3X3Zhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwkJaWYgKHNldF9mYl92 YXIoZmJpLCBuZXdfdmFyKSkKKwkJCXIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCW1lbWNweSgm ZmJpLT52YXIsIG5ld192YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQkJY3RybF9jaGFuZ2VfbW9k ZShmYmkpOworCQl9CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVy biByOworfQorCisvKiBTZXQgbWlycm9yIHRvIHZlcnRpY2FsIGF4aXMgYW5kIHN3aXRjaCB0byB0 aGUgbmV3IG1vZGUuICovCitzdGF0aWMgaW50IG9tYXBmYl9taXJyb3Ioc3RydWN0IGZiX2luZm8g KmZiaSwgaW50IG1pcnJvcikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUg PSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7 CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwltaXJyb3IgPSBt aXJyb3IgPyAxIDogMDsKKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkpCisJCXIgPSAtRUlOVkFMOwor CWVsc2UgaWYgKG1pcnJvciAhPSBwbGFuZS0+aW5mby5taXJyb3IpIHsKKwkJcGxhbmUtPmluZm8u bWlycm9yID0gbWlycm9yOworCQlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCX0KKwlvbWFw ZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENoZWNr IHZhbHVlcyBpbiB2YXIsIHRyeSB0byBhZGp1c3QgdGhlbSBpbiBjYXNlIG9mIG91dCBvZiBib3Vu ZCB2YWx1ZXMgaWYKKyAqIHBvc3NpYmxlLCBvciByZXR1cm4gZXJyb3IuCisgKi8KK3N0YXRpYyBp bnQgb21hcGZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0 IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBm YmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJ aW50IHI7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChmYmRldi0+Y3RybC0+ c3luYyAhPSBOVUxMKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCXIgPSBzZXRfZmJfdmFyKGZi aSwgdmFyKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30K KworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBtb2RlLiBUaGUgcGFyYW1ldGVycyBmb3IgaXQgaGFz IGJlZW4gY2hlY2sgYWxyZWFkeSBieQorICogb21hcGZiX2NoZWNrX3Zhci4KKyAqLworc3RhdGlj IGludCBvbWFwZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFw ZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNl ICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xv Y2soZmJkZXYpOworCXNldF9mYl9maXgoZmJpKTsKKwlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkp OworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitpbnQg b21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQlzdHJ1 Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQl2b2lkICgqY2FsbGJhY2spKHZvaWQg KiksCisJCQkJdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0 cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBw bGFuZS0+ZmJkZXY7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CisKKwl2YXIgPSAm ZmJpLT52YXI7CisJaWYgKHdpbi0+eCA+PSB2YXItPnhyZXMgfHwgd2luLT55ID49IHZhci0+eXJl cyB8fAorCSAgICB3aW4tPm91dF94ID4gdmFyLT54cmVzIHx8IHdpbi0+b3V0X3kgPj0gdmFyLT55 cmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5k b3cgfHwKKwkgICAgZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpICE9IE9NQVBGQl9NQU5V QUxfVVBEQVRFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh3aW4tPnggKyB3aW4tPndpZHRo ID49IHZhci0+eHJlcykKKwkJd2luLT53aWR0aCA9IHZhci0+eHJlcyAtIHdpbi0+eDsKKwlpZiAo d2luLT55ICsgd2luLT5oZWlnaHQgPj0gdmFyLT55cmVzKQorCQl3aW4tPmhlaWdodCA9IHZhci0+ eXJlcyAtIHdpbi0+eTsKKwkvKiBUaGUgb3V0IHNpemVzIHNob3VsZCBiZSBjcm9wcGVkIHRvIHRo ZSBMQ0Qgc2l6ZSAqLworCWlmICh3aW4tPm91dF94ICsgd2luLT5vdXRfd2lkdGggPiBmYmRldi0+ cGFuZWwtPnhfcmVzKQorCQl3aW4tPm91dF93aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXMgLSB3 aW4tPm91dF94OworCWlmICh3aW4tPm91dF95ICsgd2luLT5vdXRfaGVpZ2h0ID4gZmJkZXYtPnBh bmVsLT55X3JlcykKKwkJd2luLT5vdXRfaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlcyAtIHdp bi0+b3V0X3k7CisJaWYgKCF3aW4tPndpZHRoIHx8ICF3aW4tPmhlaWdodCB8fCAhd2luLT5vdXRf d2lkdGggfHwgIXdpbi0+b3V0X2hlaWdodCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmJkZXYt PmN0cmwtPnVwZGF0ZV93aW5kb3coZmJpLCB3aW4sIGNhbGxiYWNrLCBjYWxsYmFja19kYXRhKTsK K30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMg aW50IG9tYXBmYl91cGRhdGVfd2luKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJc3RydWN0IG9t YXBmYl91cGRhdGVfd2luZG93ICp3aW4pCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3Qg KnBsYW5lID0gZmJpLT5wYXI7CisJaW50IHJldDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhwbGFu ZS0+ZmJkZXYpOworCXJldCA9IG9tYXBmYl91cGRhdGVfd2luZG93X2FzeW5jKGZiaSwgd2luLCBO VUxMLCAwKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhwbGFuZS0+ZmJkZXYpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKHN0cnVjdCBm Yl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJp LT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0 cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB3aW47CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5j dHJsLT51cGRhdGVfd2luZG93IHx8CisJICAgIGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUo KSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aW4ueCA9 IDA7CisJd2luLnkgPSAwOworCXdpbi53aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJd2luLmhlaWdo dCA9IGZiaS0+dmFyLnlyZXM7CisJd2luLm91dF94ID0gMDsKKwl3aW4ub3V0X3kgPSAwOworCXdp bi5vdXRfd2lkdGggPSBmYmktPnZhci54cmVzOworCXdpbi5vdXRfaGVpZ2h0ID0gZmJpLT52YXIu eXJlczsKKwl3aW4uZm9ybWF0ID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJ ciA9IGZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiaSwgJndpbiwgTlVMTCwgMCk7CisJb21h cGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQg b21hcGZiX3NldHVwX3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxh bmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJp LT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0 cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZmJkZXYtPnBhbmVsOworCXN0cnVjdCBvbWFwZmJfcGxh bmVfaW5mbyBvbGRfaW5mbzsKKwlpbnQgciA9IDA7CisKKwlpZiAocGktPnBvc194ICsgcGktPm91 dF93aWR0aCA+IHBhbmVsLT54X3JlcyB8fAorCSAgICBwaS0+cG9zX3kgKyBwaS0+b3V0X2hlaWdo dCA+IHBhbmVsLT55X3JlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwZmJfcnF1ZXVlX2xv Y2soZmJkZXYpOworCWlmIChwaS0+ZW5hYmxlZCAmJiAhZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltw bGFuZS0+aWR4XS5zaXplKSB7CisJCS8qCisJCSAqIFRoaXMgcGxhbmUncyBtZW1vcnkgd2FzIGZy ZWVkLCBjYW4ndCBlbmFibGUgaXQKKwkJICogdW50aWwgaXQncyByZWFsbG9jYXRlZC4KKwkJICov CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJb2xkX2luZm8gPSBwbGFuZS0+aW5m bzsKKwlwbGFuZS0+aW5mbyA9ICpwaTsKKwlpZiAocGktPmVuYWJsZWQpIHsKKwkJciA9IGN0cmxf Y2hhbmdlX21vZGUoZmJpKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwbGFuZS0+aW5mbyA9IG9sZF9p bmZvOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJciA9IGZiZGV2LT5jdHJsLT5lbmFibGVfcGxh bmUocGxhbmUtPmlkeCwgcGktPmVuYWJsZWQpOworCWlmIChyIDwgMCkgeworCQlwbGFuZS0+aW5m byA9IG9sZF9pbmZvOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJb21hcGZiX3JxdWV1ZV91bmxv Y2soZmJkZXYpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9xdWVyeV9wbGFu ZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gKnBpKQorewor CXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCisJKnBpID0g cGxhbmUtPmluZm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldHVwX21l bShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlz dHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21h cGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVn aW9uICpyZyA9ICZmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOworCXNpemVfdCBz aXplOworCWludCByID0gMDsKKworCWlmIChmYmRldi0+Y3RybC0+c2V0dXBfbWVtID09IE5VTEwp CisJCXJldHVybiAtRU5PREVWOworCWlmIChtaS0+dHlwZSA+IE9NQVBGQl9NRU1UWVBFX01BWCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gUEFHRV9BTElHTihtaS0+c2l6ZSk7CisJb21h cGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAocGxhbmUtPmluZm8uZW5hYmxlZCkgeworCQly ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJnLT5zaXplICE9IHNpemUgfHwgcmct PnR5cGUgIT0gbWktPnR5cGUpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFy ID0gJmZiZGV2LT5uZXdfdmFyOworCQl1bnNpZ25lZCBsb25nIG9sZF9zaXplID0gcmctPnNpemU7 CisJCXU4CSAgICAgIG9sZF90eXBlID0gcmctPnR5cGU7CisJCXVuc2lnbmVkIGxvbmcgcGFkZHI7 CisKKwkJcmctPnNpemUgPSBzaXplOworCQlyZy0+dHlwZSA9IG1pLT50eXBlOworCQkvKgorCQkg KiBzaXplID09IDAgaXMgYSBzcGVjaWFsIGNhc2UsIGZvciB3aGljaCB3ZQorCQkgKiBkb24ndCBj aGVjayAvIGFkanVzdCB0aGUgc2NyZWVuIHBhcmFtZXRlcnMuCisJCSAqIFRoaXMgaXNuJ3QgYSBw cm9ibGVtIHNpbmNlIHRoZSBwbGFuZSBjYW4ndAorCQkgKiBiZSByZWVuYWJsZWQgdW5sZXNzIGl0 cyBzaXplIGlzID4gMC4KKwkJICovCisJCWlmIChvbGRfc2l6ZSAhPSBzaXplICYmIHNpemUpIHsK KwkJCWlmIChzaXplKSB7CisJCQkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpu ZXdfdmFyKSk7CisJCQkJciA9IHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKTsKKwkJCQlpZiAociA8 IDApCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJaWYgKGZiZGV2LT5jdHJsLT5zeW5j KQorCQkJZmJkZXYtPmN0cmwtPnN5bmMoKTsKKwkJciA9IGZiZGV2LT5jdHJsLT5zZXR1cF9tZW0o cGxhbmUtPmlkeCwgc2l6ZSwgbWktPnR5cGUsICZwYWRkcik7CisJCWlmIChyIDwgMCkgeworCQkJ LyogUmV2ZXJ0IGNoYW5nZXMuICovCisJCQlyZy0+c2l6ZSA9IG9sZF9zaXplOworCQkJcmctPnR5 cGUgPSBvbGRfdHlwZTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJnLT5wYWRkciA9IHBhZGRyOwor CisJCWlmIChvbGRfc2l6ZSAhPSBzaXplKSB7CisJCQlpZiAoc2l6ZSkgeworCQkJCW1lbWNweSgm ZmJpLT52YXIsIG5ld192YXIsIHNpemVvZihmYmktPnZhcikpOworCQkJCXNldF9mYl9maXgoZmJp KTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlc2UgZXhwbGljaXRseSB0byBp bmRpY2F0ZSB0aGF0IHRoZQorCQkJCSAqIHBsYW5lIG1lbW9yeSBpcyBkZWFsbG9jZSdkLCB0aGUg b3RoZXIKKwkJCQkgKiBzY3JlZW4gcGFyYW1ldGVycyBpbiB2YXIgLyBmaXggYXJlIGludmFsaWQu CisJCQkJICovCisJCQkJZmJpLT5maXguc21lbV9zdGFydCA9IDA7CisJCQkJZmJpLT5maXguc21l bV9sZW4gPSAwOworCQkJfQorCQl9CisJfQorb3V0OgorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZi ZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9xdWVyeV9tZW0oc3Ry dWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9tZW1faW5mbyAqbWkpCit7CisJc3RydWN0 IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9k ZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAq cmc7CisKKwlyZyA9ICZmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOworCW1lbXNl dChtaSwgMCwgc2l6ZW9mKCptaSkpOworCW1pLT5zaXplID0gcmctPnNpemU7CisJbWktPnR5cGUg PSByZy0+dHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfY29s b3Jfa2V5KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2Nv bG9yX2tleSAqY2spCit7CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT5zZXRfY29sb3Jf a2V5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJ ciA9IGZiZGV2LT5jdHJsLT5zZXRfY29sb3Jfa2V5KGNrKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9j ayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfZ2V0X2NvbG9y X2tleShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJc3RydWN0IG9tYXBmYl9jb2xv cl9rZXkgKmNrKQoreworCWludCByOworCisJaWYgKCFmYmRldi0+Y3RybC0+Z2V0X2NvbG9yX2tl eSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIg PSBmYmRldi0+Y3RybC0+Z2V0X2NvbG9yX2tleShjayk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2so ZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tpbmdfbm90aWZp ZXJfaGVhZCBvbWFwZmJfY2xpZW50X2xpc3RbT01BUEZCX1BMQU5FX05VTV07CitzdGF0aWMgaW50 IG5vdGlmaWVyX2luaXRlZDsKKworc3RhdGljIHZvaWQgb21hcGZiX2luaXRfbm90aWZpZXIodm9p ZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKysp CisJCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmb21hcGZiX2NsaWVudF9saXN0W2ldKTsK K30KKworaW50IG9tYXBmYl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9i bG9jayAqb21hcGZiX25iLAorCQkJCW9tYXBmYl9ub3RpZmllcl9jYWxsYmFja190IGNhbGxiYWNr LAorCQkJCXZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJaW50IHI7CisKKwlpZiAoKHVuc2lnbmVk KW9tYXBmYl9uYi0+cGxhbmVfaWR4ID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlpZiAoIW5vdGlmaWVyX2luaXRlZCkgeworCQlvbWFwZmJfaW5pdF9ub3RpZmllcigp OworCQlub3RpZmllcl9pbml0ZWQgPSAxOworCX0KKworCW9tYXBmYl9uYi0+bmIubm90aWZpZXJf Y2FsbCA9IChpbnQgKCopKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLAorCQkJCQl1bnNpZ25lZCBs b25nLCB2b2lkICopKWNhbGxiYWNrOworCW9tYXBmYl9uYi0+ZGF0YSA9IGNhbGxiYWNrX2RhdGE7 CisJciA9IGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKAorCQkJCSZvbWFwZmJfY2xp ZW50X2xpc3Rbb21hcGZiX25iLT5wbGFuZV9pZHhdLAorCQkJCSZvbWFwZmJfbmItPm5iKTsKKwlp ZiAocikKKwkJcmV0dXJuIHI7CisJaWYgKG9tYXBmYl9kZXYgIT0gTlVMTCAmJgorCSAgICBvbWFw ZmJfZGV2LT5jdHJsICYmIG9tYXBmYl9kZXYtPmN0cmwtPmJpbmRfY2xpZW50KSB7CisJCW9tYXBm Yl9kZXYtPmN0cmwtPmJpbmRfY2xpZW50KG9tYXBmYl9uYik7CisJfQorCisJcmV0dXJuIDA7Cit9 CitFWFBPUlRfU1lNQk9MKG9tYXBmYl9yZWdpc3Rlcl9jbGllbnQpOworCitpbnQgb21hcGZiX3Vu cmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm9tYXBmYl9uYikK K3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigKKwkJJm9tYXBm Yl9jbGllbnRfbGlzdFtvbWFwZmJfbmItPnBsYW5lX2lkeF0sICZvbWFwZmJfbmItPm5iKTsKK30K K0VYUE9SVF9TWU1CT0wob21hcGZiX3VucmVnaXN0ZXJfY2xpZW50KTsKKwordm9pZCBvbWFwZmJf bm90aWZ5X2NsaWVudHMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1bnNpZ25lZCBsb25n IGV2ZW50KQoreworCWludCBpOworCisJaWYgKCFub3RpZmllcl9pbml0ZWQpCisJCS8qIG5vIGNs aWVudCByZWdpc3RlcmVkIHlldCAqLworCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgT01B UEZCX1BMQU5FX05VTTsgaSsrKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZvbWFw ZmJfY2xpZW50X2xpc3RbaV0sIGV2ZW50LAorCQkJCSAgICBmYmRldi0+ZmJfaW5mb1tpXSk7Cit9 CitFWFBPUlRfU1lNQk9MKG9tYXBmYl9ub3RpZnlfY2xpZW50cyk7CisKK3N0YXRpYyBpbnQgb21h cGZiX3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJICAg ZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVl dWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5zZXRfdXBkYXRlX21vZGUobW9kZSk7 CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRp YyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBv bWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhm YmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKTsKKwlvbWFwZmJfcnF1 ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcGZi X2dldF9jYXBzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IHBsYW5lLAorCQkJCSAg ICAgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCW1lbXNldChjYXBzLCAwLCBzaXplb2Yo KmNhcHMpKTsKKwlmYmRldi0+Y3RybC0+Z2V0X2NhcHMocGxhbmUsIGNhcHMpOworCWNhcHMtPmN0 cmwgfD0gZmJkZXYtPnBhbmVsLT5nZXRfY2FwcyhmYmRldi0+cGFuZWwpOworfQorCisvKiBGb3Ig bGNkIHRlc3RpbmcgKi8KK3ZvaWQgb21hcGZiX3dyaXRlX2ZpcnN0X3BpeGVsKHN0cnVjdCBvbWFw ZmJfZGV2aWNlICpmYmRldiwgdTE2IHBpeHZhbCkKK3sKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJk ZXYpOworCSoodTE2ICopZmJkZXYtPm1lbV9kZXNjLnJlZ2lvblswXS52YWRkciA9IHBpeHZhbDsK KwlpZiAoZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpID09IE9NQVBGQl9NQU5VQUxfVVBE QVRFKSB7CisJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB3aW47CisKKwkJbWVtc2V0KCZ3 aW4sIDAsIHNpemVvZih3aW4pKTsKKwkJd2luLndpZHRoID0gMjsKKwkJd2luLmhlaWdodCA9IDI7 CisJCXdpbi5vdXRfd2lkdGggPSAyOworCQl3aW4ub3V0X2hlaWdodCA9IDI7CisJCWZiZGV2LT5j dHJsLT51cGRhdGVfd2luZG93KGZiZGV2LT5mYl9pbmZvWzBdLCAmd2luLCBOVUxMLCAwKTsKKwl9 CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJf d3JpdGVfZmlyc3RfcGl4ZWwpOworCisvKgorICogSW9jdGwgaW50ZXJmYWNlLiBQYXJ0IG9mIHRo ZSBrZXJuZWwgbW9kZSBmcmFtZSBidWZmZXIgQVBJIGlzIGR1cGxpY2F0ZWQKKyAqIGhlcmUgdG8g YmUgYWNjZXNzaWJsZSBieSB1c2VyIG1vZGUgY29kZS4KKyAqLworc3RhdGljIGludCBvbWFwZmJf aW9jdGwoc3RydWN0IGZiX2luZm8gKmZiaSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVk IGxvbmcgYXJnKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+ cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1 Y3QgZmJfb3BzCQkqb3BzID0gZmJpLT5mYm9wczsKKwl1bmlvbiB7CisJCXN0cnVjdCBvbWFwZmJf dXBkYXRlX3dpbmRvdwl1cGRhdGVfd2luZG93OworCQlzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8J cGxhbmVfaW5mbzsKKwkJc3RydWN0IG9tYXBmYl9tZW1faW5mbwkJbWVtX2luZm87CisJCXN0cnVj dCBvbWFwZmJfY29sb3Jfa2V5CQljb2xvcl9rZXk7CisJCWVudW0gb21hcGZiX3VwZGF0ZV9tb2Rl CQl1cGRhdGVfbW9kZTsKKwkJc3RydWN0IG9tYXBmYl9jYXBzCQljYXBzOworCQl1bnNpZ25lZCBp bnQJCW1pcnJvcjsKKwkJaW50CQkJcGxhbmVfb3V0OworCQlpbnQJCQllbmFibGVfcGxhbmU7CisJ fSBwOworCWludCByID0gMDsKKworCUJVR19PTighb3BzKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNh c2UgT01BUEZCX01JUlJPUjoKKwkJaWYgKGdldF91c2VyKHAubWlycm9yLCAoaW50IF9fdXNlciAq KWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJb21hcGZiX21pcnJvcihmYmksIHAu bWlycm9yKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU1lOQ19HRlg6CisJCW9tYXBmYl9zeW5j KGZiaSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1ZTWU5DOgorCQlicmVhazsKKwljYXNlIE9N QVBGQl9TRVRfVVBEQVRFX01PREU6CisJCWlmIChnZXRfdXNlcihwLnVwZGF0ZV9tb2RlLCAoaW50 IF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9z ZXRfdXBkYXRlX21vZGUoZmJkZXYsIHAudXBkYXRlX21vZGUpOworCQlicmVhazsKKwljYXNlIE9N QVBGQl9HRVRfVVBEQVRFX01PREU6CisJCXAudXBkYXRlX21vZGUgPSBvbWFwZmJfZ2V0X3VwZGF0 ZV9tb2RlKGZiZGV2KTsKKwkJaWYgKHB1dF91c2VyKHAudXBkYXRlX21vZGUsCisJCQkJCShlbnVt IG9tYXBmYl91cGRhdGVfbW9kZSBfX3VzZXIgKilhcmcpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJy ZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9XSU5ET1dfT0xEOgorCQlpZiAoY29weV9mcm9tX3Vz ZXIoJnAudXBkYXRlX3dpbmRvdywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihz dHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3dfb2xkKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxz ZSB7CisJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKnUgPSAmcC51cGRhdGVfd2luZG93 OworCQkJdS0+b3V0X3ggPSB1LT54OworCQkJdS0+b3V0X3kgPSB1LT55OworCQkJdS0+b3V0X3dp ZHRoID0gdS0+d2lkdGg7CisJCQl1LT5vdXRfaGVpZ2h0ID0gdS0+aGVpZ2h0OworCQkJbWVtc2V0 KHUtPnJlc2VydmVkLCAwLCBzaXplb2YodS0+cmVzZXJ2ZWQpKTsKKwkJCXIgPSBvbWFwZmJfdXBk YXRlX3dpbihmYmksIHUpOworCQl9CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9XSU5E T1c6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC51cGRhdGVfd2luZG93LCAodm9pZCBfX3VzZXIg KilhcmcsCisJCQkJICAgc2l6ZW9mKHAudXBkYXRlX3dpbmRvdykpKQorCQkJciA9IC1FRkFVTFQ7 CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfdXBkYXRlX3dpbihmYmksICZwLnVwZGF0ZV93aW5kb3cp OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRVUF9QTEFORToKKwkJaWYgKGNvcHlfZnJvbV91 c2VyKCZwLnBsYW5lX2luZm8sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5w bGFuZV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1 cF9wbGFuZShmYmksICZwLnBsYW5lX2luZm8pOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9RVUVS WV9QTEFORToKKwkJaWYgKChyID0gb21hcGZiX3F1ZXJ5X3BsYW5lKGZiaSwgJnAucGxhbmVfaW5m bykpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFy ZywgJnAucGxhbmVfaW5mbywKKwkJCQkgICBzaXplb2YocC5wbGFuZV9pbmZvKSkpCisJCQlyID0g LUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU0VUVVBfTUVNOgorCQlpZiAoY29weV9m cm9tX3VzZXIoJnAubWVtX2luZm8sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2Yo cC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0 dXBfbWVtKGZiaSwgJnAubWVtX2luZm8pOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9RVUVSWV9N RU06CisJCWlmICgociA9IG9tYXBmYl9xdWVyeV9tZW0oZmJpLCAmcC5tZW1faW5mbykpIDwgMCkK KwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAubWVt X2luZm8sCisJCQkJICAgc2l6ZW9mKHAubWVtX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQli cmVhazsKKwljYXNlIE9NQVBGQl9TRVRfQ09MT1JfS0VZOgorCQlpZiAoY29weV9mcm9tX3VzZXIo JnAuY29sb3Jfa2V5LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHAuY29sb3Jf a2V5KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXRfY29sb3Jf a2V5KGZiZGV2LCAmcC5jb2xvcl9rZXkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9HRVRfQ09M T1JfS0VZOgorCQlpZiAoKHIgPSBvbWFwZmJfZ2V0X2NvbG9yX2tleShmYmRldiwgJnAuY29sb3Jf a2V5KSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICop YXJnLCAmcC5jb2xvcl9rZXksCisJCQkJIHNpemVvZihwLmNvbG9yX2tleSkpKQorCQkJciA9IC1F RkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9DQVBTOgorCQlvbWFwZmJfZ2V0X2Nh cHMoZmJkZXYsIHBsYW5lLT5pZHgsICZwLmNhcHMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lk IF9fdXNlciAqKWFyZywgJnAuY2Fwcywgc2l6ZW9mKHAuY2FwcykpKQorCQkJciA9IC1FRkFVTFQ7 CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0xDRF9URVNUOgorCQl7CisJCQlpbnQgdGVzdF9udW07 CisKKwkJCWlmIChnZXRfdXNlcih0ZXN0X251bSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQkJ ciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWZiZGV2LT5wYW5lbC0+cnVu X3Rlc3QpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXIgPSBmYmRl di0+cGFuZWwtPnJ1bl90ZXN0KGZiZGV2LT5wYW5lbCwgdGVzdF9udW0pOworCQkJYnJlYWs7CisJ CX0KKwljYXNlIE9NQVBGQl9DVFJMX1RFU1Q6CisJCXsKKwkJCWludCB0ZXN0X251bTsKKworCQkJ aWYgKGdldF91c2VyKHRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVG QVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZmJkZXYtPmN0cmwtPnJ1bl90ZXN0KSB7 CisJCQkJciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyID0gZmJkZXYtPmN0cmwt PnJ1bl90ZXN0KHRlc3RfbnVtKTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJciA9IC1F SU5WQUw7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX21tYXAoc3Ry dWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVj dCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGluZm8tPnBhcjsKKwlzdHJ1Y3Qgb21hcGZi X2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHI7CisKKwlvbWFwZmJfcnF1ZXVl X2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+bW1hcChpbmZvLCB2bWEpOworCW9tYXBm Yl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogQ2FsbGJh Y2sgdGFibGUgZm9yIHRoZSBmcmFtZSBidWZmZXIgZnJhbWV3b3JrLiBTb21lIG9mIHRoZXNlIHBv aW50ZXJzCisgKiB3aWxsIGJlIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNldHRp bmcgb2YgZmJfaW5mby0+YWNjZWxfZmxhZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIG9t YXBmYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9vcGVuICAgICAgICA9 IG9tYXBmYl9vcGVuLAorCS5mYl9yZWxlYXNlICAgICA9IG9tYXBmYl9yZWxlYXNlLAorCS5mYl9z ZXRjb2xyZWcJPSBvbWFwZmJfc2V0Y29scmVnLAorCS5mYl9zZXRjbWFwCT0gb21hcGZiX3NldGNt YXAsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9j b3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfYmxhbmsgICAg ICAgPSBvbWFwZmJfYmxhbmssCisJLmZiX2lvY3RsCT0gb21hcGZiX2lvY3RsLAorCS5mYl9jaGVj a192YXIJPSBvbWFwZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyCT0gb21hcGZiX3NldF9wYXIs CisJLmZiX3JvdGF0ZQk9IG9tYXBmYl9yb3RhdGUsCisJLmZiX3Bhbl9kaXNwbGF5ID0gb21hcGZi X3Bhbl9kaXNwbGF5LAorfTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3lzZnMg aW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogb21hcGZiWCBzeXNmcyBl bnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jYXBzX251bShzdHJ1Y3QgZGV2 aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2 aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcGxhbmU7CisJc2l6ZV90IHNpemU7CisJc3Ry dWN0IG9tYXBmYl9jYXBzIGNhcHM7CisKKwlwbGFuZSA9IDA7CisJc2l6ZSA9IDA7CisJd2hpbGUg KHNpemUgPCBQQUdFX1NJWkUgJiYgcGxhbmUgPCBPTUFQRkJfUExBTkVfTlVNKSB7CisJCW9tYXBm Yl9nZXRfY2FwcyhmYmRldiwgcGxhbmUsICZjYXBzKTsKKwkJc2l6ZSArPSBzbnByaW50ZigmYnVm W3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJInBsYW5lIyVkICUjMDEweCAlIzAxMHggJSMw MTB4XG4iLAorCQkJcGxhbmUsIGNhcHMuY3RybCwgY2Fwcy5wbGFuZV9jb2xvciwgY2Fwcy53bmRf Y29sb3IpOworCQlwbGFuZSsrOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXpl X3Qgb21hcGZiX3Nob3dfY2Fwc190ZXh0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBm Yl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0 YTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb21hcGZiX2NhcHMgY2FwczsKKwlpbnQgcGxhbmU7CisJc2l6 ZV90IHNpemU7CisKKwlwbGFuZSA9IDA7CisJc2l6ZSA9IDA7CisJd2hpbGUgKHNpemUgPCBQQUdF X1NJWkUgJiYgcGxhbmUgPCBPTUFQRkJfUExBTkVfTlVNKSB7CisJCW9tYXBmYl9nZXRfY2Fwcyhm YmRldiwgcGxhbmUsICZjYXBzKTsKKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdF X1NJWkUgLSBzaXplLAorCQkJCSAicGxhbmUjJWQ6XG4iLCBwbGFuZSk7CisJCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKGN0cmxfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBp KyspIHsKKwkJCWlmIChjdHJsX2NhcHNbaV0uZmxhZyAmIGNhcHMuY3RybCkKKwkJCQlzaXplICs9 IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgJXNcbiIsIGN0 cmxfY2Fwc1tpXS5uYW1lKTsKKwkJfQorCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBB R0VfU0laRSAtIHNpemUsCisJCQkJICIgcGxhbmUgY29sb3JzOlxuIik7CisJCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKGNvbG9yX2NhcHMpICYmCisJCSAgICAgc2l6ZSA8IFBBR0VfU0laRTsg aSsrKSB7CisJCQlpZiAoY29sb3JfY2Fwc1tpXS5mbGFnICYgY2Fwcy5wbGFuZV9jb2xvcikKKwkJ CQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIg ICVzXG4iLCBjb2xvcl9jYXBzW2ldLm5hbWUpOworCQl9CisJCXNpemUgKz0gc25wcmludGYoJmJ1 ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgIiB3aW5kb3cgY29sb3JzOlxuIik7CisJ CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbG9yX2NhcHMpICYmCisJCSAgICAgc2l6ZSA8 IFBBR0VfU0laRTsgaSsrKSB7CisJCQlpZiAoY29sb3JfY2Fwc1tpXS5mbGFnICYgY2Fwcy53bmRf Y29sb3IpCisJCQkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXpl LAorCQkJCQkiICAlc1xuIiwgY29sb3JfY2Fwc1tpXS5uYW1lKTsKKwkJfQorCisJCXBsYW5lKys7 CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY2Fwc19udW0sIDA0 NDQsIG9tYXBmYl9zaG93X2NhcHNfbnVtLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBz X3RleHQsIDA0NDQsIG9tYXBmYl9zaG93X2NhcHNfdGV4dCwgTlVMTCk7CisKKy8qIHBhbmVsIHN5 c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X3BhbmVsX25hbWUoc3Ry dWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRy LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBv bWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiBzbnByaW50ZihidWYs IFBBR0VfU0laRSwgIiVzXG4iLCBmYmRldi0+cGFuZWwtPm5hbWUpOworfQorCitzdGF0aWMgc3Np emVfdCBvbWFwZmJfc2hvd19ia2xpZ2h0X2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJ IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0 cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9s ZXZlbCkgeworCQlyID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCSAgICAg ZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9sZXZlbChmYmRldi0+cGFuZWwpKTsKKwl9IGVsc2UK KwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9z dG9yZV9ia2xpZ2h0X2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2 aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXpl KQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2Rldmlj ZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBhbmVsLT5zZXRf YmtsaWdodF9sZXZlbCkgeworCQl1bnNpZ25lZCBpbnQgbGV2ZWw7CisKKwkJaWYgKHNzY2FuZihi dWYsICIlMTBkIiwgJmxldmVsKSA9PSAxKSB7CisJCQlyID0gZmJkZXYtPnBhbmVsLT5zZXRfYmts aWdodF9sZXZlbChmYmRldi0+cGFuZWwsCisJCQkJCQkJICAgIGxldmVsKTsKKwkJfSBlbHNlCisJ CQlyID0gLUVJTlZBTDsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHIgPyByIDog c2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfYmtsaWdodF9tYXgoc3RydWN0 IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwg Y2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21h cGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CisKKwlpZiAoZmJkZXYtPnBh bmVsLT5nZXRfYmtsaWdodF9sZXZlbCkgeworCQlyID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUs ICIlZFxuIiwKKwkJCSAgICAgZmJkZXYtPnBhbmVsLT5nZXRfYmtsaWdodF9tYXgoZmJkZXYtPnBh bmVsKSk7CisJfSBlbHNlCisJCXIgPSAtRU5PREVWOworCXJldHVybiByOworfQorCitzdGF0aWMg c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfcGFuZWxfbmFtZSA9CisJX19BVFRSKG5h bWUsIDA0NDQsIG9tYXBmYl9zaG93X3BhbmVsX25hbWUsIE5VTEwpOworc3RhdGljIERFVklDRV9B VFRSKGJhY2tsaWdodF9sZXZlbCwgMDY2NCwKKwkJICAgb21hcGZiX3Nob3dfYmtsaWdodF9sZXZl bCwgb21hcGZiX3N0b3JlX2JrbGlnaHRfbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhY2ts aWdodF9tYXgsIDA0NDQsIG9tYXBmYl9zaG93X2JrbGlnaHRfbWF4LCBOVUxMKTsKKworc3RhdGlj IHN0cnVjdCBhdHRyaWJ1dGUgKnBhbmVsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3BhbmVsX25h bWUuYXR0ciwKKwkmZGV2X2F0dHJfYmFja2xpZ2h0X2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2Jh Y2tsaWdodF9tYXguYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVf Z3JvdXAgcGFuZWxfYXR0cl9ncnAgPSB7CisJLm5hbWUgID0gInBhbmVsIiwKKwkuYXR0cnMgPSBw YW5lbF9hdHRycywKK307CisKKy8qIGN0cmwgc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXpl X3Qgb21hcGZiX3Nob3dfY3RybF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBm Yl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0 YTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBmYmRldi0+Y3Ry bC0+bmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9j dHJsX25hbWUgPQorCV9fQVRUUihuYW1lLCAwNDQ0LCBvbWFwZmJfc2hvd19jdHJsX25hbWUsIE5V TEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3RybF9hdHRyc1tdID0geworCSZkZXZf YXR0cl9jdHJsX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1 dGVfZ3JvdXAgY3RybF9hdHRyX2dycCA9IHsKKwkubmFtZSAgPSAiY3RybCIsCisJLmF0dHJzID0g Y3RybF9hdHRycywKK307CisKK3N0YXRpYyBpbnQgb21hcGZiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVj dCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgcjsKKworCWlmICgociA9IGRldmljZV9j cmVhdGVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pKSkKKwkJZ290byBmYWls MDsKKworCWlmICgociA9IGRldmljZV9jcmVhdGVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJf Y2Fwc190ZXh0KSkpCisJCWdvdG8gZmFpbDE7CisKKwlpZiAoKHIgPSBzeXNmc19jcmVhdGVfZ3Jv dXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCkpKQorCQlnb3RvIGZhaWwyOwor CisJaWYgKChyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmY3RybF9h dHRyX2dycCkpKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CitmYWlsMzoKKwlzeXNmc19y ZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCk7CitmYWlsMjoK KwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfdGV4dCk7Citm YWlsMToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfbnVt KTsKK2ZhaWwwOgorCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBzeXNm cyBpbnRlcmZhY2VcbiIpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfdW5y ZWdpc3Rlcl9zeXNmcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3lzZnNfcmVt b3ZlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmY3RybF9hdHRyX2dycCk7CisJc3lzZnNfcmVt b3ZlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmcGFuZWxfYXR0cl9ncnApOworCWRldmljZV9y ZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pOworCWRldmljZV9yZW1v dmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KTsKK30KKworLyoKKyAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICogTERNIGNhbGxiYWNrcworICogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKi8KKy8qIEluaXRpYWxpemUgc3lzdGVtIGZiX2luZm8gb2JqZWN0IGFuZCBzZXQgdGhlIGRl ZmF1bHQgdmlkZW8gbW9kZS4KKyAqIFRoZSBmcmFtZSBidWZmZXIgbWVtb3J5IGFscmVhZHkgYWxs b2NhdGVkIGJ5IGxjZGRtYV9pbml0CisgKi8KK3N0YXRpYyBpbnQgZmJpbmZvX2luaXQoc3RydWN0 IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qg ZmJfdmFyX3NjcmVlbmluZm8JKnZhciA9ICZpbmZvLT52YXI7CisJc3RydWN0IGZiX2ZpeF9zY3Jl ZW5pbmZvCSpmaXggPSAmaW5mby0+Zml4OworCWludAkJCQlyID0gMDsKKworCWluZm8tPmZib3Bz ID0gJm9tYXBmYl9vcHM7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCisJ c3RybmNweShmaXgtPmlkLCBNT0RVTEVfTkFNRSwgc2l6ZW9mKGZpeC0+aWQpKTsKKworCWluZm8t PnBzZXVkb19wYWxldHRlID0gZmJkZXYtPnBzZXVkb19wYWxldHRlOworCisJdmFyLT5hY2NlbF9m bGFncyAgPSBkZWZfYWNjZWwgPyBGQl9BQ0NFTEZfVEVYVCA6IDA7CisJdmFyLT54cmVzID0gZGVm X3Z4cmVzOworCXZhci0+eXJlcyA9IGRlZl92eXJlczsKKwl2YXItPnhyZXNfdmlydHVhbCA9IGRl Zl92eHJlczsKKwl2YXItPnlyZXNfdmlydHVhbCA9IGRlZl92eXJlczsKKwl2YXItPnJvdGF0ZQkg ID0gZGVmX3JvdGF0ZTsKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gZmJkZXYtPnBhbmVsLT5icHA7 CisKKwlzZXRfZmJfdmFyKGluZm8sIHZhcik7CisJc2V0X2ZiX2ZpeChpbmZvKTsKKworCXIgPSBm Yl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAxNiwgMCk7CisJaWYgKHIgIT0gMCkKKwkJZGV2X2Vy cihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGNvbG9yIG1hcCBtZW1vcnlcbiIpOwor CisJcmV0dXJuIHI7Cit9CisKKy8qIFJlbGVhc2UgdGhlIGZiX2luZm8gb2JqZWN0ICovCitzdGF0 aWMgdm9pZCBmYmluZm9fY2xlYW51cChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHN0cnVj dCBmYl9pbmZvICpmYmkpCit7CisJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworfQorCitz dGF0aWMgdm9pZCBwbGFuZXNfY2xlYW51cChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7 CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7 IGkrKykgeworCQlpZiAoZmJkZXYtPmZiX2luZm9baV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlm YmluZm9fY2xlYW51cChmYmRldiwgZmJkZXYtPmZiX2luZm9baV0pOworCQlmcmFtZWJ1ZmZlcl9y ZWxlYXNlKGZiZGV2LT5mYl9pbmZvW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGxhbmVzX2lu aXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmk7 CisJaW50IGk7CisJaW50IHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJl Z2lvbl9jbnQ7IGkrKykgeworCQlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmU7CisJ CWZiaSA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVj dCksCisJCQkJCWZiZGV2LT5kZXYpOworCQlpZiAoZmJpID09IE5VTEwpIHsKKwkJCWRldl9lcnIo ZmJkZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGxhbmUgaW5m b1xuIik7CisJCQlwbGFuZXNfY2xlYW51cChmYmRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJ fQorCQlwbGFuZSA9IGZiaS0+cGFyOworCQlwbGFuZS0+aWR4ID0gaTsKKwkJcGxhbmUtPmZiZGV2 ID0gZmJkZXY7CisJCXBsYW5lLT5pbmZvLm1pcnJvciA9IGRlZl9taXJyb3I7CisJCWZiZGV2LT5m Yl9pbmZvW2ldID0gZmJpOworCisJCWlmICgociA9IGZiaW5mb19pbml0KGZiZGV2LCBmYmkpKSA8 IDApIHsKKwkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJpKTsKKwkJCXBsYW5lc19jbGVhbnVwKGZi ZGV2KTsKKwkJCXJldHVybiByOworCQl9CisJCXBsYW5lLT5pbmZvLm91dF93aWR0aCA9IGZiaS0+ dmFyLnhyZXM7CisJCXBsYW5lLT5pbmZvLm91dF9oZWlnaHQgPSBmYmktPnZhci55cmVzOworCX0K KwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgZHJpdmVyIHJlc291cmNlcy4gQ2FuIGJlIGNh bGxlZCB0byByb2xsYmFjayBhbiBhYm9ydGVkIGluaXRpYWxpemF0aW9uCisgKiBzZXF1ZW5jZS4K KyAqLworc3RhdGljIHZvaWQgb21hcGZiX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBvbWFwZmJfZGV2 aWNlICpmYmRldiwgaW50IHN0YXRlKQoreworCWludCBpOworCisJc3dpdGNoIChzdGF0ZSkgewor CWNhc2UgT01BUEZCX0FDVElWRToKKwkJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5y ZWdpb25fY250OyBpKyspCisJCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiZGV2LT5mYl9pbmZv W2ldKTsKKwljYXNlIDc6CisJCW9tYXBmYl91bnJlZ2lzdGVyX3N5c2ZzKGZiZGV2KTsKKwljYXNl IDY6CisJCWZiZGV2LT5wYW5lbC0+ZGlzYWJsZShmYmRldi0+cGFuZWwpOworCWNhc2UgNToKKwkJ b21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJ Y2FzZSA0OgorCQlwbGFuZXNfY2xlYW51cChmYmRldik7CisJY2FzZSAzOgorCQljdHJsX2NsZWFu dXAoZmJkZXYpOworCWNhc2UgMjoKKwkJZmJkZXYtPnBhbmVsLT5jbGVhbnVwKGZiZGV2LT5wYW5l bCk7CisJY2FzZSAxOgorCQlkZXZfc2V0X2RydmRhdGEoZmJkZXYtPmRldiwgTlVMTCk7CisJCWtm cmVlKGZiZGV2KTsKKwljYXNlIDA6CisJCS8qIG5vdGhpbmcgdG8gZnJlZSAqLworCQlicmVhazsK KwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX2ZpbmRfY3Ry bChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9y bV9kYXRhICpjb25mOworCWNoYXIgbmFtZVsxN107CisJaW50IGk7CisKKwljb25mID0gZmJkZXYt PmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWZiZGV2LT5jdHJsID0gTlVMTDsKKworCXN0cm5jcHko bmFtZSwgY29uZi0+bGNkLmN0cmxfbmFtZSwgc2l6ZW9mKG5hbWUpIC0gMSk7CisJbmFtZVtzaXpl b2YobmFtZSkgLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RyY21wKG5hbWUsICJpbnRlcm5hbCIpID09 IDApIHsKKwkJZmJkZXYtPmN0cmwgPSBmYmRldi0+aW50X2N0cmw7CisJCXJldHVybiAwOworCX0K KworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0cmxzKTsgaSsrKSB7CisJCWRldl9kYmco ZmJkZXYtPmRldiwgImN0cmwgJXNcbiIsIGN0cmxzW2ldLT5uYW1lKTsKKwkJaWYgKHN0cmNtcChj dHJsc1tpXS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZmJkZXYtPmN0cmwgPSBjdHJsc1tpXTsK KwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZiZGV2LT5jdHJsID09IE5VTEwpIHsKKwkJZGV2 X2RiZyhmYmRldi0+ZGV2LCAiY3RybCAlcyBub3Qgc3VwcG9ydGVkXG4iLCBuYW1lKTsKKwkJcmV0 dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19yZXF1aXJl ZF9jYWxsYmFja3Moc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworI2RlZmluZSBfQyh4 KSAoZmJkZXYtPmN0cmwtPnggIT0gTlVMTCkKKyNkZWZpbmUgX1AoeCkgKGZiZGV2LT5wYW5lbC0+ eCAhPSBOVUxMKQorCUJVR19PTihmYmRldi0+Y3RybCA9PSBOVUxMIHx8IGZiZGV2LT5wYW5lbCA9 PSBOVUxMKTsKKwlCVUdfT04oIShfQyhpbml0KSAmJiBfQyhjbGVhbnVwKSAmJiBfQyhnZXRfY2Fw cykgJiYKKwkJIF9DKHNldF91cGRhdGVfbW9kZSkgJiYgX0Moc2V0dXBfcGxhbmUpICYmIF9DKGVu YWJsZV9wbGFuZSkgJiYKKwkJIF9QKGluaXQpICYmIF9QKGNsZWFudXApICYmIF9QKGVuYWJsZSkg JiYgX1AoZGlzYWJsZSkgJiYKKwkJIF9QKGdldF9jYXBzKSkpOworI3VuZGVmIF9QCisjdW5kZWYg X0MKK30KKworLyoKKyAqIENhbGxlZCBieSBMRE0gYmluZGluZyB0byBwcm9iZSBhbmQgYXR0YWNo IGEgbmV3IGRldmljZS4KKyAqIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlOgorICogICAxLiBhbGxv Y2F0ZSBzeXN0ZW0gb21hcGZiX2RldmljZSBzdHJ1Y3R1cmUKKyAqICAgMi4gc2VsZWN0IGNvbnRy b2xsZXIgdHlwZSBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgorICogICAgICBp bml0IExDRCBwYW5lbAorICogICAzLiBpbml0IExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BCisg KiAgIDQuIGluaXQgc3lzdGVtIGZiX2luZm8gc3RydWN0dXJlIGZvciBhbGwgcGxhbmVzCisgKiAg IDUuIHNldHVwIHZpZGVvIG1vZGUgZm9yIGZpcnN0IHBsYW5lIGFuZCBlbmFibGUgaXQKKyAqICAg Ni4gZW5hYmxlIExDRCBwYW5lbAorICogICA3LiByZWdpc3RlciBzeXNmcyBhdHRyaWJ1dGVzCisg KiAgIE9NQVBGQl9BQ1RJVkU6IHJlZ2lzdGVyIHN5c3RlbSBmYl9pbmZvIHN0cnVjdHVyZSBmb3Ig YWxsIHBsYW5lcworICovCitzdGF0aWMgaW50IG9tYXBmYl9kb19wcm9iZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2LAorCQkJCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXN0cnVj dCBvbWFwZmJfZGV2aWNlCSpmYmRldiA9IE5VTEw7CisJaW50CQkJaW5pdF9zdGF0ZTsKKwl1bnNp Z25lZCBsb25nCQlwaHosIGhoeiwgdmh6OworCXVuc2lnbmVkIGxvbmcJCXZyYW07CisJaW50CQkJ aTsKKwlpbnQJCQlyID0gMDsKKworCWluaXRfc3RhdGUgPSAwOworCisJaWYgKHBkZXYtPm51bV9y ZXNvdXJjZXMgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwcm9iZWQgZm9yIGFuIHVu a25vd24gZGV2aWNlXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gY2xlYW51cDsKKwl9CisK KwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyID0gLUVOT0VOVDsKKwkJZ290 byBjbGVhbnVwOworCX0KKworCWZiZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBmYl9k ZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmJkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZw ZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIGluZm9c biIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpbml0X3N0YXRlKys7 CisKKwlmYmRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlmYmRldi0+cGFuZWwgPSBwYW5lbDsKKwlw bGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmYmRldik7CisKKwltdXRleF9pbml0KCZmYmRldi0+ cnF1ZXVlX211dGV4KTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCisJZmJkZXYtPmludF9j dHJsID0gJm9tYXAxX2ludF9jdHJsOworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJO QUwKKwlmYmRldi0+ZXh0X2lmID0gJm9tYXAxX2V4dF9pZjsKKyNlbmRpZgorI2Vsc2UJLyogT01B UDIgKi8KKwlmYmRldi0+aW50X2N0cmwgPSAmb21hcDJfaW50X2N0cmw7CisjaWZkZWYgQ09ORklH X0ZCX09NQVBfTENEQ19FWFRFUk5BTAorCWZiZGV2LT5leHRfaWYgPSAmb21hcDJfZXh0X2lmOwor I2VuZGlmCisjZW5kaWYKKwlpZiAob21hcGZiX2ZpbmRfY3RybChmYmRldikgPCAwKSB7CisJCWRl dl9lcnIoZmJkZXYtPmRldiwKKwkJCSJMQ0QgY29udHJvbGxlciBub3QgZm91bmQsIGJvYXJkIG5v dCBzdXBwb3J0ZWRcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKwor CXIgPSBmYmRldi0+cGFuZWwtPmluaXQoZmJkZXYtPnBhbmVsLCBmYmRldik7CisJaWYgKHIpCisJ CWdvdG8gY2xlYW51cDsKKworCXByX2luZm8oIm9tYXBmYjogY29uZmlndXJlZCBmb3IgcGFuZWwg JXNcbiIsIGZiZGV2LT5wYW5lbC0+bmFtZSk7CisKKwlkZWZfdnhyZXMgPSBkZWZfdnhyZXMgPyA6 IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJZGVmX3Z5cmVzID0gZGVmX3Z5cmVzID8gOiBmYmRldi0+ cGFuZWwtPnlfcmVzOworCisJaW5pdF9zdGF0ZSsrOworCisJciA9IGN0cmxfaW5pdChmYmRldik7 CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoZmJkZXYtPmN0cmwtPm1tYXAgIT0gTlVM TCkKKwkJb21hcGZiX29wcy5mYl9tbWFwID0gb21hcGZiX21tYXA7CisJaW5pdF9zdGF0ZSsrOwor CisJY2hlY2tfcmVxdWlyZWRfY2FsbGJhY2tzKGZiZGV2KTsKKworCXIgPSBwbGFuZXNfaW5pdChm YmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKyNpZmRl ZiBDT05GSUdfRkJfT01BUF9ETUFfVFVORQorCS8qIFNldCBETUEgcHJpb3JpdHkgZm9yIEVNSUZG IGFjY2VzcyB0byBoaWdoZXN0ICovCisJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQorCQlvbWFw X3NldF9kbWFfcHJpb3JpdHkoMCwgT01BUF9ETUFfUE9SVF9FTUlGRiwgMTUpOworI2VuZGlmCisK KwlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmRldi0+ZmJfaW5mb1swXSk7CisJaWYgKHIpIHsKKwkJ ZGV2X2VycihmYmRldi0+ZGV2LCAibW9kZSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCWdvdG8gY2xl YW51cDsKKwl9CisKKwkvKiBHRlggcGxhbmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0ICovCisJciA9 IGZiZGV2LT5jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMSk7CisJaWYgKHIp CisJCWdvdG8gY2xlYW51cDsKKworCW9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJkZXYsIG1hbnVh bF91cGRhdGUgPworCQkJCSAgIE9NQVBGQl9NQU5VQUxfVVBEQVRFIDogT01BUEZCX0FVVE9fVVBE QVRFKTsKKwlpbml0X3N0YXRlKys7CisKKwlyID0gZmJkZXYtPnBhbmVsLT5lbmFibGUoZmJkZXYt PnBhbmVsKTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworCXIg PSBvbWFwZmJfcmVnaXN0ZXJfc3lzZnMoZmJkZXYpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7 CisJaW5pdF9zdGF0ZSsrOworCisJdnJhbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5t ZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZi ZGV2LT5mYl9pbmZvW2ldKTsKKwkJaWYgKHIgIT0gMCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2 LAorCQkJCSJyZWdpc3RlcmluZyBmcmFtZWJ1ZmZlciAlZCBmYWlsZWRcbiIsIGkpOworCQkJZ290 byBjbGVhbnVwOworCQl9CisJCXZyYW0gKz0gZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXpl OworCX0KKworCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9BQ1RJVkU7CisKKwlwYW5lbCA9IGZiZGV2 LT5wYW5lbDsKKwlwaHogPSBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwOworCWhoeiA9IHBoeiAq IDEwIC8gKHBhbmVsLT5oZnAgKyBwYW5lbC0+eF9yZXMgKyBwYW5lbC0+aGJwICsgcGFuZWwtPmhz dyk7CisJdmh6ID0gaGh6IC8gKHBhbmVsLT52ZnAgKyBwYW5lbC0+eV9yZXMgKyBwYW5lbC0+dmJw ICsgcGFuZWwtPnZzdyk7CisKKwlvbWFwZmJfZGV2ID0gZmJkZXY7CisKKwlwcl9pbmZvKCJvbWFw ZmI6IEZyYW1lYnVmZmVyIGluaXRpYWxpemVkLiBUb3RhbCB2cmFtICVsdSBwbGFuZXMgJWRcbiIs CisJCQl2cmFtLCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCk7CisJcHJfaW5mbygib21hcGZi OiBQaXhjbG9jayAlbHUga0h6IGhmcmVxICVsdS4lbHUga0h6ICIKKwkJCSJ2ZnJlcSAlbHUuJWx1 IEh6XG4iLAorCQkJcGh6IC8gMTAwMCwgaGh6IC8gMTAwMDAsIGhoeiAlIDEwLCB2aHogLyAxMCwg dmh6ICUgMTApOworCisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJb21hcGZiX2ZyZWVfcmVzb3Vy Y2VzKGZiZGV2LCBpbml0X3N0YXRlKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9t YXBmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCUJVR19PTihmYmRl dl9wZGV2ICE9IE5VTEwpOworCisJLyogRGVsYXkgYWN0dWFsIGluaXRpYWxpemF0aW9uIHVudGls IHRoZSBMQ0QgaXMgcmVnaXN0ZXJlZCAqLworCWZiZGV2X3BkZXYgPSBwZGV2OworCWlmIChmYmRl dl9wYW5lbCAhPSBOVUxMKQorCQlvbWFwZmJfZG9fcHJvYmUoZmJkZXZfcGRldiwgZmJkZXZfcGFu ZWwpOworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBmYl9yZWdpc3Rlcl9wYW5lbChzdHJ1Y3Qg bGNkX3BhbmVsICpwYW5lbCkKK3sKKwlCVUdfT04oZmJkZXZfcGFuZWwgIT0gTlVMTCk7CisKKwlm YmRldl9wYW5lbCA9IHBhbmVsOworCWlmIChmYmRldl9wZGV2ICE9IE5VTEwpCisJCW9tYXBmYl9k b19wcm9iZShmYmRldl9wZGV2LCBmYmRldl9wYW5lbCk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRo ZSBkZXZpY2UgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50 IG9tYXBmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qg b21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwllbnVt IG9tYXBmYl9zdGF0ZSBzYXZlZF9zdGF0ZSA9IGZiZGV2LT5zdGF0ZTsKKworCS8qIEZJWE1FOiB3 YWl0IHRpbGwgY29tcGxldGlvbiBvZiBwZW5kaW5nIGV2ZW50cyAqLworCisJZmJkZXYtPnN0YXRl ID0gT01BUEZCX0RJU0FCTEVEOworCW9tYXBmYl9mcmVlX3Jlc291cmNlcyhmYmRldiwgc2F2ZWRf c3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBNIHN1c3BlbmQgKi8KK3N0YXRpYyBpbnQg b21hcGZiX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90 IG1lc2cpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2Ry dmRhdGEocGRldik7CisKKwlvbWFwZmJfYmxhbmsoVkVTQV9QT1dFUkRPV04sIGZiZGV2LT5mYl9p bmZvWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBQTSByZXN1bWUgKi8KK3N0YXRpYyBpbnQg b21hcGZiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBv bWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb21h cGZiX2JsYW5rKFZFU0FfTk9fQkxBTktJTkcsIGZiZGV2LT5mYl9pbmZvWzBdKTsKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcGZiX2RyaXZlciA9IHsK KwkucHJvYmUJCT0gb21hcGZiX3Byb2JlLAorCS5yZW1vdmUJCT0gb21hcGZiX3JlbW92ZSwKKwku c3VzcGVuZAk9IG9tYXBmYl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb21hcGZiX3Jlc3VtZSwKKwku ZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RV TEUsCisJfSwKK307CisKKyNpZm5kZWYgTU9EVUxFCisKKy8qIFByb2Nlc3Mga2VybmVsIGNvbW1h bmQgbGluZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwZmJfc2V0dXAoY2hh ciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdCA9IE5VTEw7CisJaW50IHIgPSAwOworCisJ cHJfZGVidWcoIm9tYXBmYjogb3B0aW9ucyAlc1xuIiwgb3B0aW9ucyk7CisKKwlpZiAoIW9wdGlv bnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghciAmJiAodGhpc19vcHQg PSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJuY21wKHRoaXNf b3B0LCAiYWNjZWwiLCA1KSkKKwkJCWRlZl9hY2NlbCA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21w KHRoaXNfb3B0LCAidnJhbToiLCA1KSkgeworCQkJY2hhciAqc3VmZml4OworCQkJdW5zaWduZWQg bG9uZyB2cmFtOworCQkJdnJhbSA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsICZzdWZm aXgsIDApKTsKKwkJCXN3aXRjaCAoc3VmZml4WzBdKSB7CisJCQljYXNlICdcMCc6CisJCQkJYnJl YWs7CisJCQljYXNlICdtJzoKKwkJCWNhc2UgJ00nOgorCQkJCXZyYW0gKj0gMTAyNDsKKwkJCQkv KiBGYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgJ2snOgorCQkJY2FzZSAnSyc6CisJCQkJdnJhbSAq PSAxMDI0OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9kZWJ1Zygib21hcGZiOiBp bnZhbGlkIHZyYW0gc3VmZml4ICVjXG4iLAorCQkJCQkgc3VmZml4WzBdKTsKKwkJCQlyID0gLTE7 CisJCQl9CisJCQlkZWZfdnJhbVtkZWZfdnJhbV9jbnQrK10gPSB2cmFtOworCQl9CisJCWVsc2Ug aWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnhyZXM6IiwgNikpCisJCQlkZWZfdnhyZXMgPSBzaW1w bGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0 aGlzX29wdCwgInZ5cmVzOiIsIDYpKQorCQkJZGVmX3Z5cmVzID0gc2ltcGxlX3N0cnRvdWwodGhp c19vcHQgKyA2LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJyb3Rh dGU6IiwgNykpCisJCQlkZWZfcm90YXRlID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNywg TlVMTCwgMCkpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1pcnJvcjoiLCA3KSkK KwkJCWRlZl9taXJyb3IgPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKSk7 CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWFudWFsX3VwZGF0ZSIsIDEzKSkKKwkJ CW1hbnVhbF91cGRhdGUgPSAxOworCQllbHNlIHsKKwkJCXByX2RlYnVnKCJvbWFwZmI6IGludmFs aWQgb3B0aW9uXG4iKTsKKwkJCXIgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCisj ZW5kaWYKKworLyogUmVnaXN0ZXIgYm90aCB0aGUgZHJpdmVyIGFuZCB0aGUgZGV2aWNlICovCitz dGF0aWMgaW50IF9faW5pdCBvbWFwZmJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwlj aGFyICpvcHRpb247CisKKwlpZiAoZmJfZ2V0X29wdGlvbnMoIm9tYXBmYiIsICZvcHRpb24pKQor CQlyZXR1cm4gLUVOT0RFVjsKKwlvbWFwZmJfc2V0dXAob3B0aW9uKTsKKyNlbmRpZgorCS8qIFJl Z2lzdGVyIHRoZSBkcml2ZXIgd2l0aCBMRE0gKi8KKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lz dGVyKCZvbWFwZmJfZHJpdmVyKSkgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIHJlZ2lzdGVyIG9t YXBmYiBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgX19leGl0IG9tYXBmYl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1f ZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBmYl9kcml2ZXIpOworfQorCittb2R1bGVfcGFyYW1fbmFt ZWQoYWNjZWwsIGRlZl9hY2NlbCwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFt ZWQodnJhbSwgZGVmX3ZyYW0sIHVsb25nLCAmZGVmX3ZyYW1fY250LCAwNjY0KTsKK21vZHVsZV9w YXJhbV9uYW1lZCh2eHJlcywgZGVmX3Z4cmVzLCBsb25nLCAwNjY0KTsKK21vZHVsZV9wYXJhbV9u YW1lZCh2eXJlcywgZGVmX3Z5cmVzLCBsb25nLCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChy b3RhdGUsIGRlZl9yb3RhdGUsIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKG1pcnJv ciwgZGVmX21pcnJvciwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWFudWFsX3Vw ZGF0ZSwgbWFudWFsX3VwZGF0ZSwgYm9vbCwgMDY2NCk7CisKK21vZHVsZV9pbml0KG9tYXBmYl9p bml0KTsKK21vZHVsZV9leGl0KG9tYXBmYl9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9O KCJUSSBPTUFQIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSW1yZSBEZWFr IDxpbXJlLmRlYWtAbm9raWEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotLSAKMS41 LjAKCg== ------=_Part_17288_18739357.1182861233576-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/