From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <1342451569.7270.11.camel@brekeke> Subject: Re: [PATCH v4 0/2] add gpmi support for imx6q From: Artem Bityutskiy To: Huang Shijie Date: Mon, 16 Jul 2012 18:12:49 +0300 In-Reply-To: <1341279572-6098-1-git-send-email-shijie8@gmail.com> References: <1341279572-6098-1-git-send-email-shijie8@gmail.com> Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature"; boundary="=-yMkFaHy1ZLGL4kw0Srf/" Mime-Version: 1.0 Cc: dong.aisheng@linaro.org, shawn.guo@linaro.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org Reply-To: dedekind1@gmail.com List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , --=-yMkFaHy1ZLGL4kw0Srf/ Content-Type: multipart/mixed; boundary="=-YnFhL7MeMVc95DgI8xO4" --=-YnFhL7MeMVc95DgI8xO4 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, 2012-07-02 at 21:39 -0400, Huang Shijie wrote: > This patch set adds the gpmi-nand support for imx6q. Shawn's ack would be nice to have. BTW, aiaiai complains like this about your driver: drivers/mtd/nand/gpmi-nand/gpmi-nand.c:327:11: warning: incorrect type in a= ssignment (different address spaces) [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:327:11: expected void *p [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:327:11: got void [noderef] * [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:347:28: warning: incorrect type in a= rgument 1 (different address spaces) [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:347:28: expected void volatile [n= oderef] *addr [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:347:28: got void *gpmi_regs [spar= se] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:349:28: warning: incorrect type in a= rgument 1 (different address spaces) [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:349:28: expected void volatile [n= oderef] *addr [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:349:28: got void *bch_regs [spars= e] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1464:6: warning: symbol 'gpmi_nfc_ex= it' was not declared. Should it be static? [sparse] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:670 gpmi_alloc_dma_buffer() error: n= o modifiers for allocation. [smatch] drivers/mtd/nand/gpmi-nand/gpmi-nand.c:675 gpmi_alloc_dma_buffer() error: n= o modifiers for allocation. [smatch] drivers/mtd/nand/gpmi-nand/gpmi-nand.c: In function 'mx23_check_transcripti= on_stamp': drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1198:9: warning: variable 'byte' set= but not used [-Wunused-but-set-variable] drivers/mtd/nand/gpmi-nand/gpmi-nand.c: In function 'mx23_write_transcripti= on_stamp': drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1259:15: warning: variable 'byte' se= t but not used [-Wunused-but-set-variable] drivers/mtd/nand/gpmi-nand/gpmi-nand.c: At top level: drivers/mtd/nand/gpmi-nand/gpmi-nand.c:1464:6: warning: no previous prototy= pe for 'gpmi_nfc_exit' [-Wmissing-prototypes] I did not check whether they are false-positives or not, but some of these are reasonable warnings - could you please take a look and possibly fix? To make sure the line numbers are the same for you, I've attached the gpmi-nand.c which was tested. --=20 Best Regards, Artem Bityutskiy --=-YnFhL7MeMVc95DgI8xO4 Content-Disposition: attachment; filename="gpmi-nand.c" Content-Transfer-Encoding: base64 Content-Type: text/x-csrc; name="gpmi-nand.c"; charset="UTF-8" LyoNCiAqIEZyZWVzY2FsZSBHUE1JIE5BTkQgRmxhc2ggRHJpdmVyDQogKg0KICogQ29weXJpZ2h0 IChDKSAyMDEwLTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4NCiAqIENvcHlyaWdo dCAoQykgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYy4NCiAqDQogKiBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJ TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYWxvbmcNCiAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sDQogKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo IEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLg0KICovDQojaW5jbHVkZSA8bGludXgv Y2xrLmg+DQojaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4L210ZC9ncG1p LW5hbmQuaD4NCiNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPg0KI2luY2x1ZGUgPGxp bnV4L3BpbmN0cmwvY29uc3VtZXIuaD4NCiNpbmNsdWRlIDxsaW51eC9vZi5oPg0KI2luY2x1ZGUg PGxpbnV4L29mX2RldmljZS5oPg0KI2luY2x1ZGUgImdwbWktbmFuZC5oIg0KDQovKiBhZGQgb3Vy IG93bmVyIGJidCBkZXNjcmlwdG9yICovDQpzdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5b XSA9IHsgMHhmZiB9Ow0Kc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBncG1pX2JidF9kZXNj ciA9IHsNCgkub3B0aW9ucwk9IDAsDQoJLm9mZnMJCT0gMCwNCgkubGVuCQk9IDEsDQoJLnBhdHRl cm4JPSBzY2FuX2ZmX3BhdHRlcm4NCn07DQoNCi8qICBXZSB3aWxsIHVzZSBhbGwgdGhlIChwYWdl ICsgT09CKS4gKi8NCnN0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgZ3BtaV9od19lY2NsYXlv dXQgPSB7DQoJLmVjY2J5dGVzID0gMCwNCgkuZWNjcG9zID0geyAwLCB9LA0KCS5vb2JmcmVlID0g eyB7Lm9mZnNldCA9IDAsIC5sZW5ndGggPSAwfSB9DQp9Ow0KDQpzdGF0aWMgaXJxcmV0dXJuX3Qg YmNoX2lycShpbnQgaXJxLCB2b2lkICpjb29raWUpDQp7DQoJc3RydWN0IGdwbWlfbmFuZF9kYXRh ICp0aGlzID0gY29va2llOw0KDQoJZ3BtaV9jbGVhcl9iY2godGhpcyk7DQoJY29tcGxldGUoJnRo aXMtPmJjaF9kb25lKTsNCglyZXR1cm4gSVJRX0hBTkRMRUQ7DQp9DQoNCi8qDQogKiAgQ2FsY3Vs YXRlIHRoZSBFQ0Mgc3RyZW5ndGggYnkgaGFuZDoNCiAqCUUgOiBUaGUgRUNDIHN0cmVuZ3RoLg0K ICoJRyA6IHRoZSBsZW5ndGggb2YgR2Fsb2lzIEZpZWxkLg0KICoJTiA6IFRoZSBjaHVuayBjb3Vu dCBvZiBwZXIgcGFnZS4NCiAqCU8gOiB0aGUgb29ic2l6ZSBvZiB0aGUgTkFORCBjaGlwLg0KICoJ TSA6IHRoZSBtZXRhc2l6ZSBvZiBwZXIgcGFnZS4NCiAqDQogKglUaGUgZm9ybXVsYSBpcyA6DQog KgkJRSAqIEcgKiBODQogKgkgICAgICAtLS0tLS0tLS0tLS0gPD0gKE8gLSBNKQ0KICogICAgICAg ICAgICAgICAgICA4DQogKg0KICogICAgICBTbywgd2UgZ2V0IEUgYnk6DQogKiAgICAgICAgICAg ICAgICAgICAgKE8gLSBNKSAqIDgNCiAqICAgICAgICAgICAgICBFIDw9IC0tLS0tLS0tLS0tLS0N CiAqICAgICAgICAgICAgICAgICAgICAgICBHICogTg0KICovDQpzdGF0aWMgaW5saW5lIGludCBn ZXRfZWNjX3N0cmVuZ3RoKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykNCnsNCglzdHJ1Y3Qg YmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5Ow0KCXN0cnVjdCBtdGRfaW5m bwkqbXRkID0gJnRoaXMtPm10ZDsNCglpbnQgZWNjX3N0cmVuZ3RoOw0KDQoJZWNjX3N0cmVuZ3Ro ID0gKChtdGQtPm9vYnNpemUgLSBnZW8tPm1ldGFkYXRhX3NpemUpICogOCkNCgkJCS8gKGdlby0+ Z2ZfbGVuICogZ2VvLT5lY2NfY2h1bmtfY291bnQpOw0KDQoJLyogV2UgbmVlZCB0aGUgbWlub3Ig ZXZlbiBudW1iZXIuICovDQoJcmV0dXJuIHJvdW5kX2Rvd24oZWNjX3N0cmVuZ3RoLCAyKTsNCn0N Cg0KaW50IGNvbW1vbl9uZmNfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhp cykNCnsNCglzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5Ow0K CXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gJnRoaXMtPm10ZDsNCgl1bnNpZ25lZCBpbnQgbWV0YWRh dGFfc2l6ZTsNCgl1bnNpZ25lZCBpbnQgc3RhdHVzX3NpemU7DQoJdW5zaWduZWQgaW50IGJsb2Nr X21hcmtfYml0X29mZnNldDsNCg0KCS8qDQoJICogVGhlIHNpemUgb2YgdGhlIG1ldGFkYXRhIGNh biBiZSBjaGFuZ2VkLCB0aG91Z2ggd2Ugc2V0IGl0IHRvIDEwDQoJICogYnl0ZXMgbm93LiBCdXQg aXQgY2FuJ3QgYmUgdG9vIGxhcmdlLCBiZWNhdXNlIHdlIGhhdmUgdG8gc2F2ZQ0KCSAqIGVub3Vn aCBzcGFjZSBmb3IgQkNILg0KCSAqLw0KCWdlby0+bWV0YWRhdGFfc2l6ZSA9IDEwOw0KDQoJLyog VGhlIGRlZmF1bHQgZm9yIHRoZSBsZW5ndGggb2YgR2Fsb2lzIEZpZWxkLiAqLw0KCWdlby0+Z2Zf bGVuID0gMTM7DQoNCgkvKiBUaGUgZGVmYXVsdCBmb3IgY2h1bmsgc2l6ZS4gVGhlcmUgaXMgbm8g b29ic2l6ZSBncmVhdGVyIHRoZW4gNTEyLiAqLw0KCWdlby0+ZWNjX2NodW5rX3NpemUgPSA1MTI7 DQoJd2hpbGUgKGdlby0+ZWNjX2NodW5rX3NpemUgPCBtdGQtPm9vYnNpemUpDQoJCWdlby0+ZWNj X2NodW5rX3NpemUgKj0gMjsgLyoga2VlcCBDID49IE8gKi8NCg0KCWdlby0+ZWNjX2NodW5rX2Nv dW50ID0gbXRkLT53cml0ZXNpemUgLyBnZW8tPmVjY19jaHVua19zaXplOw0KDQoJLyogV2UgdXNl IHRoZSBzYW1lIEVDQyBzdHJlbmd0aCBmb3IgYWxsIGNodW5rcy4gKi8NCglnZW8tPmVjY19zdHJl bmd0aCA9IGdldF9lY2Nfc3RyZW5ndGgodGhpcyk7DQoJaWYgKCFnZW8tPmVjY19zdHJlbmd0aCkg ew0KCQlwcl9lcnIoIldlIGdldCBhIHdyb25nIEVDQyBzdHJlbmd0aC5cbiIpOw0KCQlyZXR1cm4g LUVJTlZBTDsNCgl9DQoNCglnZW8tPnBhZ2Vfc2l6ZSA9IG10ZC0+d3JpdGVzaXplICsgbXRkLT5v b2JzaXplOw0KCWdlby0+cGF5bG9hZF9zaXplID0gbXRkLT53cml0ZXNpemU7DQoNCgkvKg0KCSAq IFRoZSBhdXhpbGlhcnkgYnVmZmVyIGNvbnRhaW5zIHRoZSBtZXRhZGF0YSBhbmQgdGhlIEVDQyBz dGF0dXMuIFRoZQ0KCSAqIG1ldGFkYXRhIGlzIHBhZGRlZCB0byB0aGUgbmVhcmVzdCAzMi1iaXQg Ym91bmRhcnkuIFRoZSBFQ0Mgc3RhdHVzDQoJICogY29udGFpbnMgb25lIGJ5dGUgZm9yIGV2ZXJ5 IEVDQyBjaHVuaywgYW5kIGlzIGFsc28gcGFkZGVkIHRvIHRoZQ0KCSAqIG5lYXJlc3QgMzItYml0 IGJvdW5kYXJ5Lg0KCSAqLw0KCW1ldGFkYXRhX3NpemUgPSBBTElHTihnZW8tPm1ldGFkYXRhX3Np emUsIDQpOw0KCXN0YXR1c19zaXplICAgPSBBTElHTihnZW8tPmVjY19jaHVua19jb3VudCwgNCk7 DQoNCglnZW8tPmF1eGlsaWFyeV9zaXplID0gbWV0YWRhdGFfc2l6ZSArIHN0YXR1c19zaXplOw0K CWdlby0+YXV4aWxpYXJ5X3N0YXR1c19vZmZzZXQgPSBtZXRhZGF0YV9zaXplOw0KDQoJaWYgKCF0 aGlzLT5zd2FwX2Jsb2NrX21hcmspDQoJCXJldHVybiAwOw0KDQoJLyoNCgkgKiBXZSBuZWVkIHRv IGNvbXB1dGUgdGhlIGJ5dGUgYW5kIGJpdCBvZmZzZXRzIG9mDQoJICogdGhlIHBoeXNpY2FsIGJs b2NrIG1hcmsgd2l0aGluIHRoZSBFQ0MtYmFzZWQgdmlldyBvZiB0aGUgcGFnZS4NCgkgKg0KCSAq IE5BTkQgY2hpcCB3aXRoIDJLIHBhZ2Ugc2hvd3MgYmVsb3c6DQoJICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQmxvY2sgTWFyaykNCgkgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8DQoJICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEICAgfA0K CSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDwt LS0tPnwNCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFYgICAgICBWDQoJICogICAgKy0tLSstLS0tLS0tLS0tKy0rLS0tLS0tLS0tLSstKy0tLS0t LS0tLS0rLSstLS0tLS0tLS0tKy0rDQoJICogICAgfCBNIHwgICBkYXRhICAgfEV8ICAgZGF0YSAg IHxFfCAgIGRhdGEgICB8RXwgICBkYXRhICAgfEV8DQoJICogICAgKy0tLSstLS0tLS0tLS0tKy0r LS0tLS0tLS0tLSstKy0tLS0tLS0tLS0rLSstLS0tLS0tLS0tKy0rDQoJICoNCgkgKiBUaGUgcG9z aXRpb24gb2YgYmxvY2sgbWFyayBtb3ZlcyBmb3J3YXJkIGluIHRoZSBFQ0MtYmFzZWQgdmlldw0K CSAqIG9mIHBhZ2UsIGFuZCB0aGUgZGVsdGEgaXM6DQoJICoNCgkgKiAgICAgICAgICAgICAgICAg ICBFICogRyAqIChOIC0gMSkNCgkgKiAgICAgICAgICAgICBEID0gKC0tLS0tLS0tLS0tLS0tLS0g KyBNKQ0KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICA4DQoJICoNCgkgKiBXaXRoIHRoZSBm b3JtdWxhIHRvIGNvbXB1dGUgdGhlIEVDQyBzdHJlbmd0aCwgYW5kIHRoZSBjb25kaXRpb24NCgkg KiAgICAgICA6IEMgPj0gTyAgICAgICAgIChDIGlzIHRoZSBlY2MgY2h1bmsgc2l6ZSkNCgkgKg0K CSAqIEl0J3MgZWFzeSB0byBkZWR1Y2UgdG8gdGhlIGZvbGxvd2luZyByZXN1bHQ6DQoJICoNCgkg KiAgICAgICAgIEUgKiBHICAgICAgIChPIC0gTSkgICAgICBDIC0gTSAgICAgICAgIEMgLSBNDQoJ ICogICAgICAtLS0tLS0tLS0tLSA8PSAtLS0tLS0tIDw9ICAtLS0tLS0tLSAgPCAgLS0tLS0tLS0t DQoJICogICAgICAgICAgIDggICAgICAgICAgICBOICAgICAgICAgICBOICAgICAgICAgIChOIC0g MSkNCgkgKg0KCSAqICBTbywgd2UgZ2V0Og0KCSAqDQoJICogICAgICAgICAgICAgICAgICAgRSAq IEcgKiAoTiAtIDEpDQoJICogICAgICAgICAgICAgRCA9ICgtLS0tLS0tLS0tLS0tLS0tICsgTSkg PCBDDQoJICogICAgICAgICAgICAgICAgICAgICAgICAgIDgNCgkgKg0KCSAqICBUaGUgYWJvdmUg aW5lcXVhbGl0eSBtZWFucyB0aGUgcG9zaXRpb24gb2YgYmxvY2sgbWFyaw0KCSAqICB3aXRoaW4g dGhlIEVDQy1iYXNlZCB2aWV3IG9mIHRoZSBwYWdlIGlzIHN0aWxsIGluIHRoZSBkYXRhIGNodW5r LA0KCSAqICBhbmQgaXQncyBOT1QgaW4gdGhlIEVDQyBiaXRzIG9mIHRoZSBjaHVuay4NCgkgKg0K CSAqICBVc2UgdGhlIGZvbGxvd2luZyB0byBjb21wdXRlIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhl DQoJICogIHBoeXNpY2FsIGJsb2NrIG1hcmsgd2l0aGluIHRoZSBFQ0MtYmFzZWQgdmlldyBvZiB0 aGUgcGFnZToNCgkgKiAgICAgICAgICAocGFnZV9zaXplIC0gRCkgKiA4DQoJICoNCgkgKiAgLS1I dWFuZyBTaGlqaWUNCgkgKi8NCglibG9ja19tYXJrX2JpdF9vZmZzZXQgPSBtdGQtPndyaXRlc2l6 ZSAqIDggLQ0KCQkoZ2VvLT5lY2Nfc3RyZW5ndGggKiBnZW8tPmdmX2xlbiAqIChnZW8tPmVjY19j aHVua19jb3VudCAtIDEpDQoJCQkJKyBnZW8tPm1ldGFkYXRhX3NpemUgKiA4KTsNCg0KCWdlby0+ YmxvY2tfbWFya19ieXRlX29mZnNldCA9IGJsb2NrX21hcmtfYml0X29mZnNldCAvIDg7DQoJZ2Vv LT5ibG9ja19tYXJrX2JpdF9vZmZzZXQgID0gYmxvY2tfbWFya19iaXRfb2Zmc2V0ICUgODsNCgly ZXR1cm4gMDsNCn0NCg0Kc3RydWN0IGRtYV9jaGFuICpnZXRfZG1hX2NoYW4oc3RydWN0IGdwbWlf bmFuZF9kYXRhICp0aGlzKQ0Kew0KCWludCBjaGlwbnIgPSB0aGlzLT5jdXJyZW50X2NoaXA7DQoN CglyZXR1cm4gdGhpcy0+ZG1hX2NoYW5zW2NoaXBucl07DQp9DQoNCi8qIENhbiB3ZSB1c2UgdGhl IHVwcGVyJ3MgYnVmZmVyIGRpcmVjdGx5IGZvciBETUE/ICovDQp2b2lkIHByZXBhcmVfZGF0YV9k bWEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBk cikNCnsNCglzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9ICZ0aGlzLT5kYXRhX3NnbDsNCglpbnQg cmV0Ow0KDQoJdGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPSB0cnVlOw0KDQoJLyogZmlyc3QgdHJ5 IHRvIG1hcCB0aGUgdXBwZXIgYnVmZmVyIGRpcmVjdGx5ICovDQoJc2dfaW5pdF9vbmUoc2dsLCB0 aGlzLT51cHBlcl9idWYsIHRoaXMtPnVwcGVyX2xlbik7DQoJcmV0ID0gZG1hX21hcF9zZyh0aGlz LT5kZXYsIHNnbCwgMSwgZHIpOw0KCWlmIChyZXQgPT0gMCkgew0KCQkvKiBXZSBoYXZlIHRvIHVz ZSBvdXIgb3duIERNQSBidWZmZXIuICovDQoJCXNnX2luaXRfb25lKHNnbCwgdGhpcy0+ZGF0YV9i dWZmZXJfZG1hLCBQQUdFX1NJWkUpOw0KDQoJCWlmIChkciA9PSBETUFfVE9fREVWSUNFKQ0KCQkJ bWVtY3B5KHRoaXMtPmRhdGFfYnVmZmVyX2RtYSwgdGhpcy0+dXBwZXJfYnVmLA0KCQkJCXRoaXMt PnVwcGVyX2xlbik7DQoNCgkJcmV0ID0gZG1hX21hcF9zZyh0aGlzLT5kZXYsIHNnbCwgMSwgZHIp Ow0KCQlpZiAocmV0ID09IDApDQoJCQlwcl9lcnIoIm1hcCBmYWlsZWQuXG4iKTsNCg0KCQl0aGlz LT5kaXJlY3RfZG1hX21hcF9vayA9IGZhbHNlOw0KCX0NCn0NCg0KLyogVGhpcyB3aWxsIGJlIGNh bGxlZCBhZnRlciB0aGUgRE1BIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gKi8NCnN0YXRpYyB2b2lk IGRtYV9pcnFfY2FsbGJhY2sodm9pZCAqcGFyYW0pDQp7DQoJc3RydWN0IGdwbWlfbmFuZF9kYXRh ICp0aGlzID0gcGFyYW07DQoJc3RydWN0IGNvbXBsZXRpb24gKmRtYV9jID0gJnRoaXMtPmRtYV9k b25lOw0KDQoJY29tcGxldGUoZG1hX2MpOw0KDQoJc3dpdGNoICh0aGlzLT5kbWFfdHlwZSkgew0K CWNhc2UgRE1BX0ZPUl9DT01NQU5EOg0KCQlkbWFfdW5tYXBfc2codGhpcy0+ZGV2LCAmdGhpcy0+ Y21kX3NnbCwgMSwgRE1BX1RPX0RFVklDRSk7DQoJCWJyZWFrOw0KDQoJY2FzZSBETUFfRk9SX1JF QURfREFUQToNCgkJZG1hX3VubWFwX3NnKHRoaXMtPmRldiwgJnRoaXMtPmRhdGFfc2dsLCAxLCBE TUFfRlJPTV9ERVZJQ0UpOw0KCQlpZiAodGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPT0gZmFsc2Up DQoJCQltZW1jcHkodGhpcy0+dXBwZXJfYnVmLCB0aGlzLT5kYXRhX2J1ZmZlcl9kbWEsDQoJCQkJ dGhpcy0+dXBwZXJfbGVuKTsNCgkJYnJlYWs7DQoNCgljYXNlIERNQV9GT1JfV1JJVEVfREFUQToN CgkJZG1hX3VubWFwX3NnKHRoaXMtPmRldiwgJnRoaXMtPmRhdGFfc2dsLCAxLCBETUFfVE9fREVW SUNFKTsNCgkJYnJlYWs7DQoNCgljYXNlIERNQV9GT1JfUkVBRF9FQ0NfUEFHRToNCgljYXNlIERN QV9GT1JfV1JJVEVfRUNDX1BBR0U6DQoJCS8qIFdlIGhhdmUgdG8gd2FpdCB0aGUgQkNIIGludGVy cnVwdCB0byBmaW5pc2guICovDQoJCWJyZWFrOw0KDQoJZGVmYXVsdDoNCgkJcHJfZXJyKCJpbiB3 cm9uZyBETUEgb3BlcmF0aW9uLlxuIik7DQoJfQ0KfQ0KDQppbnQgc3RhcnRfZG1hX3dpdGhvdXRf YmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsDQoJCQkJc3RydWN0IGRtYV9hc3lu Y190eF9kZXNjcmlwdG9yICpkZXNjKQ0Kew0KCXN0cnVjdCBjb21wbGV0aW9uICpkbWFfYyA9ICZ0 aGlzLT5kbWFfZG9uZTsNCglpbnQgZXJyOw0KDQoJaW5pdF9jb21wbGV0aW9uKGRtYV9jKTsNCg0K CWRlc2MtPmNhbGxiYWNrCQk9IGRtYV9pcnFfY2FsbGJhY2s7DQoJZGVzYy0+Y2FsbGJhY2tfcGFy YW0JPSB0aGlzOw0KCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7DQoJZG1hX2FzeW5jX2lzc3VlX3Bl bmRpbmcoZ2V0X2RtYV9jaGFuKHRoaXMpKTsNCg0KCS8qIFdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQg ZnJvbSB0aGUgRE1BIGJsb2NrLiAqLw0KCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91 dChkbWFfYywgbXNlY3NfdG9famlmZmllcygxMDAwKSk7DQoJaWYgKCFlcnIpIHsNCgkJcHJfZXJy KCJETUEgdGltZW91dCwgbGFzdCBETUEgOiVkXG4iLCB0aGlzLT5sYXN0X2RtYV90eXBlKTsNCgkJ Z3BtaV9kdW1wX2luZm8odGhpcyk7DQoJCXJldHVybiAtRVRJTUVET1VUOw0KCX0NCglyZXR1cm4g MDsNCn0NCg0KLyoNCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCQ0ggcmVhZGluZyBvciBC Q0ggd3JpdGluZyBwYWdlcy4NCiAqIEl0IHdpbGwgd2FpdCBmb3IgdGhlIEJDSCBpbnRlcnJ1cHQg YXMgbG9uZyBhcyBPTkUgc2Vjb25kLg0KICogQWN0dWFsbHksIHdlIG11c3Qgd2FpdCBmb3IgdHdv IGludGVycnVwdHMgOg0KICoJWzFdIGZpcnN0bHkgdGhlIERNQSBpbnRlcnJ1cHQgYW5kDQogKglb Ml0gc2Vjb25kbHkgdGhlIEJDSCBpbnRlcnJ1cHQuDQogKi8NCmludCBzdGFydF9kbWFfd2l0aF9i Y2hfaXJxKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywNCgkJCXN0cnVjdCBkbWFfYXN5bmNf dHhfZGVzY3JpcHRvciAqZGVzYykNCnsNCglzdHJ1Y3QgY29tcGxldGlvbiAqYmNoX2MgPSAmdGhp cy0+YmNoX2RvbmU7DQoJaW50IGVycjsNCg0KCS8qIFByZXBhcmUgdG8gcmVjZWl2ZSBhbiBpbnRl cnJ1cHQgZnJvbSB0aGUgQkNIIGJsb2NrLiAqLw0KCWluaXRfY29tcGxldGlvbihiY2hfYyk7DQoN CgkvKiBzdGFydCB0aGUgRE1BICovDQoJc3RhcnRfZG1hX3dpdGhvdXRfYmNoX2lycSh0aGlzLCBk ZXNjKTsNCg0KCS8qIFdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgQkNIIGJsb2NrLiAq Lw0KCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dChiY2hfYywgbXNlY3NfdG9famlm ZmllcygxMDAwKSk7DQoJaWYgKCFlcnIpIHsNCgkJcHJfZXJyKCJCQ0ggdGltZW91dCwgbGFzdCBE TUEgOiVkXG4iLCB0aGlzLT5sYXN0X2RtYV90eXBlKTsNCgkJZ3BtaV9kdW1wX2luZm8odGhpcyk7 DQoJCXJldHVybiAtRVRJTUVET1VUOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludCBf X2RldmluaXQNCmFjcXVpcmVfcmVnaXN0ZXJfYmxvY2soc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0 aGlzLCBjb25zdCBjaGFyICpyZXNfbmFtZSkNCnsNCglzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2ID0gdGhpcy0+cGRldjsNCglzdHJ1Y3QgcmVzb3VyY2VzICpyZXMgPSAmdGhpcy0+cmVzb3Vy Y2VzOw0KCXN0cnVjdCByZXNvdXJjZSAqcjsNCgl2b2lkICpwOw0KDQoJciA9IHBsYXRmb3JtX2dl dF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIHJlc19uYW1lKTsNCglpZiAo IXIpIHsNCgkJcHJfZXJyKCJDYW4ndCBnZXQgcmVzb3VyY2UgZm9yICVzXG4iLCByZXNfbmFtZSk7 DQoJCXJldHVybiAtRU5YSU87DQoJfQ0KDQoJcCA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNl X3NpemUocikpOw0KCWlmICghcCkgew0KCQlwcl9lcnIoIkNhbid0IHJlbWFwICVzXG4iLCByZXNf bmFtZSk7DQoJCXJldHVybiAtRU5PTUVNOw0KCX0NCg0KCWlmICghc3RyY21wKHJlc19uYW1lLCBH UE1JX05BTkRfR1BNSV9SRUdTX0FERFJfUkVTX05BTUUpKQ0KCQlyZXMtPmdwbWlfcmVncyA9IHA7 DQoJZWxzZSBpZiAoIXN0cmNtcChyZXNfbmFtZSwgR1BNSV9OQU5EX0JDSF9SRUdTX0FERFJfUkVT X05BTUUpKQ0KCQlyZXMtPmJjaF9yZWdzID0gcDsNCgllbHNlDQoJCXByX2VycigidW5rbm93biBy ZXNvdXJjZSBuYW1lIDogJXNcbiIsIHJlc19uYW1lKTsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0 aWMgdm9pZCByZWxlYXNlX3JlZ2lzdGVyX2Jsb2NrKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhp cykNCnsNCglzdHJ1Y3QgcmVzb3VyY2VzICpyZXMgPSAmdGhpcy0+cmVzb3VyY2VzOw0KCWlmIChy ZXMtPmdwbWlfcmVncykNCgkJaW91bm1hcChyZXMtPmdwbWlfcmVncyk7DQoJaWYgKHJlcy0+YmNo X3JlZ3MpDQoJCWlvdW5tYXAocmVzLT5iY2hfcmVncyk7DQoJcmVzLT5ncG1pX3JlZ3MgPSBOVUxM Ow0KCXJlcy0+YmNoX3JlZ3MgPSBOVUxMOw0KfQ0KDQpzdGF0aWMgaW50IF9fZGV2aW5pdA0KYWNx dWlyZV9iY2hfaXJxKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywgaXJxX2hhbmRsZXJfdCBp cnFfaCkNCnsNCglzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdGhpcy0+cGRldjsNCglz dHJ1Y3QgcmVzb3VyY2VzICpyZXMgPSAmdGhpcy0+cmVzb3VyY2VzOw0KCWNvbnN0IGNoYXIgKnJl c19uYW1lID0gR1BNSV9OQU5EX0JDSF9JTlRFUlJVUFRfUkVTX05BTUU7DQoJc3RydWN0IHJlc291 cmNlICpyOw0KCWludCBlcnI7DQoNCglyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShw ZGV2LCBJT1JFU09VUkNFX0lSUSwgcmVzX25hbWUpOw0KCWlmICghcikgew0KCQlwcl9lcnIoIkNh bid0IGdldCByZXNvdXJjZSBmb3IgJXNcbiIsIHJlc19uYW1lKTsNCgkJcmV0dXJuIC1FTlhJTzsN Cgl9DQoNCgllcnIgPSByZXF1ZXN0X2lycShyLT5zdGFydCwgaXJxX2gsIDAsIHJlc19uYW1lLCB0 aGlzKTsNCglpZiAoZXJyKSB7DQoJCXByX2VycigiQ2FuJ3Qgb3duICVzXG4iLCByZXNfbmFtZSk7 DQoJCXJldHVybiBlcnI7DQoJfQ0KDQoJcmVzLT5iY2hfbG93X2ludGVycnVwdCA9IHItPnN0YXJ0 Ow0KCXJlcy0+YmNoX2hpZ2hfaW50ZXJydXB0ID0gci0+ZW5kOw0KCXJldHVybiAwOw0KfQ0KDQpz dGF0aWMgdm9pZCByZWxlYXNlX2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQ0K ew0KCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7DQoJaW50IGkgPSBy ZXMtPmJjaF9sb3dfaW50ZXJydXB0Ow0KDQoJZm9yICg7IGkgPD0gcmVzLT5iY2hfaGlnaF9pbnRl cnJ1cHQ7IGkrKykNCgkJZnJlZV9pcnEoaSwgdGhpcyk7DQp9DQoNCnN0YXRpYyBib29sIGdwbWlf ZG1hX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQ0Kew0KCXN0cnVj dCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IHBhcmFtOw0KCWludCBkbWFfY2hhbm5lbCA9IChpbnQp dGhpcy0+cHJpdmF0ZTsNCg0KCWlmICghbXhzX2RtYV9pc19hcGJoKGNoYW4pKQ0KCQlyZXR1cm4g ZmFsc2U7DQoJLyoNCgkgKiBvbmx5IGNhdGNoIHRoZSBHUE1JIGRtYSBjaGFubmVscyA6DQoJICoJ Zm9yIG14MjMgOglNWDIzX0RNQV9HUE1JMCB+IE1YMjNfRE1BX0dQTUkzDQoJICoJCShUaGVzZSBm b3VyIGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIElSUSEpDQoJICoNCgkgKglmb3IgbXgyOCA6CU1Y MjhfRE1BX0dQTUkwIH4gTVgyOF9ETUFfR1BNSTcNCgkgKgkJKFRoZXNlIGVpZ2h0IGNoYW5uZWxz IHNoYXJlIHRoZSBzYW1lIElSUSEpDQoJICovDQoJaWYgKGRtYV9jaGFubmVsID09IGNoYW4tPmNo YW5faWQpIHsNCgkJY2hhbi0+cHJpdmF0ZSA9ICZ0aGlzLT5kbWFfZGF0YTsNCgkJcmV0dXJuIHRy dWU7DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0Kc3RhdGljIHZvaWQgcmVsZWFzZV9kbWFfY2hh bm5lbHMoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQ0Kew0KCXVuc2lnbmVkIGludCBpOw0K CWZvciAoaSA9IDA7IGkgPCBETUFfQ0hBTlM7IGkrKykNCgkJaWYgKHRoaXMtPmRtYV9jaGFuc1tp XSkgew0KCQkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0aGlzLT5kbWFfY2hhbnNbaV0pOw0KCQkJdGhp cy0+ZG1hX2NoYW5zW2ldID0gTlVMTDsNCgkJfQ0KfQ0KDQpzdGF0aWMgaW50IF9fZGV2aW5pdCBh Y3F1aXJlX2RtYV9jaGFubmVscyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpDQp7DQoJc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRoaXMtPnBkZXY7DQoJc3RydWN0IHJlc291cmNl ICpyX2RtYTsNCglzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOw0KCWludCBkbWFfY2hhbm5lbDsNCgl1 bnNpZ25lZCBpbnQgcmV0Ow0KCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47DQoJZG1hX2NhcF9t YXNrX3QgbWFzazsNCg0KCS8qIGRtYSBjaGFubmVsLCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3Qgb25l LiAqLw0KCWRuID0gcGRldi0+ZGV2Lm9mX25vZGU7DQoJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91 MzIoZG4sICJmc2wsZ3BtaS1kbWEtY2hhbm5lbCIsICZkbWFfY2hhbm5lbCk7DQoJaWYgKHJldCkg ew0KCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgRE1BIGNoYW5uZWwgZnJvbSBkdC5cbiIpOw0KCQln b3RvIGFjcXVpcmVfZXJyOw0KCX0NCgl0aGlzLT5wcml2YXRlID0gKHZvaWQgKilkbWFfY2hhbm5l bDsNCg0KCS8qIGdwbWkgZG1hIGludGVycnVwdCAqLw0KCXJfZG1hID0gcGxhdGZvcm1fZ2V0X3Jl c291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lSUSwNCgkJCQkJR1BNSV9OQU5EX0RNQV9J TlRFUlJVUFRfUkVTX05BTUUpOw0KCWlmICghcl9kbWEpIHsNCgkJcHJfZXJyKCJDYW4ndCBnZXQg cmVzb3VyY2UgZm9yIERNQVxuIik7DQoJCWdvdG8gYWNxdWlyZV9lcnI7DQoJfQ0KCXRoaXMtPmRt YV9kYXRhLmNoYW5faXJxID0gcl9kbWEtPnN0YXJ0Ow0KDQoJLyogcmVxdWVzdCBkbWEgY2hhbm5l bCAqLw0KCWRtYV9jYXBfemVybyhtYXNrKTsNCglkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2sp Ow0KDQoJZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGdwbWlfZG1hX2ZpbHRl ciwgdGhpcyk7DQoJaWYgKCFkbWFfY2hhbikgew0KCQlwcl9lcnIoImRtYV9yZXF1ZXN0X2NoYW5u ZWwgZmFpbGVkLlxuIik7DQoJCWdvdG8gYWNxdWlyZV9lcnI7DQoJfQ0KDQoJdGhpcy0+ZG1hX2No YW5zWzBdID0gZG1hX2NoYW47DQoJcmV0dXJuIDA7DQoNCmFjcXVpcmVfZXJyOg0KCXJlbGVhc2Vf ZG1hX2NoYW5uZWxzKHRoaXMpOw0KCXJldHVybiAtRUlOVkFMOw0KfQ0KDQpzdGF0aWMgaW50IF9f ZGV2aW5pdCBhY3F1aXJlX3Jlc291cmNlcyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpDQp7 DQoJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsNCglzdHJ1Y3QgcGlu Y3RybCAqcGluY3RybDsNCglpbnQgcmV0Ow0KDQoJcmV0ID0gYWNxdWlyZV9yZWdpc3Rlcl9ibG9j ayh0aGlzLCBHUE1JX05BTkRfR1BNSV9SRUdTX0FERFJfUkVTX05BTUUpOw0KCWlmIChyZXQpDQoJ CWdvdG8gZXhpdF9yZWdzOw0KDQoJcmV0ID0gYWNxdWlyZV9yZWdpc3Rlcl9ibG9jayh0aGlzLCBH UE1JX05BTkRfQkNIX1JFR1NfQUREUl9SRVNfTkFNRSk7DQoJaWYgKHJldCkNCgkJZ290byBleGl0 X3JlZ3M7DQoNCglyZXQgPSBhY3F1aXJlX2JjaF9pcnEodGhpcywgYmNoX2lycSk7DQoJaWYgKHJl dCkNCgkJZ290byBleGl0X3JlZ3M7DQoNCglyZXQgPSBhY3F1aXJlX2RtYV9jaGFubmVscyh0aGlz KTsNCglpZiAocmV0KQ0KCQlnb3RvIGV4aXRfZG1hX2NoYW5uZWxzOw0KDQoJcGluY3RybCA9IGRl dm1fcGluY3RybF9nZXRfc2VsZWN0X2RlZmF1bHQoJnRoaXMtPnBkZXYtPmRldik7DQoJaWYgKElT X0VSUihwaW5jdHJsKSkgew0KCQlyZXQgPSBQVFJfRVJSKHBpbmN0cmwpOw0KCQlnb3RvIGV4aXRf cGluOw0KCX0NCg0KCXJlcy0+Y2xvY2sgPSBjbGtfZ2V0KCZ0aGlzLT5wZGV2LT5kZXYsIE5VTEwp Ow0KCWlmIChJU19FUlIocmVzLT5jbG9jaykpIHsNCgkJcHJfZXJyKCJjYW4gbm90IGdldCB0aGUg Y2xvY2tcbiIpOw0KCQlyZXQgPSAtRU5PRU5UOw0KCQlnb3RvIGV4aXRfY2xvY2s7DQoJfQ0KCXJl dHVybiAwOw0KDQpleGl0X2Nsb2NrOg0KZXhpdF9waW46DQoJcmVsZWFzZV9kbWFfY2hhbm5lbHMo dGhpcyk7DQpleGl0X2RtYV9jaGFubmVsczoNCglyZWxlYXNlX2JjaF9pcnEodGhpcyk7DQpleGl0 X3JlZ3M6DQoJcmVsZWFzZV9yZWdpc3Rlcl9ibG9jayh0aGlzKTsNCglyZXR1cm4gcmV0Ow0KfQ0K DQpzdGF0aWMgdm9pZCByZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRo aXMpDQp7DQoJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7DQoNCgljbGtf cHV0KHItPmNsb2NrKTsNCglyZWxlYXNlX3JlZ2lzdGVyX2Jsb2NrKHRoaXMpOw0KCXJlbGVhc2Vf YmNoX2lycSh0aGlzKTsNCglyZWxlYXNlX2RtYV9jaGFubmVscyh0aGlzKTsNCn0NCg0Kc3RhdGlj IGludCBfX2RldmluaXQgaW5pdF9oYXJkd2FyZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMp DQp7DQoJaW50IHJldDsNCg0KCS8qDQoJICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlICJz YWZlIiBHUE1JIHRpbWluZyB0aGF0IHNob3VsZCBzdWNjZWVkDQoJICogd2l0aCBhbnkgTkFORCBG bGFzaCBkZXZpY2UNCgkgKiAoYWx0aG91Z2gsIHdpdGggbGVzcy10aGFuLW9wdGltYWwgcGVyZm9y bWFuY2UpLg0KCSAqLw0KCXN0cnVjdCBuYW5kX3RpbWluZyAgc2FmZV90aW1pbmcgPSB7DQoJCS5k YXRhX3NldHVwX2luX25zICAgICAgICA9IDgwLA0KCQkuZGF0YV9ob2xkX2luX25zICAgICAgICAg PSA2MCwNCgkJLmFkZHJlc3Nfc2V0dXBfaW5fbnMgICAgID0gMjUsDQoJCS5ncG1pX3NhbXBsZV9k ZWxheV9pbl9ucyA9ICA2LA0KCQkudFJFQV9pbl9ucyAgICAgICAgICAgICAgPSAtMSwNCgkJLnRS TE9IX2luX25zICAgICAgICAgICAgID0gLTEsDQoJCS50UkhPSF9pbl9ucyAgICAgICAgICAgICA9 IC0xLA0KCX07DQoNCgkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZXMuICovDQoJcmV0ID0gZ3Bt aV9pbml0KHRoaXMpOw0KCWlmIChyZXQpDQoJCXJldHVybiByZXQ7DQoNCgl0aGlzLT50aW1pbmcg PSBzYWZlX3RpbWluZzsNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludCByZWFkX3BhZ2VfcHJl cGFyZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsDQoJCQl2b2lkICpkZXN0aW5hdGlvbiwg dW5zaWduZWQgbGVuZ3RoLA0KCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMs IHVuc2lnbmVkIGFsdF9zaXplLA0KCQkJdm9pZCAqKnVzZV92aXJ0LCBkbWFfYWRkcl90ICp1c2Vf cGh5cykNCnsNCglzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7DQoNCglpZiAodmlydF9h ZGRyX3ZhbGlkKGRlc3RpbmF0aW9uKSkgew0KCQlkbWFfYWRkcl90IGRlc3RfcGh5czsNCg0KCQlk ZXN0X3BoeXMgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGRlc3RpbmF0aW9uLA0KCQkJCQkJbGVuZ3Ro LCBETUFfRlJPTV9ERVZJQ0UpOw0KCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkZXN0X3Bo eXMpKSB7DQoJCQlpZiAoYWx0X3NpemUgPCBsZW5ndGgpIHsNCgkJCQlwcl9lcnIoIkFsdGVybmF0 ZSBidWZmZXIgaXMgdG9vIHNtYWxsXG4iKTsNCgkJCQlyZXR1cm4gLUVOT01FTTsNCgkJCX0NCgkJ CWdvdG8gbWFwX2ZhaWxlZDsNCgkJfQ0KCQkqdXNlX3ZpcnQgPSBkZXN0aW5hdGlvbjsNCgkJKnVz ZV9waHlzID0gZGVzdF9waHlzOw0KCQl0aGlzLT5kaXJlY3RfZG1hX21hcF9vayA9IHRydWU7DQoJ CXJldHVybiAwOw0KCX0NCg0KbWFwX2ZhaWxlZDoNCgkqdXNlX3ZpcnQgPSBhbHRfdmlydDsNCgkq dXNlX3BoeXMgPSBhbHRfcGh5czsNCgl0aGlzLT5kaXJlY3RfZG1hX21hcF9vayA9IGZhbHNlOw0K CXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9wYWdlX2VuZChzdHJ1Y3Qg Z3BtaV9uYW5kX2RhdGEgKnRoaXMsDQoJCQl2b2lkICpkZXN0aW5hdGlvbiwgdW5zaWduZWQgbGVu Z3RoLA0KCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFs dF9zaXplLA0KCQkJdm9pZCAqdXNlZF92aXJ0LCBkbWFfYWRkcl90IHVzZWRfcGh5cykNCnsNCglp ZiAodGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2spDQoJCWRtYV91bm1hcF9zaW5nbGUodGhpcy0+ZGV2 LCB1c2VkX3BoeXMsIGxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsNCn0NCg0Kc3RhdGljIGlubGlu ZSB2b2lkIHJlYWRfcGFnZV9zd2FwX2VuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsDQoJ CQl2b2lkICpkZXN0aW5hdGlvbiwgdW5zaWduZWQgbGVuZ3RoLA0KCQkJdm9pZCAqYWx0X3ZpcnQs IGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLA0KCQkJdm9pZCAqdXNlZF92 aXJ0LCBkbWFfYWRkcl90IHVzZWRfcGh5cykNCnsNCglpZiAoIXRoaXMtPmRpcmVjdF9kbWFfbWFw X29rKQ0KCQltZW1jcHkoZGVzdGluYXRpb24sIGFsdF92aXJ0LCBsZW5ndGgpOw0KfQ0KDQpzdGF0 aWMgaW50IHNlbmRfcGFnZV9wcmVwYXJlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywNCgkJ CWNvbnN0IHZvaWQgKnNvdXJjZSwgdW5zaWduZWQgbGVuZ3RoLA0KCQkJdm9pZCAqYWx0X3ZpcnQs IGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLA0KCQkJY29uc3Qgdm9pZCAq KnVzZV92aXJ0LCBkbWFfYWRkcl90ICp1c2VfcGh5cykNCnsNCglzdHJ1Y3QgZGV2aWNlICpkZXYg PSB0aGlzLT5kZXY7DQoNCglpZiAodmlydF9hZGRyX3ZhbGlkKHNvdXJjZSkpIHsNCgkJZG1hX2Fk ZHJfdCBzb3VyY2VfcGh5czsNCg0KCQlzb3VyY2VfcGh5cyA9IGRtYV9tYXBfc2luZ2xlKGRldiwg KHZvaWQgKilzb3VyY2UsIGxlbmd0aCwNCgkJCQkJCURNQV9UT19ERVZJQ0UpOw0KCQlpZiAoZG1h X21hcHBpbmdfZXJyb3IoZGV2LCBzb3VyY2VfcGh5cykpIHsNCgkJCWlmIChhbHRfc2l6ZSA8IGxl bmd0aCkgew0KCQkJCXByX2VycigiQWx0ZXJuYXRlIGJ1ZmZlciBpcyB0b28gc21hbGxcbiIpOw0K CQkJCXJldHVybiAtRU5PTUVNOw0KCQkJfQ0KCQkJZ290byBtYXBfZmFpbGVkOw0KCQl9DQoJCSp1 c2VfdmlydCA9IHNvdXJjZTsNCgkJKnVzZV9waHlzID0gc291cmNlX3BoeXM7DQoJCXJldHVybiAw Ow0KCX0NCm1hcF9mYWlsZWQ6DQoJLyoNCgkgKiBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBzb3Vy Y2UgYnVmZmVyIGludG8gdGhlIGFsdGVybmF0ZQ0KCSAqIGJ1ZmZlciBhbmQgc2V0IHVwIHRoZSBy ZXR1cm4gdmFsdWVzIGFjY29yZGluZ2x5Lg0KCSAqLw0KCW1lbWNweShhbHRfdmlydCwgc291cmNl LCBsZW5ndGgpOw0KDQoJKnVzZV92aXJ0ID0gYWx0X3ZpcnQ7DQoJKnVzZV9waHlzID0gYWx0X3Bo eXM7DQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfcGFnZV9lbmQoc3RydWN0IGdw bWlfbmFuZF9kYXRhICp0aGlzLA0KCQkJY29uc3Qgdm9pZCAqc291cmNlLCB1bnNpZ25lZCBsZW5n dGgsDQoJCQl2b2lkICphbHRfdmlydCwgZG1hX2FkZHJfdCBhbHRfcGh5cywgdW5zaWduZWQgYWx0 X3NpemUsDQoJCQljb25zdCB2b2lkICp1c2VkX3ZpcnQsIGRtYV9hZGRyX3QgdXNlZF9waHlzKQ0K ew0KCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsNCglpZiAodXNlZF92aXJ0ID09IHNv dXJjZSkNCgkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHVzZWRfcGh5cywgbGVuZ3RoLCBETUFfVE9f REVWSUNFKTsNCn0NCg0Kc3RhdGljIHZvaWQgZ3BtaV9mcmVlX2RtYV9idWZmZXIoc3RydWN0IGdw bWlfbmFuZF9kYXRhICp0aGlzKQ0Kew0KCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsN Cg0KCWlmICh0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0ICYmIHZpcnRfYWRkcl92YWxpZCh0aGlzLT5w YWdlX2J1ZmZlcl92aXJ0KSkNCgkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCB0aGlzLT5wYWdlX2J1 ZmZlcl9zaXplLA0KCQkJCQl0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0LA0KCQkJCQl0aGlzLT5wYWdl X2J1ZmZlcl9waHlzKTsNCglrZnJlZSh0aGlzLT5jbWRfYnVmZmVyKTsNCglrZnJlZSh0aGlzLT5k YXRhX2J1ZmZlcl9kbWEpOw0KDQoJdGhpcy0+Y21kX2J1ZmZlcgk9IE5VTEw7DQoJdGhpcy0+ZGF0 YV9idWZmZXJfZG1hCT0gTlVMTDsNCgl0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0CT0gTlVMTDsNCgl0 aGlzLT5wYWdlX2J1ZmZlcl9zaXplCT0gIDA7DQp9DQoNCi8qIEFsbG9jYXRlIHRoZSBETUEgYnVm ZmVycyAqLw0Kc3RhdGljIGludCBncG1pX2FsbG9jX2RtYV9idWZmZXIoc3RydWN0IGdwbWlfbmFu ZF9kYXRhICp0aGlzKQ0Kew0KCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKmdlbyA9ICZ0aGlzLT5iY2hf Z2VvbWV0cnk7DQoJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2Ow0KDQoJLyogWzFdIEFs bG9jYXRlIGEgY29tbWFuZCBidWZmZXIuIFBBR0VfU0laRSBpcyBlbm91Z2guICovDQoJdGhpcy0+ Y21kX2J1ZmZlciA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfRE1BKTsNCglpZiAodGhpcy0+Y21k X2J1ZmZlciA9PSBOVUxMKQ0KCQlnb3RvIGVycm9yX2FsbG9jOw0KDQoJLyogWzJdIEFsbG9jYXRl IGEgcmVhZC93cml0ZSBkYXRhIGJ1ZmZlci4gUEFHRV9TSVpFIGlzIGVub3VnaC4gKi8NCgl0aGlz LT5kYXRhX2J1ZmZlcl9kbWEgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7DQoJaWYgKHRo aXMtPmRhdGFfYnVmZmVyX2RtYSA9PSBOVUxMKQ0KCQlnb3RvIGVycm9yX2FsbG9jOw0KDQoJLyoN CgkgKiBbM10gQWxsb2NhdGUgdGhlIHBhZ2UgYnVmZmVyLg0KCSAqDQoJICogQm90aCB0aGUgcGF5 bG9hZCBidWZmZXIgYW5kIHRoZSBhdXhpbGlhcnkgYnVmZmVyIG11c3QgYXBwZWFyIG9uDQoJICog MzItYml0IGJvdW5kYXJpZXMuIFdlIHByZXN1bWUgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgYnVm ZmVyIGlzIGENCgkgKiBwb3dlciBvZiB0d28gYW5kIGlzIG11Y2ggbGFyZ2VyIHRoYW4gZm91ciwg d2hpY2ggZ3VhcmFudGVlcyB0aGUNCgkgKiBhdXhpbGlhcnkgYnVmZmVyIHdpbGwgYXBwZWFyIG9u IGEgMzItYml0IGJvdW5kYXJ5Lg0KCSAqLw0KCXRoaXMtPnBhZ2VfYnVmZmVyX3NpemUgPSBnZW8t PnBheWxvYWRfc2l6ZSArIGdlby0+YXV4aWxpYXJ5X3NpemU7DQoJdGhpcy0+cGFnZV9idWZmZXJf dmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHRoaXMtPnBhZ2VfYnVmZmVyX3NpemUsDQoJ CQkJCSZ0aGlzLT5wYWdlX2J1ZmZlcl9waHlzLCBHRlBfRE1BKTsNCglpZiAoIXRoaXMtPnBhZ2Vf YnVmZmVyX3ZpcnQpDQoJCWdvdG8gZXJyb3JfYWxsb2M7DQoNCg0KCS8qIFNsaWNlIHVwIHRoZSBw YWdlIGJ1ZmZlci4gKi8NCgl0aGlzLT5wYXlsb2FkX3ZpcnQgPSB0aGlzLT5wYWdlX2J1ZmZlcl92 aXJ0Ow0KCXRoaXMtPnBheWxvYWRfcGh5cyA9IHRoaXMtPnBhZ2VfYnVmZmVyX3BoeXM7DQoJdGhp cy0+YXV4aWxpYXJ5X3ZpcnQgPSB0aGlzLT5wYXlsb2FkX3ZpcnQgKyBnZW8tPnBheWxvYWRfc2l6 ZTsNCgl0aGlzLT5hdXhpbGlhcnlfcGh5cyA9IHRoaXMtPnBheWxvYWRfcGh5cyArIGdlby0+cGF5 bG9hZF9zaXplOw0KCXJldHVybiAwOw0KDQplcnJvcl9hbGxvYzoNCglncG1pX2ZyZWVfZG1hX2J1 ZmZlcih0aGlzKTsNCglwcl9lcnIoImFsbG9jYXRlIERNQSBidWZmZXIgcmV0ISFcbiIpOw0KCXJl dHVybiAtRU5PTUVNOw0KfQ0KDQpzdGF0aWMgdm9pZCBncG1pX2NtZF9jdHJsKHN0cnVjdCBtdGRf aW5mbyAqbXRkLCBpbnQgZGF0YSwgdW5zaWduZWQgaW50IGN0cmwpDQp7DQoJc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsNCglzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBj aGlwLT5wcml2Ow0KCWludCByZXQ7DQoNCgkvKg0KCSAqIEV2ZXJ5IG9wZXJhdGlvbiBiZWdpbnMg d2l0aCBhIGNvbW1hbmQgYnl0ZSBhbmQgYSBzZXJpZXMgb2YgemVybyBvcg0KCSAqIG1vcmUgYWRk cmVzcyBieXRlcy4gVGhlc2UgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgZWl0aGVyIHRoZSBBZGRyZXNz DQoJICogTGF0Y2ggRW5hYmxlIChBTEUpIG9yIENvbW1hbmQgTGF0Y2ggRW5hYmxlIChDTEUpIHNp Z25hbHMgYmVpbmcNCgkgKiBhc3NlcnRlZC4gV2hlbiBNVEQgaXMgcmVhZHkgdG8gZXhlY3V0ZSB0 aGUgY29tbWFuZCwgaXQgd2lsbCBkZWFzc2VydA0KCSAqIGJvdGggbGF0Y2ggZW5hYmxlcy4NCgkg Kg0KCSAqIFJhdGhlciB0aGFuIHJ1biBhIHNlcGFyYXRlIERNQSBvcGVyYXRpb24gZm9yIGV2ZXJ5 IHNpbmdsZSBieXRlLCB3ZQ0KCSAqIHF1ZXVlIHRoZW0gdXAgYW5kIHJ1biBhIHNpbmdsZSBETUEg b3BlcmF0aW9uIGZvciB0aGUgZW50aXJlIHNlcmllcw0KCSAqIG9mIGNvbW1hbmQgYW5kIGRhdGEg Ynl0ZXMuIE5BTkRfQ01EX05PTkUgbWVhbnMgdGhlIEVORCBvZiB0aGUgcXVldWUuDQoJICovDQoJ aWYgKChjdHJsICYgKE5BTkRfQUxFIHwgTkFORF9DTEUpKSkgew0KCQlpZiAoZGF0YSAhPSBOQU5E X0NNRF9OT05FKQ0KCQkJdGhpcy0+Y21kX2J1ZmZlclt0aGlzLT5jb21tYW5kX2xlbmd0aCsrXSA9 IGRhdGE7DQoJCXJldHVybjsNCgl9DQoNCglpZiAoIXRoaXMtPmNvbW1hbmRfbGVuZ3RoKQ0KCQly ZXR1cm47DQoNCglyZXQgPSBncG1pX3NlbmRfY29tbWFuZCh0aGlzKTsNCglpZiAocmV0KQ0KCQlw cl9lcnIoIkNoaXA6ICV1LCBFcnJvciAlZFxuIiwgdGhpcy0+Y3VycmVudF9jaGlwLCByZXQpOw0K DQoJdGhpcy0+Y29tbWFuZF9sZW5ndGggPSAwOw0KfQ0KDQpzdGF0aWMgaW50IGdwbWlfZGV2X3Jl YWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQ0Kew0KCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGQtPnByaXY7DQoJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsNCg0K CXJldHVybiBncG1pX2lzX3JlYWR5KHRoaXMsIHRoaXMtPmN1cnJlbnRfY2hpcCk7DQp9DQoNCnN0 YXRpYyB2b2lkIGdwbWlfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlw bnIpDQp7DQoJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsNCglzdHJ1Y3QgZ3Bt aV9uYW5kX2RhdGEgKnRoaXMgPSBjaGlwLT5wcml2Ow0KDQoJaWYgKCh0aGlzLT5jdXJyZW50X2No aXAgPCAwKSAmJiAoY2hpcG5yID49IDApKQ0KCQlncG1pX2JlZ2luKHRoaXMpOw0KCWVsc2UgaWYg KCh0aGlzLT5jdXJyZW50X2NoaXAgPj0gMCkgJiYgKGNoaXBuciA8IDApKQ0KCQlncG1pX2VuZCh0 aGlzKTsNCg0KCXRoaXMtPmN1cnJlbnRfY2hpcCA9IGNoaXBucjsNCn0NCg0Kc3RhdGljIHZvaWQg Z3BtaV9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBpbnQgbGVu KQ0Kew0KCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7DQoJc3RydWN0IGdwbWlf bmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsNCg0KCXByX2RlYnVnKCJsZW4gaXMgJWRcbiIs IGxlbik7DQoJdGhpcy0+dXBwZXJfYnVmCT0gYnVmOw0KCXRoaXMtPnVwcGVyX2xlbgk9IGxlbjsN Cg0KCWdwbWlfcmVhZF9kYXRhKHRoaXMpOw0KfQ0KDQpzdGF0aWMgdm9pZCBncG1pX3dyaXRlX2J1 ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQ0Kew0K CXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7DQoJc3RydWN0IGdwbWlfbmFuZF9k YXRhICp0aGlzID0gY2hpcC0+cHJpdjsNCg0KCXByX2RlYnVnKCJsZW4gaXMgJWRcbiIsIGxlbik7 DQoJdGhpcy0+dXBwZXJfYnVmCT0gKHVpbnQ4X3QgKilidWY7DQoJdGhpcy0+dXBwZXJfbGVuCT0g bGVuOw0KDQoJZ3BtaV9zZW5kX2RhdGEodGhpcyk7DQp9DQoNCnN0YXRpYyB1aW50OF90IGdwbWlf cmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQ0Kew0KCXN0cnVjdCBuYW5kX2NoaXAgKmNo aXAgPSBtdGQtPnByaXY7DQoJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJp djsNCgl1aW50OF90ICpidWYgPSB0aGlzLT5kYXRhX2J1ZmZlcl9kbWE7DQoNCglncG1pX3JlYWRf YnVmKG10ZCwgYnVmLCAxKTsNCglyZXR1cm4gYnVmWzBdOw0KfQ0KDQovKg0KICogSGFuZGxlcyBi bG9jayBtYXJrIHN3YXBwaW5nLg0KICogSXQgY2FuIGJlIGNhbGxlZCBpbiBzd2FwcGluZyB0aGUg YmxvY2sgbWFyaywgb3Igc3dhcHBpbmcgaXQgYmFjaywNCiAqIGJlY2F1c2UgdGhlIHRoZSBvcGVy YXRpb25zIGFyZSB0aGUgc2FtZS4NCiAqLw0Kc3RhdGljIHZvaWQgYmxvY2tfbWFya19zd2FwcGlu ZyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsDQoJCQkJdm9pZCAqcGF5bG9hZCwgdm9pZCAq YXV4aWxpYXJ5KQ0Kew0KCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKm5mY19nZW8gPSAmdGhpcy0+YmNo X2dlb21ldHJ5Ow0KCXVuc2lnbmVkIGNoYXIgKnA7DQoJdW5zaWduZWQgY2hhciAqYTsNCgl1bnNp Z25lZCBpbnQgIGJpdDsNCgl1bnNpZ25lZCBjaGFyIG1hc2s7DQoJdW5zaWduZWQgY2hhciBmcm9t X2RhdGE7DQoJdW5zaWduZWQgY2hhciBmcm9tX29vYjsNCg0KCWlmICghdGhpcy0+c3dhcF9ibG9j a19tYXJrKQ0KCQlyZXR1cm47DQoNCgkvKg0KCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3 ZSdyZSBzd2FwcGluZy4gTWFrZSBzb21lIGNvbnZlbmllbmNlDQoJICogdmFyaWFibGVzLg0KCSAq Lw0KCWJpdCA9IG5mY19nZW8tPmJsb2NrX21hcmtfYml0X29mZnNldDsNCglwICAgPSBwYXlsb2Fk ICsgbmZjX2dlby0+YmxvY2tfbWFya19ieXRlX29mZnNldDsNCglhICAgPSBhdXhpbGlhcnk7DQoN CgkvKg0KCSAqIEdldCB0aGUgYnl0ZSBmcm9tIHRoZSBkYXRhIGFyZWEgdGhhdCBvdmVybGF5cyB0 aGUgYmxvY2sgbWFyay4gU2luY2UNCgkgKiB0aGUgRUNDIGVuZ2luZSBhcHBsaWVzIGl0cyBvd24g dmlldyB0byB0aGUgYml0cyBpbiB0aGUgcGFnZSwgdGhlDQoJICogcGh5c2ljYWwgYmxvY2sgbWFy ayB3b24ndCAoaW4gZ2VuZXJhbCkgYXBwZWFyIG9uIGEgYnl0ZSBib3VuZGFyeSBpbg0KCSAqIHRo ZSBkYXRhLg0KCSAqLw0KCWZyb21fZGF0YSA9IChwWzBdID4+IGJpdCkgfCAocFsxXSA8PCAoOCAt IGJpdCkpOw0KDQoJLyogR2V0IHRoZSBieXRlIGZyb20gdGhlIE9PQi4gKi8NCglmcm9tX29vYiA9 IGFbMF07DQoNCgkvKiBTd2FwIHRoZW0uICovDQoJYVswXSA9IGZyb21fZGF0YTsNCg0KCW1hc2sg PSAoMHgxIDw8IGJpdCkgLSAxOw0KCXBbMF0gPSAocFswXSAmIG1hc2spIHwgKGZyb21fb29iIDw8 IGJpdCk7DQoNCgltYXNrID0gfjAgPDwgYml0Ow0KCXBbMV0gPSAocFsxXSAmIG1hc2spIHwgKGZy b21fb29iID4+ICg4IC0gYml0KSk7DQp9DQoNCnN0YXRpYyBpbnQgZ3BtaV9lY2NfcmVhZF9wYWdl KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLA0KCQkJCXVpbnQ4 X3QgKmJ1ZiwgaW50IG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UpDQp7DQoJc3RydWN0IGdwbWlfbmFu ZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsNCglzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpuZmNfZ2Vv ID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsNCgl2b2lkICAgICAgICAgICpwYXlsb2FkX3ZpcnQ7DQoJ ZG1hX2FkZHJfdCAgICBwYXlsb2FkX3BoeXM7DQoJdm9pZCAgICAgICAgICAqYXV4aWxpYXJ5X3Zp cnQ7DQoJZG1hX2FkZHJfdCAgICBhdXhpbGlhcnlfcGh5czsNCgl1bnNpZ25lZCBpbnQgIGk7DQoJ dW5zaWduZWQgY2hhciAqc3RhdHVzOw0KCXVuc2lnbmVkIGludCAgZmFpbGVkOw0KCXVuc2lnbmVk IGludCAgY29ycmVjdGVkOw0KCWludCAgICAgICAgICAgcmV0Ow0KDQoJcHJfZGVidWcoInBhZ2Ug bnVtYmVyIGlzIDogJWRcbiIsIHBhZ2UpOw0KCXJldCA9IHJlYWRfcGFnZV9wcmVwYXJlKHRoaXMs IGJ1ZiwgbXRkLT53cml0ZXNpemUsDQoJCQkJCXRoaXMtPnBheWxvYWRfdmlydCwgdGhpcy0+cGF5 bG9hZF9waHlzLA0KCQkJCQluZmNfZ2VvLT5wYXlsb2FkX3NpemUsDQoJCQkJCSZwYXlsb2FkX3Zp cnQsICZwYXlsb2FkX3BoeXMpOw0KCWlmIChyZXQpIHsNCgkJcHJfZXJyKCJJbmFkZXF1YXRlIERN QSBidWZmZXJcbiIpOw0KCQlyZXQgPSAtRU5PTUVNOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCglhdXhp bGlhcnlfdmlydCA9IHRoaXMtPmF1eGlsaWFyeV92aXJ0Ow0KCWF1eGlsaWFyeV9waHlzID0gdGhp cy0+YXV4aWxpYXJ5X3BoeXM7DQoNCgkvKiBnbyEgKi8NCglyZXQgPSBncG1pX3JlYWRfcGFnZSh0 aGlzLCBwYXlsb2FkX3BoeXMsIGF1eGlsaWFyeV9waHlzKTsNCglyZWFkX3BhZ2VfZW5kKHRoaXMs IGJ1ZiwgbXRkLT53cml0ZXNpemUsDQoJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxv YWRfcGh5cywNCgkJCW5mY19nZW8tPnBheWxvYWRfc2l6ZSwNCgkJCXBheWxvYWRfdmlydCwgcGF5 bG9hZF9waHlzKTsNCglpZiAocmV0KSB7DQoJCXByX2VycigiRXJyb3IgaW4gRUNDLWJhc2VkIHJl YWQ6ICVkXG4iLCByZXQpOw0KCQlnb3RvIGV4aXRfbmZjOw0KCX0NCg0KCS8qIGhhbmRsZSB0aGUg YmxvY2sgbWFyayBzd2FwcGluZyAqLw0KCWJsb2NrX21hcmtfc3dhcHBpbmcodGhpcywgcGF5bG9h ZF92aXJ0LCBhdXhpbGlhcnlfdmlydCk7DQoNCgkvKiBMb29wIG92ZXIgc3RhdHVzIGJ5dGVzLCBh Y2N1bXVsYXRpbmcgRUNDIHN0YXR1cy4gKi8NCglmYWlsZWQJCT0gMDsNCgljb3JyZWN0ZWQJPSAw Ow0KCXN0YXR1cwkJPSBhdXhpbGlhcnlfdmlydCArIG5mY19nZW8tPmF1eGlsaWFyeV9zdGF0dXNf b2Zmc2V0Ow0KDQoJZm9yIChpID0gMDsgaSA8IG5mY19nZW8tPmVjY19jaHVua19jb3VudDsgaSsr LCBzdGF0dXMrKykgew0KCQlpZiAoKCpzdGF0dXMgPT0gU1RBVFVTX0dPT0QpIHx8ICgqc3RhdHVz ID09IFNUQVRVU19FUkFTRUQpKQ0KCQkJY29udGludWU7DQoNCgkJaWYgKCpzdGF0dXMgPT0gU1RB VFVTX1VOQ09SUkVDVEFCTEUpIHsNCgkJCWZhaWxlZCsrOw0KCQkJY29udGludWU7DQoJCX0NCgkJ Y29ycmVjdGVkICs9ICpzdGF0dXM7DQoJfQ0KDQoJLyoNCgkgKiBQcm9wYWdhdGUgRUNDIHN0YXR1 cyB0byB0aGUgb3duaW5nIE1URCBvbmx5IHdoZW4gZmFpbGVkIG9yDQoJICogY29ycmVjdGVkIHRp bWVzIG5lYXJseSByZWFjaGVzIG91ciBFQ0MgY29ycmVjdGlvbiB0aHJlc2hvbGQuDQoJICovDQoJ aWYgKGZhaWxlZCB8fCBjb3JyZWN0ZWQgPj0gKG5mY19nZW8tPmVjY19zdHJlbmd0aCAtIDEpKSB7 DQoJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCAgICArPSBmYWlsZWQ7DQoJCW10ZC0+ZWNjX3N0YXRz LmNvcnJlY3RlZCArPSBjb3JyZWN0ZWQ7DQoJfQ0KDQoJaWYgKG9vYl9yZXF1aXJlZCkgew0KCQkv Kg0KCQkgKiBJdCdzIHRpbWUgdG8gZGVsaXZlciB0aGUgT09CIGJ5dGVzLiBTZWUgZ3BtaV9lY2Nf cmVhZF9vb2IoKQ0KCQkgKiBmb3IgZGV0YWlscyBhYm91dCBvdXIgcG9saWN5IGZvciBkZWxpdmVy aW5nIHRoZSBPT0IuDQoJCSAqDQoJCSAqIFdlIGZpbGwgdGhlIGNhbGxlcidzIGJ1ZmZlciB3aXRo IHNldCBiaXRzLCBhbmQgdGhlbiBjb3B5IHRoZQ0KCQkgKiBibG9jayBtYXJrIHRvIHRoIGNhbGxl cidzIGJ1ZmZlci4gTm90ZSB0aGF0LCBpZiBibG9jayBtYXJrDQoJCSAqIHN3YXBwaW5nIHdhcyBu ZWNlc3NhcnksIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc28gd2UgY2FuDQoJCSAqIHJlbHkg b24gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGF1eGlsaWFyeSBidWZmZXIgdG8gY29udGFpbg0KCQkg KiB0aGUgYmxvY2sgbWFyay4NCgkJICovDQoJCW1lbXNldChjaGlwLT5vb2JfcG9pLCB+MCwgbXRk LT5vb2JzaXplKTsNCgkJY2hpcC0+b29iX3BvaVswXSA9ICgodWludDhfdCAqKSBhdXhpbGlhcnlf dmlydClbMF07DQoJfQ0KDQoJcmVhZF9wYWdlX3N3YXBfZW5kKHRoaXMsIGJ1ZiwgbXRkLT53cml0 ZXNpemUsDQoJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywNCgkJCW5m Y19nZW8tPnBheWxvYWRfc2l6ZSwNCgkJCXBheWxvYWRfdmlydCwgcGF5bG9hZF9waHlzKTsNCmV4 aXRfbmZjOg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyBpbnQgZ3BtaV9lY2Nfd3JpdGVfcGFn ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwNCgkJCQljb25z dCB1aW50OF90ICpidWYsIGludCBvb2JfcmVxdWlyZWQpDQp7DQoJc3RydWN0IGdwbWlfbmFuZF9k YXRhICp0aGlzID0gY2hpcC0+cHJpdjsNCglzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpuZmNfZ2VvID0g JnRoaXMtPmJjaF9nZW9tZXRyeTsNCgljb25zdCB2b2lkICpwYXlsb2FkX3ZpcnQ7DQoJZG1hX2Fk ZHJfdCBwYXlsb2FkX3BoeXM7DQoJY29uc3Qgdm9pZCAqYXV4aWxpYXJ5X3ZpcnQ7DQoJZG1hX2Fk ZHJfdCBhdXhpbGlhcnlfcGh5czsNCglpbnQgICAgICAgIHJldDsNCg0KCXByX2RlYnVnKCJlY2Mg d3JpdGUgcGFnZS5cbiIpOw0KCWlmICh0aGlzLT5zd2FwX2Jsb2NrX21hcmspIHsNCgkJLyoNCgkJ ICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHdlJ3JlIGRvaW5nIGJsb2NrIG1hcmsgc3dhcHBp bmcuDQoJCSAqIFNpbmNlIHdlIGNhbid0IG1vZGlmeSB0aGUgY2FsbGVyJ3MgYnVmZmVycywgd2Ug bXVzdCBjb3B5IHRoZW0NCgkJICogaW50byBvdXIgb3duLg0KCQkgKi8NCgkJbWVtY3B5KHRoaXMt PnBheWxvYWRfdmlydCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7DQoJCXBheWxvYWRfdmlydCA9IHRo aXMtPnBheWxvYWRfdmlydDsNCgkJcGF5bG9hZF9waHlzID0gdGhpcy0+cGF5bG9hZF9waHlzOw0K DQoJCW1lbWNweSh0aGlzLT5hdXhpbGlhcnlfdmlydCwgY2hpcC0+b29iX3BvaSwNCgkJCQluZmNf Z2VvLT5hdXhpbGlhcnlfc2l6ZSk7DQoJCWF1eGlsaWFyeV92aXJ0ID0gdGhpcy0+YXV4aWxpYXJ5 X3ZpcnQ7DQoJCWF1eGlsaWFyeV9waHlzID0gdGhpcy0+YXV4aWxpYXJ5X3BoeXM7DQoNCgkJLyog SGFuZGxlIGJsb2NrIG1hcmsgc3dhcHBpbmcuICovDQoJCWJsb2NrX21hcmtfc3dhcHBpbmcodGhp cywNCgkJCQkodm9pZCAqKSBwYXlsb2FkX3ZpcnQsICh2b2lkICopIGF1eGlsaWFyeV92aXJ0KTsN Cgl9IGVsc2Ugew0KCQkvKg0KCQkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UncmUgbm90 IGRvaW5nIGJsb2NrIG1hcmsgc3dhcHBpbmcsDQoJCSAqIHNvIHdlIGNhbiB0byB0cnkgYW5kIHVz ZSB0aGUgY2FsbGVyJ3MgYnVmZmVycy4NCgkJICovDQoJCXJldCA9IHNlbmRfcGFnZV9wcmVwYXJl KHRoaXMsDQoJCQkJYnVmLCBtdGQtPndyaXRlc2l6ZSwNCgkJCQl0aGlzLT5wYXlsb2FkX3ZpcnQs IHRoaXMtPnBheWxvYWRfcGh5cywNCgkJCQluZmNfZ2VvLT5wYXlsb2FkX3NpemUsDQoJCQkJJnBh eWxvYWRfdmlydCwgJnBheWxvYWRfcGh5cyk7DQoJCWlmIChyZXQpIHsNCgkJCXByX2VycigiSW5h ZGVxdWF0ZSBwYXlsb2FkIERNQSBidWZmZXJcbiIpOw0KCQkJcmV0dXJuIDA7DQoJCX0NCg0KCQly ZXQgPSBzZW5kX3BhZ2VfcHJlcGFyZSh0aGlzLA0KCQkJCWNoaXAtPm9vYl9wb2ksIG10ZC0+b29i c2l6ZSwNCgkJCQl0aGlzLT5hdXhpbGlhcnlfdmlydCwgdGhpcy0+YXV4aWxpYXJ5X3BoeXMsDQoJ CQkJbmZjX2dlby0+YXV4aWxpYXJ5X3NpemUsDQoJCQkJJmF1eGlsaWFyeV92aXJ0LCAmYXV4aWxp YXJ5X3BoeXMpOw0KCQlpZiAocmV0KSB7DQoJCQlwcl9lcnIoIkluYWRlcXVhdGUgYXV4aWxpYXJ5 IERNQSBidWZmZXJcbiIpOw0KCQkJZ290byBleGl0X2F1eGlsaWFyeTsNCgkJfQ0KCX0NCg0KCS8q IEFzayB0aGUgTkZDLiAqLw0KCXJldCA9IGdwbWlfc2VuZF9wYWdlKHRoaXMsIHBheWxvYWRfcGh5 cywgYXV4aWxpYXJ5X3BoeXMpOw0KCWlmIChyZXQpDQoJCXByX2VycigiRXJyb3IgaW4gRUNDLWJh c2VkIHdyaXRlOiAlZFxuIiwgcmV0KTsNCg0KCWlmICghdGhpcy0+c3dhcF9ibG9ja19tYXJrKSB7 DQoJCXNlbmRfcGFnZV9lbmQodGhpcywgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplLA0KCQkJ CXRoaXMtPmF1eGlsaWFyeV92aXJ0LCB0aGlzLT5hdXhpbGlhcnlfcGh5cywNCgkJCQluZmNfZ2Vv LT5hdXhpbGlhcnlfc2l6ZSwNCgkJCQlhdXhpbGlhcnlfdmlydCwgYXV4aWxpYXJ5X3BoeXMpOw0K ZXhpdF9hdXhpbGlhcnk6DQoJCXNlbmRfcGFnZV9lbmQodGhpcywgYnVmLCBtdGQtPndyaXRlc2l6 ZSwNCgkJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywNCgkJCQluZmNf Z2VvLT5wYXlsb2FkX3NpemUsDQoJCQkJcGF5bG9hZF92aXJ0LCBwYXlsb2FkX3BoeXMpOw0KCX0N Cg0KCXJldHVybiAwOw0KfQ0KDQovKg0KICogVGhlcmUgYXJlIHNldmVyYWwgcGxhY2VzIGluIHRo aXMgZHJpdmVyIHdoZXJlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBPT0IgYW5kDQogKiBibG9jayBt YXJrcy4gVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhpbmdzIGFyZSB0aGUgbW9zdCBjb21w bGljYXRlZCwgc28NCiAqIHRoaXMgaXMgd2hlcmUgd2UgdHJ5IHRvIGV4cGxhaW4gaXQgYWxsLiBB bGwgdGhlIG90aGVyIHBsYWNlcyByZWZlciBiYWNrIHRvDQogKiBoZXJlLg0KICoNCiAqIFRoZXNl IGFyZSB0aGUgcnVsZXMsIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgaW1wb3J0YW5jZToNCiAqDQog KiAxKSBOb3RoaW5nIHRoZSBjYWxsZXIgZG9lcyBjYW4gYmUgYWxsb3dlZCB0byBpbXBlcmlsIHRo ZSBibG9jayBtYXJrLg0KICoNCiAqIDIpIEluIHJlYWQgb3BlcmF0aW9ucywgdGhlIGZpcnN0IGJ5 dGUgb2YgdGhlIE9PQiB3ZSByZXR1cm4gbXVzdCByZWZsZWN0IHRoZQ0KICogICAgdHJ1ZSBzdGF0 ZSBvZiB0aGUgYmxvY2sgbWFyaywgbm8gbWF0dGVyIHdoZXJlIHRoYXQgYmxvY2sgbWFyayBhcHBl YXJzIGluDQogKiAgICB0aGUgcGh5c2ljYWwgcGFnZS4NCiAqDQogKiAzKSBFQ0MtYmFzZWQgcmVh ZCBvcGVyYXRpb25zIHJldHVybiBhbiBPT0IgZnVsbCBvZiBzZXQgYml0cyAoc2luY2Ugd2UgbmV2 ZXINCiAqICAgIGFsbG93IEVDQy1iYXNlZCB3cml0ZXMgdG8gdGhlIE9PQiwgaXQgZG9lc24ndCBt YXR0ZXIgd2hhdCBFQ0MtYmFzZWQgcmVhZHMNCiAqICAgIHJldHVybikuDQogKg0KICogNCkgIlJh dyIgcmVhZCBvcGVyYXRpb25zIHJldHVybiBhIGRpcmVjdCB2aWV3IG9mIHRoZSBwaHlzaWNhbCBi eXRlcyBpbiB0aGUNCiAqICAgIHBhZ2UsIHVzaW5nIHRoZSBjb252ZW50aW9uYWwgZGVmaW5pdGlv biBvZiB3aGljaCBieXRlcyBhcmUgZGF0YSBhbmQgd2hpY2gNCiAqICAgIGFyZSBPT0IuIFRoaXMg Z2l2ZXMgdGhlIGNhbGxlciBhIHdheSB0byBzZWUgdGhlIGFjdHVhbCwgcGh5c2ljYWwgYnl0ZXMN CiAqICAgIGluIHRoZSBwYWdlLCB3aXRob3V0IHRoZSBkaXN0b3J0aW9ucyBhcHBsaWVkIGJ5IG91 ciBFQ0MgZW5naW5lLg0KICoNCiAqDQogKiBXaGF0IHdlIGRvIGZvciB0aGlzIHNwZWNpZmljIHJl YWQgb3BlcmF0aW9uIGRlcGVuZHMgb24gdHdvIHF1ZXN0aW9uczoNCiAqDQogKiAxKSBBcmUgd2Ug ZG9pbmcgYSAicmF3IiByZWFkLCBvciBhbiBFQ0MtYmFzZWQgcmVhZD8NCiAqDQogKiAyKSBBcmUg d2UgdXNpbmcgYmxvY2sgbWFyayBzd2FwcGluZyBvciB0cmFuc2NyaXB0aW9uPw0KICoNCiAqIFRo ZXJlIGFyZSBmb3VyIGNhc2VzLCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIEthcm5hdWdo IG1hcDoNCiAqDQogKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgUmF3ICAgICAgICAg ICB8ICAgICAgICAgRUNDLWJhc2VkICAgICAgIHwNCiAqICAgICAgIC0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KICogICAg ICAgICAgICAgICAgICAgIHwgUmVhZCB0aGUgY29udmVudGlvbmFsICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICB8DQogKiAgICAgICAgICAgICAgICAgICAgfCBPT0IgYXQgdGhlIGVuZCBvZiB0 aGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAqICAgICAgIFN3YXBwaW5nICAgICB8 IHBhZ2UgYW5kIHJldHVybiBpdC4gSXQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICog ICAgICAgICAgICAgICAgICAgIHwgY29udGFpbnMgZXhhY3RseSB3aGF0ICAgfCAgICAgICAgICAg ICAgICAgICAgICAgICB8DQogKiAgICAgICAgICAgICAgICAgICAgfCB3ZSB3YW50LiAgICAgICAg ICAgICAgICB8IFJlYWQgdGhlIGJsb2NrIG1hcmsgYW5kIHwNCiAqICAgICAgIC0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgcmV0dXJuIGl0IGluIGEgYnVmZmVyICAgfA0K ICogICAgICAgICAgICAgICAgICAgIHwgUmVhZCB0aGUgY29udmVudGlvbmFsICAgfCBmdWxsIG9m IHNldCBiaXRzLiAgICAgICB8DQogKiAgICAgICAgICAgICAgICAgICAgfCBPT0IgYXQgdGhlIGVu ZCBvZiB0aGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAqICAgICAgICAgICAgICAg ICAgICB8IHBhZ2UgYW5kIGFsc28gdGhlIGJsb2NrIHwgICAgICAgICAgICAgICAgICAgICAgICAg fA0KICogICAgICAgVHJhbnNjcmliaW5nIHwgbWFyayBpbiB0aGUgbWV0YWRhdGEuICAgfCAgICAg ICAgICAgICAgICAgICAgICAgICB8DQogKiAgICAgICAgICAgICAgICAgICAgfCBDb3B5IHRoZSBi bG9jayBtYXJrICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCiAqICAgICAgICAgICAg ICAgICAgICB8IGludG8gdGhlIGZpcnN0IGJ5dGUgb2YgIHwgICAgICAgICAgICAgICAgICAgICAg ICAgfA0KICogICAgICAgICAgICAgICAgICAgIHwgdGhlIE9PQi4gICAgICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICAgICAgICAgICB8DQogKiAgICAgICAtLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCiAqDQogKiBOb3Rl IHRoYXQgd2UgYnJlYWsgcnVsZSAjNCBpbiB0aGUgVHJhbnNjcmliaW5nL1JhdyBjYXNlIGJlY2F1 c2Ugd2UncmUgbm90DQogKiBnaXZpbmcgYW4gYWNjdXJhdGUgdmlldyBvZiB0aGUgYWN0dWFsLCBw aHlzaWNhbCBieXRlcyBpbiB0aGUgcGFnZSAod2UncmUNCiAqIG92ZXJ3cml0aW5nIHRoZSBibG9j ayBtYXJrKS4gVGhhdCdzIE9LIGJlY2F1c2UgaXQncyBtb3JlIGltcG9ydGFudCB0byBmb2xsb3cN CiAqIHJ1bGUgIzIuDQogKg0KICogSXQgdHVybnMgb3V0IHRoYXQga25vd2luZyB3aGV0aGVyIHdl IHdhbnQgYW4gIkVDQy1iYXNlZCIgb3IgInJhdyIgcmVhZCBpcyBub3QNCiAqIGVhc3kuIFdoZW4g cmVhZGluZyBhIHBhZ2UsIGZvciBleGFtcGxlLCB0aGUgTkFORCBGbGFzaCBNVEQgY29kZSBjYWxs cyBvdXINCiAqIGVjYy5yZWFkX3BhZ2Ugb3IgZWNjLnJlYWRfcGFnZV9yYXcgZnVuY3Rpb24uIFRo dXMsIHRoZSBmYWN0IHRoYXQgTVREIHdhbnRzIGFuDQogKiBFQ0MtYmFzZWQgb3IgcmF3IHZpZXcg b2YgdGhlIHBhZ2UgaXMgaW1wbGljaXQgaW4gd2hpY2ggZnVuY3Rpb24gaXQgY2FsbHMNCiAqICh0 aGVyZSBpcyBhIHNpbWlsYXIgcGFpciBvZiBFQ0MtYmFzZWQvcmF3IGZ1bmN0aW9ucyBmb3Igd3Jp dGluZykuDQogKg0KICogRklYTUU6IFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIGluY29ycmVj dCwgbm93IHRoYXQgdGhlcmUgZXhpc3QNCiAqIGVjYy5yZWFkX29vYl9yYXcgYW5kIGVjYy53cml0 ZV9vb2JfcmF3IGZ1bmN0aW9ucy4NCiAqDQogKiBTaW5jZSBNVEQgYXNzdW1lcyB0aGUgT09CIGlz IG5vdCBjb3ZlcmVkIGJ5IEVDQywgdGhlcmUgaXMgbm8gcGFpciBvZg0KICogRUNDLWJhc2VkL3Jh dyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgb3Igb3Igd3JpdGluZyB0aGUgT09CLiBUaGUgZmFjdCB0 aGF0IHRoZQ0KICogY2FsbGVyIHdhbnRzIGFuIEVDQy1iYXNlZCBvciByYXcgdmlldyBvZiB0aGUg cGFnZSBpcyBub3QgcHJvcGFnYXRlZCBkb3duIHRvDQogKiB0aGlzIGRyaXZlci4NCiAqLw0Kc3Rh dGljIGludCBncG1pX2VjY19yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwNCgkJCQlpbnQgcGFnZSkNCnsNCglzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEg KnRoaXMgPSBjaGlwLT5wcml2Ow0KDQoJcHJfZGVidWcoInBhZ2UgbnVtYmVyIGlzICVkXG4iLCBw YWdlKTsNCgkvKiBjbGVhciB0aGUgT09CIGJ1ZmZlciAqLw0KCW1lbXNldChjaGlwLT5vb2JfcG9p LCB+MCwgbXRkLT5vb2JzaXplKTsNCg0KCS8qIFJlYWQgb3V0IHRoZSBjb252ZW50aW9uYWwgT09C LiAqLw0KCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgbXRkLT53cml0ZXNpemUs IHBhZ2UpOw0KCWNoaXAtPnJlYWRfYnVmKG10ZCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXpl KTsNCg0KCS8qDQoJICogTm93LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYmxvY2sgbWFyayBp cyBjb3JyZWN0LiBJbiB0aGUNCgkgKiBTd2FwcGluZy9SYXcgY2FzZSwgd2UgYWxyZWFkeSBoYXZl IGl0LiBPdGhlcndpc2UsIHdlIG5lZWQgdG8NCgkgKiBleHBsaWNpdGx5IHJlYWQgaXQuDQoJICov DQoJaWYgKCF0aGlzLT5zd2FwX2Jsb2NrX21hcmspIHsNCgkJLyogUmVhZCB0aGUgYmxvY2sgbWFy ayBpbnRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBPT0IgYnVmZmVyLiAqLw0KCQljaGlwLT5jbWRm dW5jKG10ZCwgTkFORF9DTURfUkVBRDAsIDAsIHBhZ2UpOw0KCQljaGlwLT5vb2JfcG9pWzBdID0g Y2hpcC0+cmVhZF9ieXRlKG10ZCk7DQoJfQ0KDQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQN CmdwbWlfZWNjX3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgaW50IHBhZ2UpDQp7DQoJLyoNCgkgKiBUaGUgQkNIIHdpbGwgdXNlIGFsbCB0aGUg KHBhZ2UgKyBvb2IpLg0KCSAqIE91ciBncG1pX2h3X2VjY2xheW91dCBjYW4gb25seSBwcm9oaWJp dCB0aGUgSkZGUzIgdG8gd3JpdGUgdGhlIG9vYi4NCgkgKiBCdXQgaXQgY2FuIG5vdCBzdG9wIHNv bWUgaW9jdGxzIHN1Y2ggTUVNV1JJVEVPT0Igd2hpY2ggdXNlcw0KCSAqIE1URF9PUFNfUExBQ0Vf T09CLiBTbyBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIHByb2hpYml0DQoJ ICogdGhlc2UgaW9jdGxzIHRvby4NCgkgKi8NCglyZXR1cm4gLUVQRVJNOw0KfQ0KDQpzdGF0aWMg aW50IGdwbWlfYmxvY2tfbWFya2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcykN CnsNCglzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2Ow0KCXN0cnVjdCBncG1pX25h bmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7DQoJaW50IGJsb2NrLCByZXQgPSAwOw0KCXVpbnQ4 X3QgKmJsb2NrX21hcms7DQoJaW50IGNvbHVtbiwgcGFnZSwgc3RhdHVzLCBjaGlwbnI7DQoNCgkv KiBHZXQgYmxvY2sgbnVtYmVyICovDQoJYmxvY2sgPSAoaW50KShvZnMgPj4gY2hpcC0+YmJ0X2Vy YXNlX3NoaWZ0KTsNCglpZiAoY2hpcC0+YmJ0KQ0KCQljaGlwLT5iYnRbYmxvY2sgPj4gMl0gfD0g MHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7DQoNCgkvKiBEbyB3ZSBoYXZlIGEgZmxhc2gg YmFzZWQgYmFkIGJsb2NrIHRhYmxlID8gKi8NCglpZiAoY2hpcC0+YmJ0X29wdGlvbnMgJiBOQU5E X0JCVF9VU0VfRkxBU0gpDQoJCXJldCA9IG5hbmRfdXBkYXRlX2JidChtdGQsIG9mcyk7DQoJZWxz ZSB7DQoJCWNoaXBuciA9IChpbnQpKG9mcyA+PiBjaGlwLT5jaGlwX3NoaWZ0KTsNCgkJY2hpcC0+ c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOw0KDQoJCWNvbHVtbiA9IHRoaXMtPnN3YXBfYmxvY2tf bWFyayA/IG10ZC0+d3JpdGVzaXplIDogMDsNCg0KCQkvKiBXcml0ZSB0aGUgYmxvY2sgbWFyay4g Ki8NCgkJYmxvY2tfbWFyayA9IHRoaXMtPmRhdGFfYnVmZmVyX2RtYTsNCgkJYmxvY2tfbWFya1sw XSA9IDA7IC8qIGJhZCBibG9jayBtYXJrZXIgKi8NCg0KCQkvKiBTaGlmdCB0byBnZXQgcGFnZSAq Lw0KCQlwYWdlID0gKGludCkob2ZzID4+IGNoaXAtPnBhZ2Vfc2hpZnQpOw0KDQoJCWNoaXAtPmNt ZGZ1bmMobXRkLCBOQU5EX0NNRF9TRVFJTiwgY29sdW1uLCBwYWdlKTsNCgkJY2hpcC0+d3JpdGVf YnVmKG10ZCwgYmxvY2tfbWFyaywgMSk7DQoJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9Q QUdFUFJPRywgLTEsIC0xKTsNCg0KCQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXAp Ow0KCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkNCgkJCXJldCA9IC1FSU87DQoNCgkJ Y2hpcC0+c2VsZWN0X2NoaXAobXRkLCAtMSk7DQoJfQ0KCWlmICghcmV0KQ0KCQltdGQtPmVjY19z dGF0cy5iYWRibG9ja3MrKzsNCg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyBpbnQgbmFuZF9i b290X3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpDQp7DQoJc3RydWN0 IGJvb3Rfcm9tX2dlb21ldHJ5ICpnZW9tZXRyeSA9ICZ0aGlzLT5yb21fZ2VvbWV0cnk7DQoNCgkv Kg0KCSAqIFNldCB0aGUgYm9vdCBibG9jayBzdHJpZGUgc2l6ZS4NCgkgKg0KCSAqIEluIHByaW5j aXBsZSwgd2Ugc2hvdWxkIGJlIHJlYWRpbmcgdGhpcyBmcm9tIHRoZSBPVFAgYml0cywgc2luY2UN CgkgKiB0aGF0J3Mgd2hlcmUgdGhlIFJPTSBpcyBnb2luZyB0byBnZXQgaXQuIEluIGZhY3QsIHdl IGRvbid0IGhhdmUgYW55DQoJICogd2F5IHRvIHJlYWQgdGhlIE9UUCBiaXRzLCBzbyB3ZSBnbyB3 aXRoIHRoZSBkZWZhdWx0IGFuZCBob3BlIGZvciB0aGUNCgkgKiBiZXN0Lg0KCSAqLw0KCWdlb21l dHJ5LT5zdHJpZGVfc2l6ZV9pbl9wYWdlcyA9IDY0Ow0KDQoJLyoNCgkgKiBTZXQgdGhlIHNlYXJj aCBhcmVhIHN0cmlkZSBleHBvbmVudC4NCgkgKg0KCSAqIEluIHByaW5jaXBsZSwgd2Ugc2hvdWxk IGJlIHJlYWRpbmcgdGhpcyBmcm9tIHRoZSBPVFAgYml0cywgc2luY2UNCgkgKiB0aGF0J3Mgd2hl cmUgdGhlIFJPTSBpcyBnb2luZyB0byBnZXQgaXQuIEluIGZhY3QsIHdlIGRvbid0IGhhdmUgYW55 DQoJICogd2F5IHRvIHJlYWQgdGhlIE9UUCBiaXRzLCBzbyB3ZSBnbyB3aXRoIHRoZSBkZWZhdWx0 IGFuZCBob3BlIGZvciB0aGUNCgkgKiBiZXN0Lg0KCSAqLw0KCWdlb21ldHJ5LT5zZWFyY2hfYXJl YV9zdHJpZGVfZXhwb25lbnQgPSAyOw0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgY29uc3QgY2hh ciAgKmZpbmdlcnByaW50ID0gIlNUTVAiOw0Kc3RhdGljIGludCBteDIzX2NoZWNrX3RyYW5zY3Jp cHRpb25fc3RhbXAoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQ0Kew0KCXN0cnVjdCBib290 X3JvbV9nZW9tZXRyeSAqcm9tX2dlbyA9ICZ0aGlzLT5yb21fZ2VvbWV0cnk7DQoJc3RydWN0IGRl dmljZSAqZGV2ID0gdGhpcy0+ZGV2Ow0KCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gJnRoaXMtPm10 ZDsNCglzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJnRoaXMtPm5hbmQ7DQoJdW5zaWduZWQgaW50 IHNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlczsNCgl1bnNpZ25lZCBpbnQgc3RyaWRlOw0KCXVu c2lnbmVkIGludCBwYWdlOw0KCWxvZmZfdCBieXRlOw0KCXVpbnQ4X3QgKmJ1ZmZlciA9IGNoaXAt PmJ1ZmZlcnMtPmRhdGFidWY7DQoJaW50IHNhdmVkX2NoaXBfbnVtYmVyOw0KCWludCBmb3VuZF9h bl9uY2JfZmluZ2VycHJpbnQgPSBmYWxzZTsNCg0KCS8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBz dHJpZGVzIGluIGEgc2VhcmNoIGFyZWEuICovDQoJc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVz ID0gMSA8PCByb21fZ2VvLT5zZWFyY2hfYXJlYV9zdHJpZGVfZXhwb25lbnQ7DQoNCglzYXZlZF9j aGlwX251bWJlciA9IHRoaXMtPmN1cnJlbnRfY2hpcDsNCgljaGlwLT5zZWxlY3RfY2hpcChtdGQs IDApOw0KDQoJLyoNCgkgKiBMb29wIHRocm91Z2ggdGhlIGZpcnN0IHNlYXJjaCBhcmVhLCBsb29r aW5nIGZvciB0aGUgTkNCIGZpbmdlcnByaW50Lg0KCSAqLw0KCWRldl9kYmcoZGV2LCAiU2Nhbm5p bmcgZm9yIGFuIE5DQiBmaW5nZXJwcmludC4uLlxuIik7DQoNCglmb3IgKHN0cmlkZSA9IDA7IHN0 cmlkZSA8IHNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlczsgc3RyaWRlKyspIHsNCgkJLyogQ29t cHV0ZSB0aGUgcGFnZSBhbmQgYnl0ZSBhZGRyZXNzZXMuICovDQoJCXBhZ2UgPSBzdHJpZGUgKiBy b21fZ2VvLT5zdHJpZGVfc2l6ZV9pbl9wYWdlczsNCgkJYnl0ZSA9IHBhZ2UgICAqIG10ZC0+d3Jp dGVzaXplOw0KDQoJCWRldl9kYmcoZGV2LCAiTG9va2luZyBmb3IgYSBmaW5nZXJwcmludCBpbiBw YWdlIDB4JXhcbiIsIHBhZ2UpOw0KDQoJCS8qDQoJCSAqIFJlYWQgdGhlIE5DQiBmaW5nZXJwcmlu dC4gVGhlIGZpbmdlcnByaW50IGlzIGZvdXIgYnl0ZXMgbG9uZw0KCQkgKiBhbmQgc3RhcnRzIGlu IHRoZSAxMnRoIGJ5dGUgb2YgdGhlIHBhZ2UuDQoJCSAqLw0KCQljaGlwLT5jbWRmdW5jKG10ZCwg TkFORF9DTURfUkVBRDAsIDEyLCBwYWdlKTsNCgkJY2hpcC0+cmVhZF9idWYobXRkLCBidWZmZXIs IHN0cmxlbihmaW5nZXJwcmludCkpOw0KDQoJCS8qIExvb2sgZm9yIHRoZSBmaW5nZXJwcmludC4g Ki8NCgkJaWYgKCFtZW1jbXAoYnVmZmVyLCBmaW5nZXJwcmludCwgc3RybGVuKGZpbmdlcnByaW50 KSkpIHsNCgkJCWZvdW5kX2FuX25jYl9maW5nZXJwcmludCA9IHRydWU7DQoJCQlicmVhazsNCgkJ fQ0KDQoJfQ0KDQoJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBzYXZlZF9jaGlwX251bWJlcik7DQoN CglpZiAoZm91bmRfYW5fbmNiX2ZpbmdlcnByaW50KQ0KCQlkZXZfZGJnKGRldiwgIlx0Rm91bmQg YSBmaW5nZXJwcmludFxuIik7DQoJZWxzZQ0KCQlkZXZfZGJnKGRldiwgIlx0Tm8gZmluZ2VycHJp bnQgZm91bmRcbiIpOw0KCXJldHVybiBmb3VuZF9hbl9uY2JfZmluZ2VycHJpbnQ7DQp9DQoNCi8q IFdyaXRlcyBhIHRyYW5zY3JpcHRpb24gc3RhbXAuICovDQpzdGF0aWMgaW50IG14MjNfd3JpdGVf dHJhbnNjcmlwdGlvbl9zdGFtcChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpDQp7DQoJc3Ry dWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2Ow0KCXN0cnVjdCBib290X3JvbV9nZW9tZXRyeSAq cm9tX2dlbyA9ICZ0aGlzLT5yb21fZ2VvbWV0cnk7DQoJc3RydWN0IG10ZF9pbmZvICptdGQgPSAm dGhpcy0+bXRkOw0KCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhpcy0+bmFuZDsNCgl1bnNp Z25lZCBpbnQgYmxvY2tfc2l6ZV9pbl9wYWdlczsNCgl1bnNpZ25lZCBpbnQgc2VhcmNoX2FyZWFf c2l6ZV9pbl9zdHJpZGVzOw0KCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2Vz Ow0KCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX2Jsb2NrczsNCgl1bnNpZ25lZCBp bnQgYmxvY2s7DQoJdW5zaWduZWQgaW50IHN0cmlkZTsNCgl1bnNpZ25lZCBpbnQgcGFnZTsNCgls b2ZmX3QgICAgICAgYnl0ZTsNCgl1aW50OF90ICAgICAgKmJ1ZmZlciA9IGNoaXAtPmJ1ZmZlcnMt PmRhdGFidWY7DQoJaW50IHNhdmVkX2NoaXBfbnVtYmVyOw0KCWludCBzdGF0dXM7DQoNCgkvKiBD b21wdXRlIHRoZSBzZWFyY2ggYXJlYSBnZW9tZXRyeS4gKi8NCglibG9ja19zaXplX2luX3BhZ2Vz ID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsNCglzZWFyY2hfYXJlYV9zaXplX2lu X3N0cmlkZXMgPSAxIDw8IHJvbV9nZW8tPnNlYXJjaF9hcmVhX3N0cmlkZV9leHBvbmVudDsNCglz ZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzID0gc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzICoN CgkJCQkJcm9tX2dlby0+c3RyaWRlX3NpemVfaW5fcGFnZXM7DQoJc2VhcmNoX2FyZWFfc2l6ZV9p bl9ibG9ja3MgPQ0KCQkgIChzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzICsgKGJsb2NrX3NpemVf aW5fcGFnZXMgLSAxKSkgLw0KCQkJCSAgICBibG9ja19zaXplX2luX3BhZ2VzOw0KDQoJZGV2X2Ri ZyhkZXYsICJTZWFyY2ggQXJlYSBHZW9tZXRyeSA6XG4iKTsNCglkZXZfZGJnKGRldiwgIlx0aW4g QmxvY2tzIDogJXVcbiIsIHNlYXJjaF9hcmVhX3NpemVfaW5fYmxvY2tzKTsNCglkZXZfZGJnKGRl diwgIlx0aW4gU3RyaWRlczogJXVcbiIsIHNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlcyk7DQoJ ZGV2X2RiZyhkZXYsICJcdGluIFBhZ2VzICA6ICV1XG4iLCBzZWFyY2hfYXJlYV9zaXplX2luX3Bh Z2VzKTsNCg0KCS8qIFNlbGVjdCBjaGlwIDAuICovDQoJc2F2ZWRfY2hpcF9udW1iZXIgPSB0aGlz LT5jdXJyZW50X2NoaXA7DQoJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCAwKTsNCg0KCS8qIExvb3Ag b3ZlciBibG9ja3MgaW4gdGhlIGZpcnN0IHNlYXJjaCBhcmVhLCBlcmFzaW5nIHRoZW0uICovDQoJ ZGV2X2RiZyhkZXYsICJFcmFzaW5nIHRoZSBzZWFyY2ggYXJlYS4uLlxuIik7DQoNCglmb3IgKGJs b2NrID0gMDsgYmxvY2sgPCBzZWFyY2hfYXJlYV9zaXplX2luX2Jsb2NrczsgYmxvY2srKykgew0K CQkvKiBDb21wdXRlIHRoZSBwYWdlIGFkZHJlc3MuICovDQoJCXBhZ2UgPSBibG9jayAqIGJsb2Nr X3NpemVfaW5fcGFnZXM7DQoNCgkJLyogRXJhc2UgdGhpcyBibG9jay4gKi8NCgkJZGV2X2RiZyhk ZXYsICJcdEVyYXNpbmcgYmxvY2sgMHgleFxuIiwgYmxvY2spOw0KCQljaGlwLT5jbWRmdW5jKG10 ZCwgTkFORF9DTURfRVJBU0UxLCAtMSwgcGFnZSk7DQoJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5E X0NNRF9FUkFTRTIsIC0xLCAtMSk7DQoNCgkJLyogV2FpdCBmb3IgdGhlIGVyYXNlIHRvIGZpbmlz aC4gKi8NCgkJc3RhdHVzID0gY2hpcC0+d2FpdGZ1bmMobXRkLCBjaGlwKTsNCgkJaWYgKHN0YXR1 cyAmIE5BTkRfU1RBVFVTX0ZBSUwpDQoJCQlkZXZfZXJyKGRldiwgIlslc10gRXJhc2UgZmFpbGVk LlxuIiwgX19mdW5jX18pOw0KCX0NCg0KCS8qIFdyaXRlIHRoZSBOQ0IgZmluZ2VycHJpbnQgaW50 byB0aGUgcGFnZSBidWZmZXIuICovDQoJbWVtc2V0KGJ1ZmZlciwgfjAsIG10ZC0+d3JpdGVzaXpl KTsNCgltZW1zZXQoY2hpcC0+b29iX3BvaSwgfjAsIG10ZC0+b29ic2l6ZSk7DQoJbWVtY3B5KGJ1 ZmZlciArIDEyLCBmaW5nZXJwcmludCwgc3RybGVuKGZpbmdlcnByaW50KSk7DQoNCgkvKiBMb29w IHRocm91Z2ggdGhlIGZpcnN0IHNlYXJjaCBhcmVhLCB3cml0aW5nIE5DQiBmaW5nZXJwcmludHMu ICovDQoJZGV2X2RiZyhkZXYsICJXcml0aW5nIE5DQiBmaW5nZXJwcmludHMuLi5cbiIpOw0KCWZv ciAoc3RyaWRlID0gMDsgc3RyaWRlIDwgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzOyBzdHJp ZGUrKykgew0KCQkvKiBDb21wdXRlIHRoZSBwYWdlIGFuZCBieXRlIGFkZHJlc3Nlcy4gKi8NCgkJ cGFnZSA9IHN0cmlkZSAqIHJvbV9nZW8tPnN0cmlkZV9zaXplX2luX3BhZ2VzOw0KCQlieXRlID0g cGFnZSAgICogbXRkLT53cml0ZXNpemU7DQoNCgkJLyogV3JpdGUgdGhlIGZpcnN0IHBhZ2Ugb2Yg dGhlIGN1cnJlbnQgc3RyaWRlLiAqLw0KCQlkZXZfZGJnKGRldiwgIldyaXRpbmcgYW4gTkNCIGZp bmdlcnByaW50IGluIHBhZ2UgMHgleFxuIiwgcGFnZSk7DQoJCWNoaXAtPmNtZGZ1bmMobXRkLCBO QU5EX0NNRF9TRVFJTiwgMHgwMCwgcGFnZSk7DQoJCWNoaXAtPmVjYy53cml0ZV9wYWdlX3Jhdyht dGQsIGNoaXAsIGJ1ZmZlciwgMCk7DQoJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9QQUdF UFJPRywgLTEsIC0xKTsNCg0KCQkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gZmluaXNoLiAqLw0K CQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOw0KCQlpZiAoc3RhdHVzICYgTkFO RF9TVEFUVVNfRkFJTCkNCgkJCWRldl9lcnIoZGV2LCAiWyVzXSBXcml0ZSBmYWlsZWQuXG4iLCBf X2Z1bmNfXyk7DQoJfQ0KDQoJLyogRGVzZWxlY3QgY2hpcCAwLiAqLw0KCWNoaXAtPnNlbGVjdF9j aGlwKG10ZCwgc2F2ZWRfY2hpcF9udW1iZXIpOw0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50 IG14MjNfYm9vdF9pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAgKnRoaXMpDQp7DQoJc3RydWN0 IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2Ow0KCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhp cy0+bmFuZDsNCglzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZ0aGlzLT5tdGQ7DQoJdW5zaWduZWQg aW50IGJsb2NrX2NvdW50Ow0KCXVuc2lnbmVkIGludCBibG9jazsNCglpbnQgICAgIGNoaXBucjsN CglpbnQgICAgIHBhZ2U7DQoJbG9mZl90ICBieXRlOw0KCXVpbnQ4X3QgYmxvY2tfbWFyazsNCglp bnQgICAgIHJldCA9IDA7DQoNCgkvKg0KCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSBj YW4ndCB1c2UgYmxvY2sgbWFyayBzd2FwcGluZywgd2hpY2gNCgkgKiBtZWFucyB3ZSdyZSBmb3Jj ZWQgdG8gdXNlIHRyYW5zY3JpcHRpb24uIEZpcnN0LCBzY2FuIGZvciB0aGUNCgkgKiB0cmFuc2Ny aXB0aW9uIHN0YW1wLiBJZiB3ZSBmaW5kIGl0LCB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZG8NCgkg KiBhbnl0aGluZyAtLSB0aGUgYmxvY2sgbWFya3MgYXJlIGFscmVhZHkgdHJhbnNjcmliZWQuDQoJ ICovDQoJaWYgKG14MjNfY2hlY2tfdHJhbnNjcmlwdGlvbl9zdGFtcCh0aGlzKSkNCgkJcmV0dXJu IDA7DQoNCgkvKg0KCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSBjb3VsZG4ndCBmaW5k IGEgdHJhbnNjcmlwdGlvbiBzdGFtcCwgc28NCgkgKiBzbyB3ZSBwcmVzdW1lIHRoZSBibG9jayBt YXJrcyBhcmUgaW4gdGhlIGNvbnZlbnRpb25hbCBsb2NhdGlvbi4NCgkgKi8NCglkZXZfZGJnKGRl diwgIlRyYW5zY3JpYmluZyBiYWQgYmxvY2sgbWFya3MuLi5cbiIpOw0KDQoJLyogQ29tcHV0ZSB0 aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgZW50aXJlIG1lZGl1bS4gKi8NCglibG9ja19jb3Vu dCA9IGNoaXAtPmNoaXBzaXplID4+IGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQ7DQoNCgkvKg0KCSAq IExvb3Agb3ZlciBhbGwgdGhlIGJsb2NrcyBpbiB0aGUgbWVkaXVtLCB0cmFuc2NyaWJpbmcgYmxv Y2sgbWFya3MgYXMNCgkgKiB3ZSBnby4NCgkgKi8NCglmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBi bG9ja19jb3VudDsgYmxvY2srKykgew0KCQkvKg0KCQkgKiBDb21wdXRlIHRoZSBjaGlwLCBwYWdl IGFuZCBieXRlIGFkZHJlc3NlcyBmb3IgdGhpcyBibG9jaydzDQoJCSAqIGNvbnZlbnRpb25hbCBt YXJrLg0KCQkgKi8NCgkJY2hpcG5yID0gYmxvY2sgPj4gKGNoaXAtPmNoaXBfc2hpZnQgLSBjaGlw LT5waHlzX2VyYXNlX3NoaWZ0KTsNCgkJcGFnZSA9IGJsb2NrIDw8IChjaGlwLT5waHlzX2VyYXNl X3NoaWZ0IC0gY2hpcC0+cGFnZV9zaGlmdCk7DQoJCWJ5dGUgPSBibG9jayA8PCAgY2hpcC0+cGh5 c19lcmFzZV9zaGlmdDsNCg0KCQkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHJlYWQgdGhlIGNvbnZl bnRpb25hbCBibG9jayBtYXJrLiAqLw0KCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7 DQoJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgbXRkLT53cml0ZXNpemUsIHBh Z2UpOw0KCQlibG9ja19tYXJrID0gY2hpcC0+cmVhZF9ieXRlKG10ZCk7DQoJCWNoaXAtPnNlbGVj dF9jaGlwKG10ZCwgLTEpOw0KDQoJCS8qDQoJCSAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBtYXJr ZWQgYmFkLiBJZiBzbywgd2UgbmVlZCB0byBtYXJrIGl0DQoJCSAqIGFnYWluLCBidXQgdGhpcyB0 aW1lIHRoZSByZXN1bHQgd2lsbCBiZSBhIG1hcmsgaW4gdGhlDQoJCSAqIGxvY2F0aW9uIHdoZXJl IHdlIHRyYW5zY3JpYmUgYmxvY2sgbWFya3MuDQoJCSAqLw0KCQlpZiAoYmxvY2tfbWFyayAhPSAw eGZmKSB7DQoJCQlkZXZfZGJnKGRldiwgIlRyYW5zY3JpYmluZyBtYXJrIGluIGJsb2NrICV1XG4i LCBibG9jayk7DQoJCQlyZXQgPSBjaGlwLT5ibG9ja19tYXJrYmFkKG10ZCwgYnl0ZSk7DQoJCQlp ZiAocmV0KQ0KCQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcmsgYmxvY2sgYmFkIHdpdGgg Ig0KCQkJCQkJCSJyZXQgJWRcbiIsIHJldCk7DQoJCX0NCgl9DQoNCgkvKiBXcml0ZSB0aGUgc3Rh bXAgdGhhdCBpbmRpY2F0ZXMgd2UndmUgdHJhbnNjcmliZWQgdGhlIGJsb2NrIG1hcmtzLiAqLw0K CW14MjNfd3JpdGVfdHJhbnNjcmlwdGlvbl9zdGFtcCh0aGlzKTsNCglyZXR1cm4gMDsNCn0NCg0K c3RhdGljIGludCBuYW5kX2Jvb3RfaW5pdChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgICp0aGlzKQ0K ew0KCW5hbmRfYm9vdF9zZXRfZ2VvbWV0cnkodGhpcyk7DQoNCgkvKiBUaGlzIGlzIFJPTSBhcmNo LXNwZWNpZmljIGluaXRpbGl6YXRpb24gYmVmb3JlIHRoZSBCQlQgc2Nhbm5pbmcuICovDQoJaWYg KEdQTUlfSVNfTVgyMyh0aGlzKSkNCgkJcmV0dXJuIG14MjNfYm9vdF9pbml0KHRoaXMpOw0KCXJl dHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50IGdwbWlfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25h bmRfZGF0YSAqdGhpcykNCnsNCglpbnQgcmV0Ow0KDQoJLyogRnJlZSB0aGUgdGVtcG9yYXJ5IERN QSBtZW1vcnkgZm9yIHJlYWRpbmcgSUQuICovDQoJZ3BtaV9mcmVlX2RtYV9idWZmZXIodGhpcyk7 DQoNCgkvKiBTZXQgdXAgdGhlIE5GQyBnZW9tZXRyeSB3aGljaCBpcyB1c2VkIGJ5IEJDSC4gKi8N CglyZXQgPSBiY2hfc2V0X2dlb21ldHJ5KHRoaXMpOw0KCWlmIChyZXQpIHsNCgkJcHJfZXJyKCJz ZXQgZ2VvbWV0cnkgcmV0IDogJWRcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJLyog QWxsb2MgdGhlIG5ldyBETUEgYnVmZmVycyBhY2NvcmRpbmcgdG8gdGhlIHBhZ2VzaXplIGFuZCBv b2JzaXplICovDQoJcmV0dXJuIGdwbWlfYWxsb2NfZG1hX2J1ZmZlcih0aGlzKTsNCn0NCg0Kc3Rh dGljIGludCBncG1pX3ByZV9iYnRfc2NhbihzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgICp0aGlzKQ0K ew0KCWludCByZXQ7DQoNCgkvKiBTZXQgdXAgc3dhcF9ibG9ja19tYXJrLCBtdXN0IGJlIHNldCBi ZWZvcmUgdGhlIGdwbWlfc2V0X2dlb21ldHJ5KCkgKi8NCglpZiAoR1BNSV9JU19NWDIzKHRoaXMp KQ0KCQl0aGlzLT5zd2FwX2Jsb2NrX21hcmsgPSBmYWxzZTsNCgllbHNlDQoJCXRoaXMtPnN3YXBf YmxvY2tfbWFyayA9IHRydWU7DQoNCgkvKiBTZXQgdXAgdGhlIG1lZGl1bSBnZW9tZXRyeSAqLw0K CXJldCA9IGdwbWlfc2V0X2dlb21ldHJ5KHRoaXMpOw0KCWlmIChyZXQpDQoJCXJldHVybiByZXQ7 DQoNCgkvKiBBZGp1c3QgdGhlIEVDQyBzdHJlbmd0aCBhY2NvcmRpbmcgdG8gdGhlIGNoaXAuICov DQoJdGhpcy0+bmFuZC5lY2Muc3RyZW5ndGggPSB0aGlzLT5iY2hfZ2VvbWV0cnkuZWNjX3N0cmVu Z3RoOw0KCXRoaXMtPm10ZC5lY2Nfc3RyZW5ndGggPSB0aGlzLT5iY2hfZ2VvbWV0cnkuZWNjX3N0 cmVuZ3RoOw0KDQoJLyogTkFORCBib290IGluaXQsIGRlcGVuZHMgb24gdGhlIGdwbWlfc2V0X2dl b21ldHJ5KCkuICovDQoJcmV0dXJuIG5hbmRfYm9vdF9pbml0KHRoaXMpOw0KfQ0KDQpzdGF0aWMg aW50IGdwbWlfc2Nhbl9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQpDQp7DQoJc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsNCglzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBj aGlwLT5wcml2Ow0KCWludCByZXQ7DQoNCgkvKiBQcmVwYXJlIGZvciB0aGUgQkJUIHNjYW4uICov DQoJcmV0ID0gZ3BtaV9wcmVfYmJ0X3NjYW4odGhpcyk7DQoJaWYgKHJldCkNCgkJcmV0dXJuIHJl dDsNCg0KCS8qIHVzZSB0aGUgZGVmYXVsdCBCQlQgaW1wbGVtZW50YXRpb24gKi8NCglyZXR1cm4g bmFuZF9kZWZhdWx0X2JidChtdGQpOw0KfQ0KDQp2b2lkIGdwbWlfbmZjX2V4aXQoc3RydWN0IGdw bWlfbmFuZF9kYXRhICp0aGlzKQ0Kew0KCW5hbmRfcmVsZWFzZSgmdGhpcy0+bXRkKTsNCglncG1p X2ZyZWVfZG1hX2J1ZmZlcih0aGlzKTsNCn0NCg0Kc3RhdGljIGludCBfX2RldmluaXQgZ3BtaV9u ZmNfaW5pdChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpDQp7DQoJc3RydWN0IG10ZF9pbmZv ICAqbXRkID0gJnRoaXMtPm10ZDsNCglzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJnRoaXMtPm5h bmQ7DQoJc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhIHBwZGF0YSA9IHt9Ow0KCWludCByZXQ7 DQoNCgkvKiBpbml0IGN1cnJlbnQgY2hpcCAqLw0KCXRoaXMtPmN1cnJlbnRfY2hpcAk9IC0xOw0K DQoJLyogaW5pdCB0aGUgTVREIGRhdGEgc3RydWN0dXJlcyAqLw0KCW10ZC0+cHJpdgkJPSBjaGlw Ow0KCW10ZC0+bmFtZQkJPSAiZ3BtaS1uYW5kIjsNCgltdGQtPm93bmVyCQk9IFRISVNfTU9EVUxF Ow0KDQoJLyogaW5pdCB0aGUgbmFuZF9jaGlwe30sIHdlIGRvbid0IHN1cHBvcnQgYSAxNi1iaXQg TkFORCBGbGFzaCBidXMuICovDQoJY2hpcC0+cHJpdgkJPSB0aGlzOw0KCWNoaXAtPnNlbGVjdF9j aGlwCT0gZ3BtaV9zZWxlY3RfY2hpcDsNCgljaGlwLT5jbWRfY3RybAkJPSBncG1pX2NtZF9jdHJs Ow0KCWNoaXAtPmRldl9yZWFkeQkJPSBncG1pX2Rldl9yZWFkeTsNCgljaGlwLT5yZWFkX2J5dGUJ CT0gZ3BtaV9yZWFkX2J5dGU7DQoJY2hpcC0+cmVhZF9idWYJCT0gZ3BtaV9yZWFkX2J1ZjsNCglj aGlwLT53cml0ZV9idWYJCT0gZ3BtaV93cml0ZV9idWY7DQoJY2hpcC0+ZWNjLnJlYWRfcGFnZQk9 IGdwbWlfZWNjX3JlYWRfcGFnZTsNCgljaGlwLT5lY2Mud3JpdGVfcGFnZQk9IGdwbWlfZWNjX3dy aXRlX3BhZ2U7DQoJY2hpcC0+ZWNjLnJlYWRfb29iCT0gZ3BtaV9lY2NfcmVhZF9vb2I7DQoJY2hp cC0+ZWNjLndyaXRlX29vYgk9IGdwbWlfZWNjX3dyaXRlX29vYjsNCgljaGlwLT5zY2FuX2JidAkJ PSBncG1pX3NjYW5fYmJ0Ow0KCWNoaXAtPmJhZGJsb2NrX3BhdHRlcm4JPSAmZ3BtaV9iYnRfZGVz Y3I7DQoJY2hpcC0+YmxvY2tfbWFya2JhZAk9IGdwbWlfYmxvY2tfbWFya2JhZDsNCgljaGlwLT5v cHRpb25zCQl8PSBOQU5EX05PX1NVQlBBR0VfV1JJVEU7DQoJY2hpcC0+ZWNjLm1vZGUJCT0gTkFO RF9FQ0NfSFc7DQoJY2hpcC0+ZWNjLnNpemUJCT0gMTsNCgljaGlwLT5lY2Muc3RyZW5ndGgJPSA4 Ow0KCWNoaXAtPmVjYy5sYXlvdXQJPSAmZ3BtaV9od19lY2NsYXlvdXQ7DQoNCgkvKiBBbGxvY2F0 ZSBhIHRlbXBvcmFyeSBETUEgYnVmZmVyIGZvciByZWFkaW5nIElEIGluIHRoZSBuYW5kX3NjYW4o KSAqLw0KCXRoaXMtPmJjaF9nZW9tZXRyeS5wYXlsb2FkX3NpemUgPSAxMDI0Ow0KCXRoaXMtPmJj aF9nZW9tZXRyeS5hdXhpbGlhcnlfc2l6ZSA9IDEyODsNCglyZXQgPSBncG1pX2FsbG9jX2RtYV9i dWZmZXIodGhpcyk7DQoJaWYgKHJldCkNCgkJZ290byBlcnJfb3V0Ow0KDQoJcmV0ID0gbmFuZF9z Y2FuKG10ZCwgMSk7DQoJaWYgKHJldCkgew0KCQlwcl9lcnIoIkNoaXAgc2NhbiBmYWlsZWRcbiIp Ow0KCQlnb3RvIGVycl9vdXQ7DQoJfQ0KDQoJcHBkYXRhLm9mX25vZGUgPSB0aGlzLT5wZGV2LT5k ZXYub2Zfbm9kZTsNCglyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwg JnBwZGF0YSwgTlVMTCwgMCk7DQoJaWYgKHJldCkNCgkJZ290byBlcnJfb3V0Ow0KCXJldHVybiAw Ow0KDQplcnJfb3V0Og0KCWdwbWlfbmZjX2V4aXQodGhpcyk7DQoJcmV0dXJuIHJldDsNCn0NCg0K c3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgZ3BtaV9pZHNbXSA9IHsNCgl7 IC5uYW1lID0gImlteDIzLWdwbWktbmFuZCIsIC5kcml2ZXJfZGF0YSA9IElTX01YMjMsIH0sDQoJ eyAubmFtZSA9ICJpbXgyOC1ncG1pLW5hbmQiLCAuZHJpdmVyX2RhdGEgPSBJU19NWDI4LCB9LA0K CXsgLm5hbWUgPSAiaW14NnEtZ3BtaS1uYW5kIiwgLmRyaXZlcl9kYXRhID0gSVNfTVg2USwgfSwN Cgl7fSwNCn07DQoNCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdwbWlfbmFuZF9p ZF90YWJsZVtdID0gew0KCXsNCgkJLmNvbXBhdGlibGUgPSAiZnNsLGlteDIzLWdwbWktbmFuZCIs DQoJCS5kYXRhID0gKHZvaWQgKikmZ3BtaV9pZHNbSVNfTVgyM10NCgl9LCB7DQoJCS5jb21wYXRp YmxlID0gImZzbCxpbXgyOC1ncG1pLW5hbmQiLA0KCQkuZGF0YSA9ICh2b2lkICopJmdwbWlfaWRz W0lTX01YMjhdDQoJfSwgew0KCQkuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BtaS1uYW5kIiwN CgkJLmRhdGEgPSAodm9pZCAqKSZncG1pX2lkc1tJU19NWDZRXQ0KCX0sIHt9DQp9Ow0KTU9EVUxF X0RFVklDRV9UQUJMRShvZiwgZ3BtaV9uYW5kX2lkX3RhYmxlKTsNCg0Kc3RhdGljIGludCBfX2Rl dmluaXQgZ3BtaV9uYW5kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQp7DQoJ c3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzOw0KCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg Km9mX2lkOw0KCWludCByZXQ7DQoNCglvZl9pZCA9IG9mX21hdGNoX2RldmljZShncG1pX25hbmRf aWRfdGFibGUsICZwZGV2LT5kZXYpOw0KCWlmIChvZl9pZCkgew0KCQlwZGV2LT5pZF9lbnRyeSA9 IG9mX2lkLT5kYXRhOw0KCX0gZWxzZSB7DQoJCXByX2VycigiRmFpbGVkIHRvIGZpbmQgdGhlIHJp Z2h0IGRldmljZSBpZC5cbiIpOw0KCQlyZXR1cm4gLUVOT01FTTsNCgl9DQoNCgl0aGlzID0ga3ph bGxvYyhzaXplb2YoKnRoaXMpLCBHRlBfS0VSTkVMKTsNCglpZiAoIXRoaXMpIHsNCgkJcHJfZXJy KCJGYWlsZWQgdG8gYWxsb2NhdGUgcGVyLWRldmljZSBtZW1vcnlcbiIpOw0KCQlyZXR1cm4gLUVO T01FTTsNCgl9DQoNCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0aGlzKTsNCgl0aGlzLT5w ZGV2ICA9IHBkZXY7DQoJdGhpcy0+ZGV2ICAgPSAmcGRldi0+ZGV2Ow0KDQoJcmV0ID0gYWNxdWly ZV9yZXNvdXJjZXModGhpcyk7DQoJaWYgKHJldCkNCgkJZ290byBleGl0X2FjcXVpcmVfcmVzb3Vy Y2VzOw0KDQoJcmV0ID0gaW5pdF9oYXJkd2FyZSh0aGlzKTsNCglpZiAocmV0KQ0KCQlnb3RvIGV4 aXRfbmZjX2luaXQ7DQoNCglyZXQgPSBncG1pX25mY19pbml0KHRoaXMpOw0KCWlmIChyZXQpDQoJ CWdvdG8gZXhpdF9uZmNfaW5pdDsNCg0KCXJldHVybiAwOw0KDQpleGl0X25mY19pbml0Og0KCXJl bGVhc2VfcmVzb3VyY2VzKHRoaXMpOw0KZXhpdF9hY3F1aXJlX3Jlc291cmNlczoNCglwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsNCglrZnJlZSh0aGlzKTsNCglyZXR1cm4gcmV0Ow0K fQ0KDQpzdGF0aWMgaW50IF9fZXhpdCBncG1pX25hbmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpDQp7DQoJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gcGxhdGZvcm1f Z2V0X2RydmRhdGEocGRldik7DQoNCglncG1pX25mY19leGl0KHRoaXMpOw0KCXJlbGVhc2VfcmVz b3VyY2VzKHRoaXMpOw0KCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOw0KCWtmcmVl KHRoaXMpOw0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBn cG1pX25hbmRfZHJpdmVyID0gew0KCS5kcml2ZXIgPSB7DQoJCS5uYW1lID0gImdwbWktbmFuZCIs DQoJCS5vZl9tYXRjaF90YWJsZSA9IGdwbWlfbmFuZF9pZF90YWJsZSwNCgl9LA0KCS5wcm9iZSAg ID0gZ3BtaV9uYW5kX3Byb2JlLA0KCS5yZW1vdmUgID0gX19leGl0X3AoZ3BtaV9uYW5kX3JlbW92 ZSksDQoJLmlkX3RhYmxlID0gZ3BtaV9pZHMsDQp9Ow0KDQpzdGF0aWMgaW50IF9faW5pdCBncG1p X25hbmRfaW5pdCh2b2lkKQ0Kew0KCWludCBlcnI7DQoNCgllcnIgPSBwbGF0Zm9ybV9kcml2ZXJf cmVnaXN0ZXIoJmdwbWlfbmFuZF9kcml2ZXIpOw0KCWlmIChlcnIgPT0gMCkNCgkJcHJpbnRrKEtF Uk5fSU5GTyAiR1BNSSBOQU5EIGRyaXZlciByZWdpc3RlcmVkLiAoSU1YKVxuIik7DQoJZWxzZQ0K CQlwcl9lcnIoImkuTVggR1BNSSBOQU5EIGRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsN CglyZXR1cm4gZXJyOw0KfQ0KDQpzdGF0aWMgdm9pZCBfX2V4aXQgZ3BtaV9uYW5kX2V4aXQodm9p ZCkNCnsNCglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3BtaV9uYW5kX2RyaXZlcik7DQp9 DQoNCm1vZHVsZV9pbml0KGdwbWlfbmFuZF9pbml0KTsNCm1vZHVsZV9leGl0KGdwbWlfbmFuZF9l eGl0KTsNCg0KTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4iKTsN Ck1PRFVMRV9ERVNDUklQVElPTigiaS5NWCBHUE1JIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEcml2 ZXIiKTsNCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCm== --=-YnFhL7MeMVc95DgI8xO4-- --=-yMkFaHy1ZLGL4kw0Srf/ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQBC9xAAoJECmIfjd9wqK0UbsP/ArQ53PIeHX7+Wxwo/kf/EP3 ea3nzfL6oZgzF+g5Mj19uD11QNl0U4YVa7Gob6P20gKPURydv0mkQC4IjJ9/HlMU OeFzyE+wuMn2mDaAlhPIUrgK2YHKGzJr7A14ZuZ/yRsL/5QgibS4gQ2NHkGdtbym LNF3zBhOrMbIfxnNCADRdyVeRibNs9f6YzxRZn5/zrmHpkayQGbzAEdtdmlTZCLD McS6QUz7XnvX67CGWV0dFhu0Lqm5Ft7rDVDFvUu9qX1LLFKwnwDlCjqVw0gEkUM0 t4qsg1bZNAx5EzhoIQQiRb++r1IvJAIL40Uobg32eYKoYoIlI+90+Go5+sZwEn5l /0t6/1sabcTDvGTzqXw1saPx2hD5PA2tGL6iUjYYSnc792YgsZI4VCENnE/2PfFe SFuAQMAmPs9xe7Qmc9B3Sy/mSVmrDqByB5wyQ5pu4hXfuew5V1g/cij73YAnuKUE RimopLinYv0LfKCKp0y+acZEdUgcOuDBmhZIfwgv78h4jFIXNq1E4hhg/ILZCAny Jo9AD9hfWajd2PrjPpuu2fhJVZ63o7b0zu6wanP7aCy5oRE7ZYXVk/r0udKG22qF xEbB0K6+6YF542JAFdyJeAB6oSBV8PXu7AQgfehN9id5rlsNxt6M2G21YRTw3nfM vuwHSUJajpvRUSMgu/IV =t7+9 -----END PGP SIGNATURE----- --=-yMkFaHy1ZLGL4kw0Srf/--