From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bartlomiej Zolnierkiewicz Subject: Re: [PATCH] remove ide-scsi Date: Sat, 6 Dec 2008 15:06:10 +0100 Message-ID: <200812061506.10752.bzolnier@gmail.com> References: <20081203103856S.fujita.tomonori@lab.ntt.co.jp> <1228316941.5551.6.camel@localhost.localdomain> <20081205231200.ecc39dc5.zaitcev@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20081205231200.ecc39dc5.zaitcev@redhat.com> Content-Disposition: inline Sender: linux-scsi-owner@vger.kernel.org To: Pete Zaitcev Cc: James Bottomley , Christoph Hellwig , FUJITA Tomonori , linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, osst@riede.org List-Id: linux-ide@vger.kernel.org T24gU2F0dXJkYXkgMDYgRGVjZW1iZXIgMjAwOCwgUGV0ZSBaYWl0Y2V2IHdyb3RlOgo+IE9uIFdl ZCwgMDMgRGVjIDIwMDggMDk6MDk6MDAgLTA2MDAsIEphbWVzIEJvdHRvbWxleSA8SmFtZXMuQm90 dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbT4gd3JvdGU6Cj4gCj4gPiBnaXQgbG9nIHRlbGxz IG1lIGlkZS1zY3NpIGhhcyBiZWVuIHVwZGF0ZWQgcXVpdGUgYSBiaXQgcmVjZW50bHksIGJ1dCBp dAo+ID4gbW9zdGx5IGxvb2tzIHRvIGJlIGZhbGxvdXQgYXJvdW5kIHRoZSBkcml2ZXJzL2lkZSBj aHVybi4gIENhbiB3ZSBnZXQgaWRlCj4gPiBtYWludGFpbmVyJ3MgYnV5IGluIGZvciB0aGlzIChJ IHRoaW5rIHRoZXkndmUgYmVlbiBtYWludGFpbmluZyBpZGUtdGFwZQo+ID4gYW5kIGlkZS1jZCBp biBwcmVmZXJlbmNlIHRvIGlkZS1zY3NpKT8KPiAKPiBUaGV5IG11c3QgYmUgYm9ua2VycyB0byBk byBpdC4gSSBmaXhlZCBhIGNvdXBsZSBvZiBidWdzIGluIGlkZS10YXBlCj4gYW5kIGl0IHdhcyBv bmUgb2YgdGhlIHdvcnN0IGRyaXZlcnMgSSB3b3JrZWQgb24sIGV2ZXIgKHdvcnNlIHRoYW4KPiBm bG9wcHkuYywgSSBraWQgeW91IG5vdCkuIEl0IGRlZmluaXRlbHkgbXVzdCBkaWUgYmVmb3JlIGlk ZS1zY3NpLgo+IEZvcnR1bmF0ZWx5LCBJIHNvbHZlZCB0aGlzIGlzc3VlIGJ5IGhvb2tpbmcgbXkg dGFwZSB0byBVU0IgYnJpZGdlLAo+IG9yIGVsc2UgSSdkIGJlIHVwIGluIGFybXMgYW5kIHdhbnRp bmcgVG9tbydzIGJsb29kLgoKUGV0ZSwgSSBkb24ndCBtZWFuIGFueSBkaXNyZXNwZWN0IG9yIHRv IGRlbnkgeW91ciBjcmVkaXQgZm9yIHlvdXIgcGFzdApjb250cmlidXRpb25zIGJ1dCBpdCBtdXN0 IGhhdmUgYmVlbiAicXVpdGUgYSBzb21lIiB0aW1lIGFnbyBzaW5jZSB5b3Ugd2VyZQpsYXN0IHdv cmtpbmcgb24gaWRlLXRhcGUuIDstKQoKWyBUbyBiZSBzdXJlIEkgY2hlY2tlZCBib3RoIExpbnVz JyB0cmVlICh3aGljaCBnb2VzIGJhY2sgdG8gQXByIDIwMDUsCiAgMi42LjEyIHRpbWVmcmFtZSkg YW5kIFRob21hcycgaGlzdG9yaWNhbCBnaXQgdHJlZSAoRmViIDIwMDIgLyAyLjQuMSkKICAtLSBJ IGRvbid0IHNlZSBhbnkgSURFIGNoYW5nZXMgZnJvbSB5b3UgdGhlcmUuIF0KCkluIHRoZSByZWNl bnQgeWVhcnMgQm9yaXNsYXYgYW5kIG1lIHB1dCBzdWJzdGFudGlhbCB3b3JrIGludG8gcHV0dGlu ZwppZGUtdGFwZSBpbnRvIGEgc2FuZSBzdGF0ZSAobWFpbmx5IGFzIGEgYnktcHJvZHVjdCBvZiB3 b3JraW5nIG9uIGdlbmVyaWMKQVRBUEkgc3VwcG9ydCkgYW5kIGFsdGhvdWdoIG1hbnkgaW1wcm92 ZW1lbnRzIGFyZSBzdGlsbCBwb3NzaWJsZSAoQlRXCnBhdGNoZXMgYXJlIGFsd2F5cyB3YXJtbHkg d2VsY29tZWQpIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgaG9ycm9ycyBsaWtlCmlkZXNjc2lfZWhf YWJvcnQoKSAvIGlkZXNjc2lfZWhfcmVzZXQoKSBpbiBpZGUtc2NzaS4gIE1vcmVvdmVyIGlkZS10 YXBlCmlzIG9mIG11Y2ggbGVzcyBjb21wbGV4aXR5IHRoYW4gU0NTSSBzdCBkcml2ZXIgKGFmdGVy YWxsIGlkZS10YXBlLmMgaXMKbm93IGFsbW9zdCBoYWxmIG9mIHRoZSBzaXplIC8gbGluZXMgb2Yg Y29kZSBvZiBzdC5jKS4KClNlZSBmb3IgeW91cnNlbGYsIGlkZS10YXBlLmMgZnJvbSBMaW51cycg dHJlZToKCi8qCiAqIElERSBBVEFQSSBzdHJlYW1pbmcgdGFwZSBkcml2ZXIuCiAqCiAqIENvcHly aWdodCAoQykgMTk5NS0xOTk5ICBHYWRpIE94bWFuIDxnYWRpb0BuZXR2aXNpb24ubmV0LmlsPgog KiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgQmFydGxvbWllaiBab2xuaWVya2lld2ljegogKgog KiBUaGlzIGRyaXZlciB3YXMgY29uc3RydWN0ZWQgYXMgYSBzdHVkZW50IHByb2plY3QgaW4gdGhl IHNvZnR3YXJlIGxhYm9yYXRvcnkKICogb2YgdGhlIGZhY3VsdHkgb2YgZWxlY3RyaWNhbCBlbmdp bmVlcmluZyBpbiB0aGUgVGVjaG5pb24gLSBJc3JhZWwncwogKiBJbnN0aXR1dGUgT2YgVGVjaG5v bG9neSwgd2l0aCB0aGUgZ3VpZGUgb2YgQXZuZXIgTG90dGVtIGFuZCBEci4gSWxhbmEgRGF2aWQu CiAqCiAqIEl0IGlzIGhlcmVieSBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgZ2Vu ZXJhbCBwdWJsaWMgbGljZW5zZS4KICogKFNlZSBsaW51eC9DT1BZSU5HKS4KICoKICogRm9yIGEg aGlzdG9yaWNhbCBjaGFuZ2Vsb2cgc2VlCiAqIERvY3VtZW50YXRpb24vaWRlL0NoYW5nZUxvZy5p ZGUtdGFwZS4xOTk1LTIwMDIKICovCgojZGVmaW5lIERSVl9OQU1FICJpZGUtdGFwZSIKCiNkZWZp bmUgSURFVEFQRV9WRVJTSU9OICIxLjIwIgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5j bHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8 bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgv dGltZXIuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQu aD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNp bmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KI2luY2x1ZGUg PGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaWRl Lmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvY29tcGxldGlv bi5oPgojaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgoj aW5jbHVkZSA8c2NzaS9zY3NpLmg+CgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgojaW5jbHVk ZSA8bGludXgvaXJxLmg+CiNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiNpbmNsdWRlIDxsaW51 eC9pby5oPgojaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgojaW5jbHVkZSA8bGludXgvbXRpby5o PgoKZW51bSB7CgkvKiBvdXRwdXQgZXJyb3JzIG9ubHkgKi8KCURCR19FUlIgPQkJKDEgPDwgMCks CgkvKiBvdXRwdXQgYWxsIHNlbnNlIGtleS9hc2MgKi8KCURCR19TRU5TRSA9CQkoMSA8PCAxKSwK CS8qIGluZm8gcmVnYXJkaW5nIGFsbCBjaHJkZXYtcmVsYXRlZCBwcm9jZWR1cmVzICovCglEQkdf Q0hSREVWID0JCSgxIDw8IDIpLAoJLyogYWxsIHJlbWFpbmluZyBwcm9jZWR1cmVzICovCglEQkdf UFJPQ1MgPQkJKDEgPDwgMyksCn07CgovKiBkZWZpbmUgdG8gc2VlIGRlYnVnIGluZm8gKi8KI2Rl ZmluZSBJREVUQVBFX0RFQlVHX0xPRwkJMAoKI2lmIElERVRBUEVfREVCVUdfTE9HCiNkZWZpbmUg ZGVidWdfbG9nKGx2bCwgZm10LCBhcmdzLi4uKQkJCVwKewkJCQkJCQlcCglpZiAodGFwZS0+ZGVi dWdfbWFzayAmIGx2bCkJCQlcCglwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogIiBmbXQsICMj IGFyZ3MpOwlcCn0KI2Vsc2UKI2RlZmluZSBkZWJ1Z19sb2cobHZsLCBmbXQsIGFyZ3MuLi4pIGRv IHt9IHdoaWxlICgwKQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFR1bmFi bGUgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQWZ0ZXIg ZWFjaCBmYWlsZWQgcGFja2V0IGNvbW1hbmQgd2UgaXNzdWUgYSByZXF1ZXN0IHNlbnNlIGNvbW1h bmQgYW5kIHJldHJ5CiAqIHRoZSBwYWNrZXQgY29tbWFuZCBJREVUQVBFX01BWF9QQ19SRVRSSUVT IHRpbWVzLgogKgogKiBTZXR0aW5nIElERVRBUEVfTUFYX1BDX1JFVFJJRVMgdG8gMCB3aWxsIGRp c2FibGUgcmV0cmllcy4KICovCiNkZWZpbmUgSURFVEFQRV9NQVhfUENfUkVUUklFUwkJMwoKLyoK ICogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvaW50IGlu IHRoZSBpbnRlcm5hbCB0YXBlIGZpZm8KICogaW4gd2hpY2ggd2Ugd2lsbCBzdGFydCB0byByZWZp bGwgdGhlIGJ1ZmZlci4gRGVjcmVhc2luZyB0aGUgZm9sbG93aW5nCiAqIHBhcmFtZXRlciB3aWxs IGltcHJvdmUgdGhlIHN5c3RlbSdzIGxhdGVuY3kgYW5kIGludGVyYWN0aXZlIHJlc3BvbnNlLCB3 aGlsZQogKiB1c2luZyBhIGhpZ2ggdmFsdWUgbWlnaHQgaW1wcm92ZSBzeXN0ZW0gdGhyb3VnaHB1 dC4KICovCiNkZWZpbmUgSURFVEFQRV9GSUZPX1RIUkVTSE9MRAkJMgoKLyoKICogRFNDIHBvbGxp bmcgcGFyYW1ldGVycy4KICoKICogUG9sbGluZyBmb3IgRFNDIChhIHNpbmdsZSBiaXQgaW4gdGhl IHN0YXR1cyByZWdpc3RlcikgaXMgYSB2ZXJ5IGltcG9ydGFudAogKiBmdW5jdGlvbiBpbiBpZGUt dGFwZS4gVGhlcmUgYXJlIHR3byBjYXNlcyBpbiB3aGljaCB3ZSBwb2xsIGZvciBEU0M6CiAqCiAq IDEuIEJlZm9yZSBhIHJlYWQvd3JpdGUgcGFja2V0IGNvbW1hbmQsIHRvIGVuc3VyZSB0aGF0IHdl IGNhbiB0cmFuc2ZlciBkYXRhCiAqIGZyb20vdG8gdGhlIHRhcGUncyBkYXRhIGJ1ZmZlcnMsIHdp dGhvdXQgY2F1c2luZyBhbiBhY3R1YWwgbWVkaWEgYWNjZXNzLgogKiBJbiBjYXNlIHRoZSB0YXBl IGlzIG5vdCByZWFkeSB5ZXQsIHdlIHRha2Ugb3V0IG91ciByZXF1ZXN0IGZyb20gdGhlIGRldmlj ZQogKiByZXF1ZXN0IHF1ZXVlLCBzbyB0aGF0IGlkZS5jIGNvdWxkIHNlcnZpY2UgcmVxdWVzdHMg ZnJvbSB0aGUgb3RoZXIgZGV2aWNlCiAqIG9uIHRoZSBzYW1lIGludGVyZmFjZSBpbiB0aGUgbWVh bnRpbWUuCiAqCiAqIDIuIEFmdGVyIHRoZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mIGEg Im1lZGlhIGFjY2VzcyBwYWNrZXQgY29tbWFuZCIsCiAqIHdoaWNoIGlzIGEgY29tbWFuZCB0aGF0 IGNhbiB0YWtlIGEgbG9uZyB0aW1lIHRvIGNvbXBsZXRlICh0aGUgaW50ZXJ2YWwgY2FuCiAqIHJh bmdlIGZyb20gc2V2ZXJhbCBzZWNvbmRzIHRvIGV2ZW4gYW4gaG91cikuIEFnYWluLCB3ZSBwb3N0 cG9uZSBvdXIgcmVxdWVzdAogKiBpbiB0aGUgbWlkZGxlIHRvIGZyZWUgdGhlIGJ1cyBmb3IgdGhl IG90aGVyIGRldmljZS4gVGhlIHBvbGxpbmcgZnJlcXVlbmN5CiAqIGhlcmUgc2hvdWxkIGJlIGxv d2VyIHRoYW4gdGhlIHJlYWQvd3JpdGUgZnJlcXVlbmN5IHNpbmNlIHRob3NlIG1lZGlhIGFjY2Vz cwogKiBjb21tYW5kcyBhcmUgc2xvdy4gV2Ugc3RhcnQgZnJvbSBhICJmYXN0IiBmcmVxdWVuY3kg LSBJREVUQVBFX0RTQ19NQV9GQVNUCiAqICgxIHNlY29uZCksIGFuZCBpZiB3ZSBkb24ndCByZWNl aXZlIERTQyBhZnRlciBJREVUQVBFX0RTQ19NQV9USFJFU0hPTEQKICogKDUgbWluKSwgd2Ugc3dp dGNoIGl0IHRvIGEgbG93ZXIgZnJlcXVlbmN5IC0gSURFVEFQRV9EU0NfTUFfU0xPVyAoMSBtaW4p LgogKgogKiBXZSBhbHNvIHNldCBhIHRpbWVvdXQgZm9yIHRoZSB0aW1lciwgaW4gY2FzZSBzb21l dGhpbmcgZ29lcyB3cm9uZy4gVGhlCiAqIHRpbWVvdXQgc2hvdWxkIGJlIGxvbmdlciB0aGVuIHRo ZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgdGFwZSBvcGVyYXRpb24uCiAqLwoKLyogRFND IHRpbWluZ3MuICovCiNkZWZpbmUgSURFVEFQRV9EU0NfUldfTUlOCQk1KkhaLzEwMAkvKiA1MCBt c2VjICovCiNkZWZpbmUgSURFVEFQRV9EU0NfUldfTUFYCQk0MCpIWi8xMDAJLyogNDAwIG1zZWMg Ki8KI2RlZmluZSBJREVUQVBFX0RTQ19SV19USU1FT1VUCQkyKjYwKkhaCQkvKiAyIG1pbnV0ZXMg Ki8KI2RlZmluZSBJREVUQVBFX0RTQ19NQV9GQVNUCQkyKkhaCQkvKiAyIHNlY29uZHMgKi8KI2Rl ZmluZSBJREVUQVBFX0RTQ19NQV9USFJFU0hPTEQJNSo2MCpIWgkJLyogNSBtaW51dGVzICovCiNk ZWZpbmUgSURFVEFQRV9EU0NfTUFfU0xPVwkJMzAqSFoJCS8qIDMwIHNlY29uZHMgKi8KI2RlZmlu ZSBJREVUQVBFX0RTQ19NQV9USU1FT1VUCQkyKjYwKjYwKkhaCS8qIDIgaG91cnMgKi8KCi8qKioq KioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIHR1bmFibGUgcGFyYW1ldGVycyAqKioqKioq KioqKioqKioqKioqKioqKi8KCi8qIHRhcGUgZGlyZWN0aW9ucyAqLwplbnVtIHsKCUlERVRBUEVf RElSX05PTkUgID0gKDEgPDwgMCksCglJREVUQVBFX0RJUl9SRUFEICA9ICgxIDw8IDEpLAoJSURF VEFQRV9ESVJfV1JJVEUgPSAoMSA8PCAyKSwKfTsKCnN0cnVjdCBpZGV0YXBlX2JoIHsKCXUzMiBi X3NpemU7CglhdG9taWNfdCBiX2NvdW50OwoJc3RydWN0IGlkZXRhcGVfYmggKmJfcmVxbmV4dDsK CWNoYXIgKmJfZGF0YTsKfTsKCi8qIFRhcGUgZG9vciBzdGF0dXMgKi8KI2RlZmluZSBET09SX1VO TE9DS0VECQkJMAojZGVmaW5lIERPT1JfTE9DS0VECQkJMQojZGVmaW5lIERPT1JfRVhQTElDSVRM WV9MT0NLRUQJCTIKCi8qIFNvbWUgZGVmaW5lcyBmb3IgdGhlIFNQQUNFIGNvbW1hbmQgKi8KI2Rl ZmluZSBJREVUQVBFX1NQQUNFX09WRVJfRklMRU1BUksJMQojZGVmaW5lIElERVRBUEVfU1BBQ0Vf VE9fRU9ECQkzCgovKiBTb21lIGRlZmluZXMgZm9yIHRoZSBMT0FEIFVOTE9BRCBjb21tYW5kICov CiNkZWZpbmUgSURFVEFQRV9MVV9MT0FEX01BU0sJCTEKI2RlZmluZSBJREVUQVBFX0xVX1JFVEVO U0lPTl9NQVNLCTIKI2RlZmluZSBJREVUQVBFX0xVX0VPVF9NQVNLCQk0CgovKiBFcnJvciBjb2Rl cyByZXR1cm5lZCBpbiBycS0+ZXJyb3JzIHRvIHRoZSBoaWdoZXIgcGFydCBvZiB0aGUgZHJpdmVy LiAqLwojZGVmaW5lIElERVRBUEVfRVJST1JfR0VORVJBTAkJMTAxCiNkZWZpbmUgSURFVEFQRV9F UlJPUl9GSUxFTUFSSwkJMTAyCiNkZWZpbmUgSURFVEFQRV9FUlJPUl9FT0QJCTEwMwoKLyogU3Ry dWN0dXJlcyByZWxhdGVkIHRvIHRoZSBTRUxFQ1QgU0VOU0UgLyBNT0RFIFNFTlNFIHBhY2tldCBj b21tYW5kcy4gKi8KI2RlZmluZSBJREVUQVBFX0JMT0NLX0RFU0NSSVBUT1IJMAojZGVmaW5lIElE RVRBUEVfQ0FQQUJJTElUSUVTX1BBR0UJMHgyYQoKLyoKICogTW9zdCBvZiBvdXIgZ2xvYmFsIGRh dGEgd2hpY2ggd2UgbmVlZCB0byBzYXZlIGV2ZW4gYXMgd2UgbGVhdmUgdGhlIGRyaXZlciBkdWUK ICogdG8gYW4gaW50ZXJydXB0IG9yIGEgdGltZXIgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBzdHJ1 Y3QgZGVmaW5lZCBiZWxvdy4KICovCnR5cGVkZWYgc3RydWN0IGlkZV90YXBlX29iaiB7CglpZGVf ZHJpdmVfdAkqZHJpdmU7CglpZGVfZHJpdmVyX3QJKmRyaXZlcjsKCXN0cnVjdCBnZW5kaXNrCSpk aXNrOwoJc3RydWN0IGtyZWYJa3JlZjsKCgkvKgoJICoJZmFpbGVkX3BjIHBvaW50cyB0byB0aGUg bGFzdCBmYWlsZWQgcGFja2V0IGNvbW1hbmQsIG9yIGNvbnRhaW5zCgkgKglOVUxMIGlmIHdlIGRv IG5vdCBuZWVkIHRvIHJldHJ5IGFueSBwYWNrZXQgY29tbWFuZC4gVGhpcyBpcwoJICoJcmVxdWly ZWQgc2luY2UgYW4gYWRkaXRpb25hbCBwYWNrZXQgY29tbWFuZCBpcyBuZWVkZWQgYmVmb3JlIHRo ZQoJICoJcmV0cnksIHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHdlbnQgd3Jv bmcuCgkgKi8KCS8qIExhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kICovCglzdHJ1Y3QgaWRlX2F0 YXBpX3BjICpmYWlsZWRfcGM7CgkvKiB1c2VkIGJ5IFJFUV9JREVUQVBFX3tSRUFELFdSSVRFfSBy ZXF1ZXN0cyAqLwoJc3RydWN0IGlkZV9hdGFwaV9wYyBxdWV1ZWRfcGM7CgoJLyoKCSAqIERTQyBw b2xsaW5nIHZhcmlhYmxlcy4KCSAqCgkgKiBXaGlsZSBwb2xsaW5nIGZvciBEU0Mgd2UgdXNlIHBv c3Rwb25lZF9ycSB0byBwb3N0cG9uZSB0aGUgY3VycmVudAoJICogcmVxdWVzdCBzbyB0aGF0IGlk ZS5jIHdpbGwgYmUgYWJsZSB0byBzZXJ2aWNlIHBlbmRpbmcgcmVxdWVzdHMgb24gdGhlCgkgKiBv dGhlciBkZXZpY2UuIE5vdGUgdGhhdCBhdCBtb3N0IHdlIHdpbGwgaGF2ZSBvbmx5IG9uZSBEU0Mg KHVzdWFsbHkKCSAqIGRhdGEgdHJhbnNmZXIpIHJlcXVlc3QgaW4gdGhlIGRldmljZSByZXF1ZXN0 IHF1ZXVlLgoJICovCglzdHJ1Y3QgcmVxdWVzdCAqcG9zdHBvbmVkX3JxOwoJLyogVGhlIHRpbWUg aW4gd2hpY2ggd2Ugc3RhcnRlZCBwb2xsaW5nIGZvciBEU0MgKi8KCXVuc2lnbmVkIGxvbmcgZHNj X3BvbGxpbmdfc3RhcnQ7CgkvKiBUaW1lciB1c2VkIHRvIHBvbGwgZm9yIGRzYyAqLwoJc3RydWN0 IHRpbWVyX2xpc3QgZHNjX3RpbWVyOwoJLyogUmVhZC9Xcml0ZSBkc2MgcG9sbGluZyBmcmVxdWVu Y3kgKi8KCXVuc2lnbmVkIGxvbmcgYmVzdF9kc2NfcndfZnJlcTsKCXVuc2lnbmVkIGxvbmcgZHNj X3BvbGxfZnJlcTsKCXVuc2lnbmVkIGxvbmcgZHNjX3RpbWVvdXQ7CgoJLyogUmVhZCBwb3NpdGlv biBpbmZvcm1hdGlvbiAqLwoJdTggcGFydGl0aW9uOwoJLyogQ3VycmVudCBibG9jayAqLwoJdW5z aWduZWQgaW50IGZpcnN0X2ZyYW1lOwoKCS8qIExhc3QgZXJyb3IgaW5mb3JtYXRpb24gKi8KCXU4 IHNlbnNlX2tleSwgYXNjLCBhc2NxOwoKCS8qIENoYXJhY3RlciBkZXZpY2Ugb3BlcmF0aW9uICov Cgl1bnNpZ25lZCBpbnQgbWlub3I7CgkvKiBkZXZpY2UgbmFtZSAqLwoJY2hhciBuYW1lWzRdOwoJ LyogQ3VycmVudCBjaGFyYWN0ZXIgZGV2aWNlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICovCgl1 OCBjaHJkZXZfZGlyOwoKCS8qIHRhcGUgYmxvY2sgc2l6ZSwgdXN1YWxseSA1MTIgb3IgMTAyNCBi eXRlcyAqLwoJdW5zaWduZWQgc2hvcnQgYmxrX3NpemU7CglpbnQgdXNlcl9ic19mYWN0b3I7CgoJ LyogQ29weSBvZiB0aGUgdGFwZSdzIENhcGFiaWxpdGllcyBhbmQgTWVjaGFuaWNhbCBQYWdlICov Cgl1OCBjYXBzWzIwXTsKCgkvKgoJICogQWN0aXZlIGRhdGEgdHJhbnNmZXIgcmVxdWVzdCBwYXJh bWV0ZXJzLgoJICoKCSAqIEF0IG1vc3QsIHRoZXJlIGlzIG9ubHkgb25lIGlkZS10YXBlIG9yaWdp bmF0ZWQgZGF0YSB0cmFuc2ZlciByZXF1ZXN0CgkgKiBpbiB0aGUgZGV2aWNlIHJlcXVlc3QgcXVl dWUuIFRoaXMgYWxsb3dzIGlkZS5jIHRvIGVhc2lseSBzZXJ2aWNlCgkgKiByZXF1ZXN0cyBmcm9t IHRoZSBvdGhlciBkZXZpY2Ugd2hlbiB3ZSBwb3N0cG9uZSBvdXIgYWN0aXZlIHJlcXVlc3QuCgkg Ki8KCgkvKiBEYXRhIGJ1ZmZlciBzaXplIGNob3NlbiBiYXNlZCBvbiB0aGUgdGFwZSdzIHJlY29t bWVuZGF0aW9uICovCglpbnQgYnVmZmVyX3NpemU7CgkvKiBtZXJnZSBidWZmZXIgKi8KCXN0cnVj dCBpZGV0YXBlX2JoICptZXJnZV9iaDsKCS8qIHNpemUgb2YgdGhlIG1lcmdlIGJ1ZmZlciAqLwoJ aW50IG1lcmdlX2JoX3NpemU7CgkvKiBwb2ludGVyIHRvIGN1cnJlbnQgYnVmZmVyIGhlYWQgd2l0 aGluIHRoZSBtZXJnZSBidWZmZXIgKi8KCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsKCWNoYXIgKmJf ZGF0YTsKCWludCBiX2NvdW50OwoKCWludCBwYWdlc19wZXJfYnVmZmVyOwoJLyogV2FzdGVkIHNw YWNlIGluIGVhY2ggc3RhZ2UgKi8KCWludCBleGNlc3NfYmhfc2l6ZTsKCgkvKiBwcm90ZWN0cyB0 aGUgaWRlLXRhcGUgcXVldWUgKi8KCXNwaW5sb2NrX3QgbG9jazsKCgkvKiBNZWFzdXJlcyBhdmVy YWdlIHRhcGUgc3BlZWQgKi8KCXVuc2lnbmVkIGxvbmcgYXZnX3RpbWU7CglpbnQgYXZnX3NpemU7 CglpbnQgYXZnX3NwZWVkOwoKCS8qIHRoZSBkb29yIGlzIGN1cnJlbnRseSBsb2NrZWQgKi8KCWlu dCBkb29yX2xvY2tlZDsKCS8qIHRoZSB0YXBlIGhhcmR3YXJlIGlzIHdyaXRlIHByb3RlY3RlZCAq LwoJY2hhciBkcnZfd3JpdGVfcHJvdDsKCS8qIHRoZSB0YXBlIGlzIHdyaXRlIHByb3RlY3RlZCAo aGFyZHdhcmUgb3Igb3BlbmVkIGFzIHJlYWQtb25seSkgKi8KCWNoYXIgd3JpdGVfcHJvdDsKCgl1 MzIgZGVidWdfbWFzazsKfSBpZGV0YXBlX3RhcGVfdDsKCnN0YXRpYyBERUZJTkVfTVVURVgoaWRl dGFwZV9yZWZfbXV0ZXgpOwoKc3RhdGljIHN0cnVjdCBjbGFzcyAqaWRldGFwZV9zeXNmc19jbGFz czsKCnN0YXRpYyB2b2lkIGlkZV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKik7CgpzdGF0aWMg c3RydWN0IGlkZV90YXBlX29iaiAqaWRlX3RhcGVfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQp7 CglzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gTlVMTDsKCgltdXRleF9sb2NrKCZpZGV0YXBl X3JlZl9tdXRleCk7Cgl0YXBlID0gaWRlX2Rydl9nKGRpc2ssIGlkZV90YXBlX29iaik7CglpZiAo dGFwZSkgewoJCWlmIChpZGVfZGV2aWNlX2dldCh0YXBlLT5kcml2ZSkpCgkJCXRhcGUgPSBOVUxM OwoJCWVsc2UKCQkJa3JlZl9nZXQoJnRhcGUtPmtyZWYpOwoJfQoJbXV0ZXhfdW5sb2NrKCZpZGV0 YXBlX3JlZl9tdXRleCk7CglyZXR1cm4gdGFwZTsKfQoKc3RhdGljIHZvaWQgaWRlX3RhcGVfcHV0 KHN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUpCnsKCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUt PmRyaXZlOwoKCW11dGV4X2xvY2soJmlkZXRhcGVfcmVmX211dGV4KTsKCWtyZWZfcHV0KCZ0YXBl LT5rcmVmLCBpZGVfdGFwZV9yZWxlYXNlKTsKCWlkZV9kZXZpY2VfcHV0KGRyaXZlKTsKCW11dGV4 X3VubG9jaygmaWRldGFwZV9yZWZfbXV0ZXgpOwp9CgovKgogKiBUaGUgdmFyaWFibGVzIGJlbG93 IGFyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UuIEFkZGl0aW9uYWwK ICogc3RhdGUgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG91ciBpZGVfZHJpdmVfdCBzdHJ1Y3R1 cmUuCiAqLwpzdGF0aWMgc3RydWN0IGlkZV90YXBlX29iaiAqaWRldGFwZV9kZXZzW01BWF9IV0lG UyAqIE1BWF9EUklWRVNdOwoKc3RhdGljIHN0cnVjdCBpZGVfdGFwZV9vYmogKmlkZV90YXBlX2No cmRldl9nZXQodW5zaWduZWQgaW50IGkpCnsKCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBO VUxMOwoKCW11dGV4X2xvY2soJmlkZXRhcGVfcmVmX211dGV4KTsKCXRhcGUgPSBpZGV0YXBlX2Rl dnNbaV07CglpZiAodGFwZSkKCQlrcmVmX2dldCgmdGFwZS0+a3JlZik7CgltdXRleF91bmxvY2so JmlkZXRhcGVfcmVmX211dGV4KTsKCXJldHVybiB0YXBlOwp9CgpzdGF0aWMgdm9pZCBpZGV0YXBl X2lucHV0X2J1ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpw YywKCQkJCSAgdW5zaWduZWQgaW50IGJjb3VudCkKewoJc3RydWN0IGlkZXRhcGVfYmggKmJoID0g cGMtPmJoOwoJaW50IGNvdW50OwoKCXdoaWxlIChiY291bnQpIHsKCQlpZiAoYmggPT0gTlVMTCkg ewoJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICIKCQkJCSJpZGV0 YXBlX2lucHV0X2J1ZmZlcnNcbiIpOwoJCQlpZGVfcGFkX3RyYW5zZmVyKGRyaXZlLCAwLCBiY291 bnQpOwoJCQlyZXR1cm47CgkJfQoJCWNvdW50ID0gbWluKAoJCQkodW5zaWduZWQgaW50KShiaC0+ Yl9zaXplIC0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSksCgkJCWJjb3VudCk7CgkJZHJpdmUt Pmh3aWYtPnRwX29wcy0+aW5wdXRfZGF0YShkcml2ZSwgTlVMTCwgYmgtPmJfZGF0YSArCgkJCQkJ YXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSwgY291bnQpOwoJCWJjb3VudCAtPSBjb3VudDsKCQlh dG9taWNfYWRkKGNvdW50LCAmYmgtPmJfY291bnQpOwoJCWlmIChhdG9taWNfcmVhZCgmYmgtPmJf Y291bnQpID09IGJoLT5iX3NpemUpIHsKCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwoJCQlpZiAoYmgp CgkJCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgMCk7CgkJfQoJfQoJcGMtPmJoID0gYmg7Cn0K CnN0YXRpYyB2b2lkIGlkZXRhcGVfb3V0cHV0X2J1ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLCBz dHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKCQkJCSAgIHVuc2lnbmVkIGludCBiY291bnQpCnsKCXN0 cnVjdCBpZGV0YXBlX2JoICpiaCA9IHBjLT5iaDsKCWludCBjb3VudDsKCgl3aGlsZSAoYmNvdW50 KSB7CgkJaWYgKGJoID09IE5VTEwpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYmgg PT0gTlVMTCBpbiAlc1xuIiwKCQkJCQlfX2Z1bmNfXyk7CgkJCXJldHVybjsKCQl9CgkJY291bnQg PSBtaW4oKHVuc2lnbmVkIGludClwYy0+Yl9jb3VudCwgKHVuc2lnbmVkIGludCliY291bnQpOwoJ CWRyaXZlLT5od2lmLT50cF9vcHMtPm91dHB1dF9kYXRhKGRyaXZlLCBOVUxMLCBwYy0+Yl9kYXRh LCBjb3VudCk7CgkJYmNvdW50IC09IGNvdW50OwoJCXBjLT5iX2RhdGEgKz0gY291bnQ7CgkJcGMt PmJfY291bnQgLT0gY291bnQ7CgkJaWYgKCFwYy0+Yl9jb3VudCkgewoJCQliaCA9IGJoLT5iX3Jl cW5leHQ7CgkJCXBjLT5iaCA9IGJoOwoJCQlpZiAoYmgpIHsKCQkJCXBjLT5iX2RhdGEgPSBiaC0+ Yl9kYXRhOwoJCQkJcGMtPmJfY291bnQgPSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpOwoJCQl9 CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBpZGV0YXBlX3VwZGF0ZV9idWZmZXJzKGlkZV9kcml2ZV90 ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCnsKCXN0cnVjdCBpZGV0YXBlX2JoICpi aCA9IHBjLT5iaDsKCWludCBjb3VudDsKCXVuc2lnbmVkIGludCBiY291bnQgPSBwYy0+eGZlcnJl ZDsKCglpZiAocGMtPmZsYWdzICYgUENfRkxBR19XUklUSU5HKQoJCXJldHVybjsKCXdoaWxlIChi Y291bnQpIHsKCQlpZiAoYmggPT0gTlVMTCkgewoJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBl OiBiaCA9PSBOVUxMIGluICVzXG4iLAoJCQkJCV9fZnVuY19fKTsKCQkJcmV0dXJuOwoJCX0KCQlj b3VudCA9IG1pbigodW5zaWduZWQgaW50KWJoLT5iX3NpemUsICh1bnNpZ25lZCBpbnQpYmNvdW50 KTsKCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgY291bnQpOwoJCWlmIChhdG9taWNfcmVhZCgm YmgtPmJfY291bnQpID09IGJoLT5iX3NpemUpCgkJCWJoID0gYmgtPmJfcmVxbmV4dDsKCQliY291 bnQgLT0gY291bnQ7Cgl9CglwYy0+YmggPSBiaDsKfQoKLyoKICogY2FsbGVkIG9uIGVhY2ggZmFp bGVkIHBhY2tldCBjb21tYW5kIHJldHJ5IHRvIGFuYWx5emUgdGhlIHJlcXVlc3Qgc2Vuc2UuIFdl CiAqIGN1cnJlbnRseSBkbyBub3QgdXRpbGl6ZSB0aGlzIGluZm9ybWF0aW9uLgogKi8Kc3RhdGlj IHZvaWQgaWRldGFwZV9hbmFseXplX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggKnNlbnNl KQp7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBp ZGVfYXRhcGlfcGMgKnBjID0gdGFwZS0+ZmFpbGVkX3BjOwoKCXRhcGUtPnNlbnNlX2tleSA9IHNl bnNlWzJdICYgMHhGOwoJdGFwZS0+YXNjICAgICAgID0gc2Vuc2VbMTJdOwoJdGFwZS0+YXNjcSAg ICAgID0gc2Vuc2VbMTNdOwoKCWRlYnVnX2xvZyhEQkdfRVJSLCAicGMgPSAleCwgc2Vuc2Uga2V5 ID0gJXgsIGFzYyA9ICV4LCBhc2NxID0gJXhcbiIsCgkJIHBjLT5jWzBdLCB0YXBlLT5zZW5zZV9r ZXksIHRhcGUtPmFzYywgdGFwZS0+YXNjcSk7CgoJLyogQ29ycmVjdCBwYy0+eGZlcnJlZCBieSBh c2tpbmcgdGhlIHRhcGUuCSAqLwoJaWYgKHBjLT5mbGFncyAmIFBDX0ZMQUdfRE1BX0VSUk9SKSB7 CgkJcGMtPnhmZXJyZWQgPSBwYy0+cmVxX3hmZXIgLQoJCQl0YXBlLT5ibGtfc2l6ZSAqCgkJCWdl dF91bmFsaWduZWRfYmUzMigmc2Vuc2VbM10pOwoJCWlkZXRhcGVfdXBkYXRlX2J1ZmZlcnMoZHJp dmUsIHBjKTsKCX0KCgkvKgoJICogSWYgZXJyb3Igd2FzIHRoZSByZXN1bHQgb2YgYSB6ZXJvLWxl bmd0aCByZWFkIG9yIHdyaXRlIGNvbW1hbmQsCgkgKiB3aXRoIHNlbnNlIGtleT01LCBhc2M9MHgy MiwgYXNjcT0wLCBsZXQgaXQgc2xpZGUuICBTb21lIGRyaXZlcwoJICogKGkuZS4gU2VhZ2F0ZSBT VFQzNDAxQSBUcmF2YW4pIGRvbid0IHN1cHBvcnQgMC1sZW5ndGggcmVhZC93cml0ZXMuCgkgKi8K CWlmICgocGMtPmNbMF0gPT0gUkVBRF82IHx8IHBjLT5jWzBdID09IFdSSVRFXzYpCgkgICAgLyog bGVuZ3RoID09IDAgKi8KCSAgICAmJiBwYy0+Y1s0XSA9PSAwICYmIHBjLT5jWzNdID09IDAgJiYg cGMtPmNbMl0gPT0gMCkgewoJCWlmICh0YXBlLT5zZW5zZV9rZXkgPT0gNSkgewoJCQkvKiBkb24n dCByZXBvcnQgYW4gZXJyb3IsIGV2ZXJ5dGhpbmcncyBvayAqLwoJCQlwYy0+ZXJyb3IgPSAwOwoJ CQkvKiBkb24ndCByZXRyeSByZWFkL3dyaXRlICovCgkJCXBjLT5mbGFncyB8PSBQQ19GTEFHX0FC T1JUOwoJCX0KCX0KCWlmIChwYy0+Y1swXSA9PSBSRUFEXzYgJiYgKHNlbnNlWzJdICYgMHg4MCkp IHsKCQlwYy0+ZXJyb3IgPSBJREVUQVBFX0VSUk9SX0ZJTEVNQVJLOwoJCXBjLT5mbGFncyB8PSBQ Q19GTEFHX0FCT1JUOwoJfQoJaWYgKHBjLT5jWzBdID09IFdSSVRFXzYpIHsKCQlpZiAoKHNlbnNl WzJdICYgMHg0MCkgfHwgKHRhcGUtPnNlbnNlX2tleSA9PSAweGQKCQkgICAgICYmIHRhcGUtPmFz YyA9PSAweDAgJiYgdGFwZS0+YXNjcSA9PSAweDIpKSB7CgkJCXBjLT5lcnJvciA9IElERVRBUEVf RVJST1JfRU9EOwoJCQlwYy0+ZmxhZ3MgfD0gUENfRkxBR19BQk9SVDsKCQl9Cgl9CglpZiAocGMt PmNbMF0gPT0gUkVBRF82IHx8IHBjLT5jWzBdID09IFdSSVRFXzYpIHsKCQlpZiAodGFwZS0+c2Vu c2Vfa2V5ID09IDgpIHsKCQkJcGMtPmVycm9yID0gSURFVEFQRV9FUlJPUl9FT0Q7CgkJCXBjLT5m bGFncyB8PSBQQ19GTEFHX0FCT1JUOwoJCX0KCQlpZiAoIShwYy0+ZmxhZ3MgJiBQQ19GTEFHX0FC T1JUKSAmJgoJCSAgICBwYy0+eGZlcnJlZCkKCQkJcGMtPnJldHJpZXMgPSBJREVUQVBFX01BWF9Q Q19SRVRSSUVTICsgMTsKCX0KfQoKLyogRnJlZSBkYXRhIGJ1ZmZlcnMgY29tcGxldGVseS4gKi8K c3RhdGljIHZvaWQgaWRlX3RhcGVfa2ZyZWVfYnVmZmVyKGlkZXRhcGVfdGFwZV90ICp0YXBlKQp7 CglzdHJ1Y3QgaWRldGFwZV9iaCAqcHJldl9iaCwgKmJoID0gdGFwZS0+bWVyZ2VfYmg7CgoJd2hp bGUgKGJoKSB7CgkJdTMyIHNpemUgPSBiaC0+Yl9zaXplOwoKCQl3aGlsZSAoc2l6ZSkgewoJCQl1 bnNpZ25lZCBpbnQgb3JkZXIgPSBmbHMoc2l6ZSA+PiBQQUdFX1NISUZUKS0xOwoKCQkJaWYgKGJo LT5iX2RhdGEpCgkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWJoLT5iX2RhdGEsIG9yZGVy KTsKCgkJCXNpemUgJj0gKG9yZGVyLTEpOwoJCQliaC0+Yl9kYXRhICs9ICgxIDw8IG9yZGVyKSAq IFBBR0VfU0laRTsKCQl9CgkJcHJldl9iaCA9IGJoOwoJCWJoID0gYmgtPmJfcmVxbmV4dDsKCQlr ZnJlZShwcmV2X2JoKTsKCX0KfQoKc3RhdGljIGludCBpZGV0YXBlX2VuZF9yZXF1ZXN0KGlkZV9k cml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdHMpCnsKCXN0cnVjdCByZXF1 ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJp dmUtPmRyaXZlcl9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBlcnJvcjsKCglkZWJ1 Z19sb2coREJHX1BST0NTLCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKCglzd2l0Y2ggKHVwdG9k YXRlKSB7CgljYXNlIDA6CWVycm9yID0gSURFVEFQRV9FUlJPUl9HRU5FUkFMOyBicmVhazsKCWNh c2UgMTogZXJyb3IgPSAwOyBicmVhazsKCWRlZmF1bHQ6IGVycm9yID0gdXB0b2RhdGU7Cgl9Cgly cS0+ZXJyb3JzID0gZXJyb3I7CglpZiAoZXJyb3IpCgkJdGFwZS0+ZmFpbGVkX3BjID0gTlVMTDsK CglpZiAoIWJsa19zcGVjaWFsX3JlcXVlc3QocnEpKSB7CgkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZl LCB1cHRvZGF0ZSwgbnJfc2VjdHMpOwoJCXJldHVybiAwOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZl KCZ0YXBlLT5sb2NrLCBmbGFncyk7CgoJaWRlX2VuZF9kcml2ZV9jbWQoZHJpdmUsIDAsIDApOwoK CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcGUtPmxvY2ssIGZsYWdzKTsKCXJldHVybiAwOwp9 CgpzdGF0aWMgdm9pZCBpZGVfdGFwZV9oYW5kbGVfZHNjKGlkZV9kcml2ZV90ICopOwoKc3RhdGlj IHZvaWQgaWRlX3RhcGVfY2FsbGJhY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZHNjKQp7Cglp ZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRh cGlfcGMgKnBjID0gZHJpdmUtPnBjOwoJaW50IHVwdG9kYXRlID0gcGMtPmVycm9yID8gMCA6IDE7 CgoJZGVidWdfbG9nKERCR19QUk9DUywgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CgoJaWYgKGRz YykKCQlpZGVfdGFwZV9oYW5kbGVfZHNjKGRyaXZlKTsKCglpZiAodGFwZS0+ZmFpbGVkX3BjID09 IHBjKQoJCXRhcGUtPmZhaWxlZF9wYyA9IE5VTEw7CgoJaWYgKHBjLT5jWzBdID09IFJFUVVFU1Rf U0VOU0UpIHsKCQlpZiAodXB0b2RhdGUpCgkJCWlkZXRhcGVfYW5hbHl6ZV9lcnJvcihkcml2ZSwg cGMtPmJ1Zik7CgkJZWxzZQoJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBFcnJvciBpbiBS RVFVRVNUIFNFTlNFICIKCQkJCQkiaXRzZWxmIC0gQWJvcnRpbmcgcmVxdWVzdCFcbiIpOwoJfSBl bHNlIGlmIChwYy0+Y1swXSA9PSBSRUFEXzYgfHwgcGMtPmNbMF0gPT0gV1JJVEVfNikgewoJCXN0 cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKCQlpbnQgYmxvY2tz ID0gcGMtPnhmZXJyZWQgLyB0YXBlLT5ibGtfc2l6ZTsKCgkJdGFwZS0+YXZnX3NpemUgKz0gYmxv Y2tzICogdGFwZS0+YmxrX3NpemU7CgoJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRhcGUt PmF2Z190aW1lICsgSFopKSB7CgkJCXRhcGUtPmF2Z19zcGVlZCA9IHRhcGUtPmF2Z19zaXplICog SFogLwoJCQkJKGppZmZpZXMgLSB0YXBlLT5hdmdfdGltZSkgLyAxMDI0OwoJCQl0YXBlLT5hdmdf c2l6ZSA9IDA7CgkJCXRhcGUtPmF2Z190aW1lID0gamlmZmllczsKCQl9CgoJCXRhcGUtPmZpcnN0 X2ZyYW1lICs9IGJsb2NrczsKCQlycS0+Y3VycmVudF9ucl9zZWN0b3JzIC09IGJsb2NrczsKCgkJ aWYgKHBjLT5lcnJvcikKCQkJdXB0b2RhdGUgPSBwYy0+ZXJyb3I7Cgl9IGVsc2UgaWYgKHBjLT5j WzBdID09IFJFQURfUE9TSVRJT04gJiYgdXB0b2RhdGUpIHsKCQl1OCAqcmVhZHBvcyA9IHBjLT5i dWY7CgoJCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJCT1AgLSAlc1xuIiwKCQkJCShyZWFkcG9zWzBd ICYgMHg4MCkgPyAiWWVzIiA6ICJObyIpOwoJCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJFT1AgLSAl c1xuIiwKCQkJCShyZWFkcG9zWzBdICYgMHg0MCkgPyAiWWVzIiA6ICJObyIpOwoKCQlpZiAocmVh ZHBvc1swXSAmIDB4NCkgewoJCQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogQmxvY2sgbG9j YXRpb24gaXMgdW5rbm93biIKCQkJCQkgInRvIHRoZSB0YXBlXG4iKTsKCQkJY2xlYXJfYml0KElE RV9BRkxBR19BRERSRVNTX1ZBTElELCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCQkJdXB0b2RhdGUg PSAwOwoJCX0gZWxzZSB7CgkJCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJCbG9jayBMb2NhdGlvbiAt ICV1XG4iLAoJCQkJCWJlMzJfdG9fY3B1cCgoX19iZTMyICopJnJlYWRwb3NbNF0pKTsKCgkJCXRh cGUtPnBhcnRpdGlvbiA9IHJlYWRwb3NbMV07CgkJCXRhcGUtPmZpcnN0X2ZyYW1lID0gYmUzMl90 b19jcHVwKChfX2JlMzIgKikmcmVhZHBvc1s0XSk7CgkJCXNldF9iaXQoSURFX0FGTEFHX0FERFJF U1NfVkFMSUQsICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwoJCX0KCX0KCglpZGV0YXBlX2VuZF9yZXF1 ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgMCk7Cn0KCi8qCiAqIFBvc3Rwb25lIHRoZSBjdXJyZW50IHJl cXVlc3Qgc28gdGhhdCBpZGUuYyB3aWxsIGJlIGFibGUgdG8gc2VydmljZSByZXF1ZXN0cwogKiBm cm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIGh3Z3JvdXAgd2hpbGUgd2UgYXJlIHBvbGxp bmcgZm9yIERTQy4KICovCnN0YXRpYyB2b2lkIGlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdChpZGVf ZHJpdmVfdCAqZHJpdmUpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9k YXRhOwoKCWRlYnVnX2xvZyhEQkdfUFJPQ1MsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOwoKCXRh cGUtPnBvc3Rwb25lZF9ycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKCWlkZV9zdGFsbF9xdWV1ZShk cml2ZSwgdGFwZS0+ZHNjX3BvbGxfZnJlcSk7Cn0KCnN0YXRpYyB2b2lkIGlkZV90YXBlX2hhbmRs ZV9kc2MoaWRlX2RyaXZlX3QgKmRyaXZlKQp7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZl LT5kcml2ZXJfZGF0YTsKCgkvKiBNZWRpYSBhY2Nlc3MgY29tbWFuZCAqLwoJdGFwZS0+ZHNjX3Bv bGxpbmdfc3RhcnQgPSBqaWZmaWVzOwoJdGFwZS0+ZHNjX3BvbGxfZnJlcSA9IElERVRBUEVfRFND X01BX0ZBU1Q7Cgl0YXBlLT5kc2NfdGltZW91dCA9IGppZmZpZXMgKyBJREVUQVBFX0RTQ19NQV9U SU1FT1VUOwoJLyogQWxsb3cgaWRlLmMgdG8gaGFuZGxlIG90aGVyIHJlcXVlc3RzICovCglpZGV0 YXBlX3Bvc3Rwb25lX3JlcXVlc3QoZHJpdmUpOwp9CgpzdGF0aWMgaW50IGlkZV90YXBlX2lvX2J1 ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKCQkJCXVu c2lnbmVkIGludCBiY291bnQsIGludCB3cml0ZSkKewoJaWYgKHdyaXRlKQoJCWlkZXRhcGVfb3V0 cHV0X2J1ZmZlcnMoZHJpdmUsIHBjLCBiY291bnQpOwoJZWxzZQoJCWlkZXRhcGVfaW5wdXRfYnVm ZmVycyhkcml2ZSwgcGMsIGJjb3VudCk7CgoJcmV0dXJuIGJjb3VudDsKfQoKLyoKICogUGFja2V0 IENvbW1hbmQgSW50ZXJmYWNlCiAqCiAqIFRoZSBjdXJyZW50IFBhY2tldCBDb21tYW5kIGlzIGF2 YWlsYWJsZSBpbiBkcml2ZS0+cGMsIGFuZCB3aWxsIG5vdCBjaGFuZ2UKICogdW50aWwgd2UgZmlu aXNoIGhhbmRsaW5nIGl0LiBFYWNoIHBhY2tldCBjb21tYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBh CiAqIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tbWFu ZCBpcyBmaW5pc2hlZC4KICoKICogVGhlIGhhbmRsaW5nIHdpbGwgYmUgZG9uZSBpbiB0aHJlZSBz dGFnZXM6CiAqCiAqIDEuIGlkZXRhcGVfaXNzdWVfcGMgd2lsbCBzZW5kIHRoZSBwYWNrZXQgY29t bWFuZCB0byB0aGUgZHJpdmUsIGFuZCB3aWxsIHNldAogKiB0aGUgaW50ZXJydXB0IGhhbmRsZXIg dG8gaWRlX3BjX2ludHIuCiAqCiAqIDIuIE9uIGVhY2ggaW50ZXJydXB0LCBpZGVfcGNfaW50ciB3 aWxsIGJlIGNhbGxlZC4gVGhpcyBzdGVwIHdpbGwgYmUKICogcmVwZWF0ZWQgdW50aWwgdGhlIGRl dmljZSBzaWduYWxzIHVzIHRoYXQgbm8gbW9yZSBpbnRlcnJ1cHRzIHdpbGwgYmUgaXNzdWVkLgog KgogKiAzLiBBVEFQSSBUYXBlIG1lZGlhIGFjY2VzcyBjb21tYW5kcyBoYXZlIGltbWVkaWF0ZSBz dGF0dXMgd2l0aCBhIGRlbGF5ZWQKICogcHJvY2Vzcy4gSW4gY2FzZSBvZiBhIHN1Y2Nlc3NmdWwg aW5pdGlhdGlvbiBvZiBhIG1lZGlhIGFjY2VzcyBwYWNrZXQgY29tbWFuZCwKICogdGhlIERTQyBi aXQgd2lsbCBiZSBzZXQgd2hlbiB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZCBp cyBmaW5pc2hlZC4KICogU2luY2UgdGhlIHRhcGUgZHJpdmUgd2lsbCBub3QgaXNzdWUgYW4gaW50 ZXJydXB0LCB3ZSBoYXZlIHRvIHBvbGwgZm9yIHRoaXMKICogZXZlbnQuIEluIHRoaXMgY2FzZSwg d2UgZGVmaW5lIHRoZSByZXF1ZXN0IGFzICJsb3cgcHJpb3JpdHkgcmVxdWVzdCIgYnkKICogc2V0 dGluZyBycV9zdGF0dXMgdG8gSURFVEFQRV9SUV9QT1NUUE9ORUQsIHNldCBhIHRpbWVyIHRvIHBv bGwgZm9yIERTQyBhbmQKICogZXhpdCB0aGUgZHJpdmVyLgogKgogKiBpZGUuYyB3aWxsIHRoZW4g Z2l2ZSBoaWdoZXIgcHJpb3JpdHkgdG8gcmVxdWVzdHMgd2hpY2ggb3JpZ2luYXRlIGZyb20gdGhl CiAqIG90aGVyIGRldmljZSwgdW50aWwgd2lsbCBjaGFuZ2UgcnFfc3RhdHVzIHRvIFJRX0FDVElW RS4KICoKICogNC4gV2hlbiB0aGUgcGFja2V0IGNvbW1hbmQgaXMgZmluaXNoZWQsIGl0IHdpbGwg YmUgY2hlY2tlZCBmb3IgZXJyb3JzLgogKgogKiA1LiBJbiBjYXNlIGFuIGVycm9yIHdhcyBmb3Vu ZCwgd2UgcXVldWUgYSByZXF1ZXN0IHNlbnNlIHBhY2tldCBjb21tYW5kIGluCiAqIGZyb250IG9m IHRoZSByZXF1ZXN0IHF1ZXVlIGFuZCByZXRyeSB0aGUgb3BlcmF0aW9uIHVwIHRvCiAqIElERVRB UEVfTUFYX1BDX1JFVFJJRVMgdGltZXMuCiAqCiAqIDYuIEluIGNhc2Ugbm8gZXJyb3Igd2FzIGZv dW5kLCBvciB3ZSBkZWNpZGVkIHRvIGdpdmUgdXAgYW5kIG5vdCB0byByZXRyeQogKiBhZ2Fpbiwg dGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCB0aGVuIHdlIHdpbGwgaGFu ZGxlIHRoZSBuZXh0CiAqIHJlcXVlc3QuCiAqLwoKc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0 YXBlX2lzc3VlX3BjKGlkZV9kcml2ZV90ICpkcml2ZSwKCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpw YykKewoJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CgoJaWYgKGRy aXZlLT5wYy0+Y1swXSA9PSBSRVFVRVNUX1NFTlNFICYmCgkgICAgcGMtPmNbMF0gPT0gUkVRVUVT VF9TRU5TRSkgewoJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IHBvc3NpYmxlIGlkZS10YXBl LmMgYnVnIC0gIgoJCQkiVHdvIHJlcXVlc3Qgc2Vuc2UgaW4gc2VyaWFsIHdlcmUgaXNzdWVkXG4i KTsKCX0KCglpZiAodGFwZS0+ZmFpbGVkX3BjID09IE5VTEwgJiYgcGMtPmNbMF0gIT0gUkVRVUVT VF9TRU5TRSkKCQl0YXBlLT5mYWlsZWRfcGMgPSBwYzsKCgkvKiBTZXQgdGhlIGN1cnJlbnQgcGFj a2V0IGNvbW1hbmQgKi8KCWRyaXZlLT5wYyA9IHBjOwoKCWlmIChwYy0+cmV0cmllcyA+IElERVRB UEVfTUFYX1BDX1JFVFJJRVMgfHwKCQkocGMtPmZsYWdzICYgUENfRkxBR19BQk9SVCkpIHsKCQkv KgoJCSAqIFdlIHdpbGwgImFib3J0IiByZXRyeWluZyBhIHBhY2tldCBjb21tYW5kIGluIGNhc2Ug bGVnaXRpbWF0ZQoJCSAqIGVycm9yIGNvZGUgd2FzIHJlY2VpdmVkIChjcm9zc2luZyBhIGZpbGVt YXJrLCBvciBlbmQgb2YgdGhlCgkJICogbWVkaWEsIGZvciBleGFtcGxlKS4KCQkgKi8KCQlpZiAo IShwYy0+ZmxhZ3MgJiBQQ19GTEFHX0FCT1JUKSkgewoJCQlpZiAoIShwYy0+Y1swXSA9PSBURVNU X1VOSVRfUkVBRFkgJiYKCQkJICAgICAgdGFwZS0+c2Vuc2Vfa2V5ID09IDIgJiYgdGFwZS0+YXNj ID09IDQgJiYKCQkJICAgICAodGFwZS0+YXNjcSA9PSAxIHx8IHRhcGUtPmFzY3EgPT0gOCkpKSB7 CgkJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogSS9PIGVycm9yLCAiCgkJCQkJCSJw YyA9ICUyeCwga2V5ID0gJTJ4LCAiCgkJCQkJCSJhc2MgPSAlMngsIGFzY3EgPSAlMnhcbiIsCgkJ CQkJCXRhcGUtPm5hbWUsIHBjLT5jWzBdLAoJCQkJCQl0YXBlLT5zZW5zZV9rZXksIHRhcGUtPmFz YywKCQkJCQkJdGFwZS0+YXNjcSk7CgkJCX0KCQkJLyogR2l2aW5nIHVwICovCgkJCXBjLT5lcnJv ciA9IElERVRBUEVfRVJST1JfR0VORVJBTDsKCQl9CgkJdGFwZS0+ZmFpbGVkX3BjID0gTlVMTDsK CQlkcml2ZS0+cGNfY2FsbGJhY2soZHJpdmUsIDApOwoJCXJldHVybiBpZGVfc3RvcHBlZDsKCX0K CWRlYnVnX2xvZyhEQkdfU0VOU0UsICJSZXRyeSAjJWQsIGNtZCA9ICUwMlhcbiIsIHBjLT5yZXRy aWVzLCBwYy0+Y1swXSk7CgoJcGMtPnJldHJpZXMrKzsKCglyZXR1cm4gaWRlX2lzc3VlX3BjKGRy aXZlLCBXQUlUX1RBUEVfQ01ELCBOVUxMKTsKfQoKLyogQSBtb2RlIHNlbnNlIGNvbW1hbmQgaXMg dXNlZCB0byAic2Vuc2UiIHRhcGUgcGFyYW1ldGVycy4gKi8Kc3RhdGljIHZvaWQgaWRldGFwZV9j cmVhdGVfbW9kZV9zZW5zZV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIHU4IHBhZ2VfY29k ZSkKewoJaWRlX2luaXRfcGMocGMpOwoJcGMtPmNbMF0gPSBNT0RFX1NFTlNFOwoJaWYgKHBhZ2Vf Y29kZSAhPSBJREVUQVBFX0JMT0NLX0RFU0NSSVBUT1IpCgkJLyogREJEID0gMSAtIERvbid0IHJl dHVybiBibG9jayBkZXNjcmlwdG9ycyAqLwoJCXBjLT5jWzFdID0gODsKCXBjLT5jWzJdID0gcGFn ZV9jb2RlOwoJLyoKCSAqIENoYW5nZWQgcGMtPmNbM10gdG8gMCAoMjU1IHdpbGwgYXQgYmVzdCBy ZXR1cm4gdW51c2VkIGluZm8pLgoJICoKCSAqIEZvciBTQ1NJIHRoaXMgYnl0ZSBpcyBkZWZpbmVk IGFzIHN1YnBhZ2UgaW5zdGVhZCBvZiBoaWdoIGJ5dGUKCSAqIG9mIGxlbmd0aCBhbmQgc29tZSBJ REUgZHJpdmVzIHNlZW0gdG8gaW50ZXJwcmV0IGl0IHRoaXMgd2F5CgkgKiBhbmQgcmV0dXJuIGFu IGVycm9yIHdoZW4gMjU1IGlzIHVzZWQuCgkgKi8KCXBjLT5jWzNdID0gMDsKCS8qIFdlIHdpbGwg anVzdCBkaXNjYXJkIGRhdGEgaW4gdGhhdCBjYXNlICovCglwYy0+Y1s0XSA9IDI1NTsKCWlmIChw YWdlX2NvZGUgPT0gSURFVEFQRV9CTE9DS19ERVNDUklQVE9SKQoJCXBjLT5yZXFfeGZlciA9IDEy OwoJZWxzZSBpZiAocGFnZV9jb2RlID09IElERVRBUEVfQ0FQQUJJTElUSUVTX1BBR0UpCgkJcGMt PnJlcV94ZmVyID0gMjQ7CgllbHNlCgkJcGMtPnJlcV94ZmVyID0gNTA7Cn0KCnN0YXRpYyBpZGVf c3RhcnRzdG9wX3QgaWRldGFwZV9tZWRpYV9hY2Nlc3NfZmluaXNoZWQoaWRlX2RyaXZlX3QgKmRy aXZlKQp7CglpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CglpZGV0YXBlX3RhcGVfdCAq dGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJp dmUtPnBjOwoJdTggc3RhdDsKCglzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lm KTsKCglpZiAoc3RhdCAmIEFUQV9EU0MpIHsKCQlpZiAoc3RhdCAmIEFUQV9FUlIpIHsKCQkJLyog RXJyb3IgZGV0ZWN0ZWQgKi8KCQkJaWYgKHBjLT5jWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkKCQkJ CXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6ICVzOiBJL08gZXJyb3IsICIsCgkJCQkJCXRhcGUt Pm5hbWUpOwoJCQkvKiBSZXRyeSBvcGVyYXRpb24gKi8KCQkJaWRlX3JldHJ5X3BjKGRyaXZlLCB0 YXBlLT5kaXNrKTsKCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwoJCX0KCQlwYy0+ZXJyb3IgPSAwOwoJ fSBlbHNlIHsKCQlwYy0+ZXJyb3IgPSBJREVUQVBFX0VSUk9SX0dFTkVSQUw7CgkJdGFwZS0+ZmFp bGVkX3BjID0gTlVMTDsKCX0KCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgMCk7CglyZXR1cm4g aWRlX3N0b3BwZWQ7Cn0KCnN0YXRpYyB2b2lkIGlkZV90YXBlX2NyZWF0ZV9yd19jbWQoaWRldGFw ZV90YXBlX3QgKnRhcGUsCgkJCQkgICBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywgc3RydWN0IHJl cXVlc3QgKnJxLAoJCQkJICAgdTggb3Bjb2RlKQp7CglzdHJ1Y3QgaWRldGFwZV9iaCAqYmggPSAo c3RydWN0IGlkZXRhcGVfYmggKilycS0+c3BlY2lhbDsKCXVuc2lnbmVkIGludCBsZW5ndGggPSBy cS0+Y3VycmVudF9ucl9zZWN0b3JzOwoKCWlkZV9pbml0X3BjKHBjKTsKCXB1dF91bmFsaWduZWQo Y3B1X3RvX2JlMzIobGVuZ3RoKSwgKHVuc2lnbmVkIGludCAqKSAmcGMtPmNbMV0pOwoJcGMtPmNb MV0gPSAxOwoJcGMtPmJoID0gYmg7CglwYy0+YnVmID0gTlVMTDsKCXBjLT5idWZfc2l6ZSA9IGxl bmd0aCAqIHRhcGUtPmJsa19zaXplOwoJcGMtPnJlcV94ZmVyID0gcGMtPmJ1Zl9zaXplOwoJaWYg KHBjLT5yZXFfeGZlciA9PSB0YXBlLT5idWZmZXJfc2l6ZSkKCQlwYy0+ZmxhZ3MgfD0gUENfRkxB R19ETUFfT0s7CgoJaWYgKG9wY29kZSA9PSBSRUFEXzYpIHsKCQlwYy0+Y1swXSA9IFJFQURfNjsK CQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgMCk7Cgl9IGVsc2UgaWYgKG9wY29kZSA9PSBXUklU RV82KSB7CgkJcGMtPmNbMF0gPSBXUklURV82OwoJCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dSSVRJ Tkc7CgkJcGMtPmJfZGF0YSA9IGJoLT5iX2RhdGE7CgkJcGMtPmJfY291bnQgPSBhdG9taWNfcmVh ZCgmYmgtPmJfY291bnQpOwoJfQoKCW1lbWNweShycS0+Y21kLCBwYy0+YywgMTIpOwp9CgpzdGF0 aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXRhcGVfZG9fcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUs CgkJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHNlY3Rvcl90IGJsb2NrKQp7CglpZGVfaHdpZl90 ICpod2lmID0gZHJpdmUtPmh3aWY7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2 ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gTlVMTDsKCXN0cnVjdCByZXF1ZXN0 ICpwb3N0cG9uZWRfcnEgPSB0YXBlLT5wb3N0cG9uZWRfcnE7Cgl1OCBzdGF0OwoKCWRlYnVnX2xv ZyhEQkdfU0VOU0UsICJzZWN0b3I6ICVsbHUsIG5yX3NlY3RvcnM6ICVsdSwiCgkJCSIgY3VycmVu dF9ucl9zZWN0b3JzOiAldVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+c2VjdG9yLCBy cS0+bnJfc2VjdG9ycywKCQkJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CgoJaWYgKCFibGtfc3Bl Y2lhbF9yZXF1ZXN0KHJxKSkgewoJCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGJ1ZmZlciBjYWNoZSBv cmlnaW5hdGVkIHJlcXVlc3RzLiAqLwoJCXByaW50ayhLRVJOX05PVElDRSAiaWRlLXRhcGU6ICVz OiBVbnN1cHBvcnRlZCByZXF1ZXN0IGluICIKCQkJInJlcXVlc3QgcXVldWUgKCVkKVxuIiwgZHJp dmUtPm5hbWUsIHJxLT5jbWRfdHlwZSk7CgkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsK CQlyZXR1cm4gaWRlX3N0b3BwZWQ7Cgl9CgoJLyogUmV0cnkgYSBmYWlsZWQgcGFja2V0IGNvbW1h bmQgKi8KCWlmICh0YXBlLT5mYWlsZWRfcGMgJiYgZHJpdmUtPnBjLT5jWzBdID09IFJFUVVFU1Rf U0VOU0UpIHsKCQlwYyA9IHRhcGUtPmZhaWxlZF9wYzsKCQlnb3RvIG91dDsKCX0KCglpZiAocG9z dHBvbmVkX3JxICE9IE5VTEwpCgkJaWYgKHJxICE9IHBvc3Rwb25lZF9ycSkgewoJCQlwcmludGso S0VSTl9FUlIgImlkZS10YXBlOiBpZGUtdGFwZS5jIGJ1ZyAtICIKCQkJCQkiVHdvIERTQyByZXF1 ZXN0cyB3ZXJlIHF1ZXVlZFxuIik7CgkJCWlkZXRhcGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDAp OwoJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CgkJfQoKCXRhcGUtPnBvc3Rwb25lZF9ycSA9IE5VTEw7 CgoJLyoKCSAqIElmIHRoZSB0YXBlIGlzIHN0aWxsIGJ1c3ksIHBvc3Rwb25lIG91ciByZXF1ZXN0 IGFuZCBzZXJ2aWNlCgkgKiB0aGUgb3RoZXIgZGV2aWNlIG1lYW53aGlsZS4KCSAqLwoJc3RhdCA9 IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CgoJaWYgKChkcml2ZS0+ZGV2X2ZsYWdz ICYgSURFX0RGTEFHX0RTQ19PVkVSTEFQKSA9PSAwICYmCgkgICAgKHJxLT5jbWRbMTNdICYgUkVR X0lERVRBUEVfUEMyKSA9PSAwKQoJCXNldF9iaXQoSURFX0FGTEFHX0lHTk9SRV9EU0MsICZkcml2 ZS0+YXRhcGlfZmxhZ3MpOwoKCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BPU1Rf UkVTRVQpIHsKCQlzZXRfYml0KElERV9BRkxBR19JR05PUkVfRFNDLCAmZHJpdmUtPmF0YXBpX2Zs YWdzKTsKCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfUE9TVF9SRVNFVDsKCX0KCglp ZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJREVfQUZMQUdfSUdOT1JFX0RTQywgJmRyaXZlLT5hdGFw aV9mbGFncykgJiYKCSAgICAoc3RhdCAmIEFUQV9EU0MpID09IDApIHsKCQlpZiAocG9zdHBvbmVk X3JxID09IE5VTEwpIHsKCQkJdGFwZS0+ZHNjX3BvbGxpbmdfc3RhcnQgPSBqaWZmaWVzOwoJCQl0 YXBlLT5kc2NfcG9sbF9mcmVxID0gdGFwZS0+YmVzdF9kc2NfcndfZnJlcTsKCQkJdGFwZS0+ZHNj X3RpbWVvdXQgPSBqaWZmaWVzICsgSURFVEFQRV9EU0NfUldfVElNRU9VVDsKCQl9IGVsc2UgaWYg KHRpbWVfYWZ0ZXIoamlmZmllcywgdGFwZS0+ZHNjX3RpbWVvdXQpKSB7CgkJCXByaW50ayhLRVJO X0VSUiAiaWRlLXRhcGU6ICVzOiBEU0MgdGltZW91dFxuIiwKCQkJCXRhcGUtPm5hbWUpOwoJCQlp ZiAocnEtPmNtZFsxM10gJiBSRVFfSURFVEFQRV9QQzIpIHsKCQkJCWlkZXRhcGVfbWVkaWFfYWNj ZXNzX2ZpbmlzaGVkKGRyaXZlKTsKCQkJCXJldHVybiBpZGVfc3RvcHBlZDsKCQkJfSBlbHNlIHsK CQkJCXJldHVybiBpZGVfZG9fcmVzZXQoZHJpdmUpOwoJCQl9CgkJfSBlbHNlIGlmICh0aW1lX2Fm dGVyKGppZmZpZXMsCgkJCQkJdGFwZS0+ZHNjX3BvbGxpbmdfc3RhcnQgKwoJCQkJCUlERVRBUEVf RFNDX01BX1RIUkVTSE9MRCkpCgkJCXRhcGUtPmRzY19wb2xsX2ZyZXEgPSBJREVUQVBFX0RTQ19N QV9TTE9XOwoJCWlkZXRhcGVfcG9zdHBvbmVfcmVxdWVzdChkcml2ZSk7CgkJcmV0dXJuIGlkZV9z dG9wcGVkOwoJfQoJaWYgKHJxLT5jbWRbMTNdICYgUkVRX0lERVRBUEVfUkVBRCkgewoJCXBjID0g JnRhcGUtPnF1ZXVlZF9wYzsKCQlpZGVfdGFwZV9jcmVhdGVfcndfY21kKHRhcGUsIHBjLCBycSwg UkVBRF82KTsKCQlnb3RvIG91dDsKCX0KCWlmIChycS0+Y21kWzEzXSAmIFJFUV9JREVUQVBFX1dS SVRFKSB7CgkJcGMgPSAmdGFwZS0+cXVldWVkX3BjOwoJCWlkZV90YXBlX2NyZWF0ZV9yd19jbWQo dGFwZSwgcGMsIHJxLCBXUklURV82KTsKCQlnb3RvIG91dDsKCX0KCWlmIChycS0+Y21kWzEzXSAm IFJFUV9JREVUQVBFX1BDMSkgewoJCXBjID0gKHN0cnVjdCBpZGVfYXRhcGlfcGMgKikgcnEtPmJ1 ZmZlcjsKCQlycS0+Y21kWzEzXSAmPSB+KFJFUV9JREVUQVBFX1BDMSk7CgkJcnEtPmNtZFsxM10g fD0gUkVRX0lERVRBUEVfUEMyOwoJCWdvdG8gb3V0OwoJfQoJaWYgKHJxLT5jbWRbMTNdICYgUkVR X0lERVRBUEVfUEMyKSB7CgkJaWRldGFwZV9tZWRpYV9hY2Nlc3NfZmluaXNoZWQoZHJpdmUpOwoJ CXJldHVybiBpZGVfc3RvcHBlZDsKCX0KCUJVRygpOwoKb3V0OgoJcmV0dXJuIGlkZXRhcGVfaXNz dWVfcGMoZHJpdmUsIHBjKTsKfQoKLyoKICogVGhlIGZ1bmN0aW9uIGJlbG93IHVzZXMgX19nZXRf ZnJlZV9wYWdlcyB0byBhbGxvY2F0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemUKICogdGFwZS0+YnVm ZmVyX3NpemUgKG9yIGEgYml0IG1vcmUpLiBXZSBhdHRlbXB0IHRvIGNvbWJpbmUgc2VxdWVudGlh bCBwYWdlcyBhcwogKiBtdWNoIGFzIHBvc3NpYmxlLgogKgogKiBJdCByZXR1cm5zIGEgcG9pbnRl ciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciwgb3IgTlVMTCBpbiBjYXNlIG9mCiAqIGZh aWx1cmUuCiAqLwpzdGF0aWMgc3RydWN0IGlkZXRhcGVfYmggKmlkZV90YXBlX2ttYWxsb2NfYnVm ZmVyKGlkZXRhcGVfdGFwZV90ICp0YXBlLAoJCQkJCQkgIGludCBmdWxsLCBpbnQgY2xlYXIpCnsK CXN0cnVjdCBpZGV0YXBlX2JoICpwcmV2X2JoLCAqYmgsICptZXJnZV9iaDsKCWludCBwYWdlcyA9 IHRhcGUtPnBhZ2VzX3Blcl9idWZmZXI7Cgl1bnNpZ25lZCBpbnQgb3JkZXIsIGJfYWxsb2NkOwoJ Y2hhciAqYl9kYXRhID0gTlVMTDsKCgltZXJnZV9iaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBp ZGV0YXBlX2JoKSwgR0ZQX0tFUk5FTCk7CgliaCA9IG1lcmdlX2JoOwoJaWYgKGJoID09IE5VTEwp CgkJZ290byBhYm9ydDsKCglvcmRlciA9IGZscyhwYWdlcykgLSAxOwoJYmgtPmJfZGF0YSA9IChj aGFyICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOwoJaWYgKCFiaC0+Yl9k YXRhKQoJCWdvdG8gYWJvcnQ7CgliX2FsbG9jZCA9ICgxIDw8IG9yZGVyKSAqIFBBR0VfU0laRTsK CXBhZ2VzICY9IChvcmRlci0xKTsKCglpZiAoY2xlYXIpCgkJbWVtc2V0KGJoLT5iX2RhdGEsIDAs IGJfYWxsb2NkKTsKCWJoLT5iX3JlcW5leHQgPSBOVUxMOwoJYmgtPmJfc2l6ZSA9IGJfYWxsb2Nk OwoJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIGZ1bGwgPyBiaC0+Yl9zaXplIDogMCk7CgoJd2hp bGUgKHBhZ2VzKSB7CgkJb3JkZXIgPSBmbHMocGFnZXMpIC0gMTsKCQliX2RhdGEgPSAoY2hhciAq KSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKCQlpZiAoIWJfZGF0YSkKCQkJ Z290byBhYm9ydDsKCQliX2FsbG9jZCA9ICgxIDw8IG9yZGVyKSAqIFBBR0VfU0laRTsKCgkJaWYg KGNsZWFyKQoJCQltZW1zZXQoYl9kYXRhLCAwLCBiX2FsbG9jZCk7CgoJCS8qIG5ld2x5IGFsbG9j YXRlZCBwYWdlIGZyYW1lcyBiZWxvdyBidWZmZXIgaGVhZGVyIG9yIC4uLiovCgkJaWYgKGJoLT5i X2RhdGEgPT0gYl9kYXRhICsgYl9hbGxvY2QpIHsKCQkJYmgtPmJfc2l6ZSArPSBiX2FsbG9jZDsK CQkJYmgtPmJfZGF0YSAtPSBiX2FsbG9jZDsKCQkJaWYgKGZ1bGwpCgkJCQlhdG9taWNfYWRkKGJf YWxsb2NkLCAmYmgtPmJfY291bnQpOwoJCQljb250aW51ZTsKCQl9CgkJLyogdGhleSBhcmUgYWJv dmUgdGhlIGhlYWRlciAqLwoJCWlmIChiX2RhdGEgPT0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemUp IHsKCQkJYmgtPmJfc2l6ZSArPSBiX2FsbG9jZDsKCQkJaWYgKGZ1bGwpCgkJCQlhdG9taWNfYWRk KGJfYWxsb2NkLCAmYmgtPmJfY291bnQpOwoJCQljb250aW51ZTsKCQl9CgkJcHJldl9iaCA9IGJo OwoJCWJoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKTsK CQlpZiAoIWJoKSB7CgkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGJfZGF0YSwgb3JkZXIp OwoJCQlnb3RvIGFib3J0OwoJCX0KCQliaC0+Yl9yZXFuZXh0ID0gTlVMTDsKCQliaC0+Yl9kYXRh ID0gYl9kYXRhOwoJCWJoLT5iX3NpemUgPSBiX2FsbG9jZDsKCQlhdG9taWNfc2V0KCZiaC0+Yl9j b3VudCwgZnVsbCA/IGJoLT5iX3NpemUgOiAwKTsKCQlwcmV2X2JoLT5iX3JlcW5leHQgPSBiaDsK CgkJcGFnZXMgJj0gKG9yZGVyLTEpOwoJfQoKCWJoLT5iX3NpemUgLT0gdGFwZS0+ZXhjZXNzX2Jo X3NpemU7CglpZiAoZnVsbCkKCQlhdG9taWNfc3ViKHRhcGUtPmV4Y2Vzc19iaF9zaXplLCAmYmgt PmJfY291bnQpOwoJcmV0dXJuIG1lcmdlX2JoOwphYm9ydDoKCWlkZV90YXBlX2tmcmVlX2J1ZmZl cih0YXBlKTsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IGlkZXRhcGVfY29weV9zdGFnZV9m cm9tX3VzZXIoaWRldGFwZV90YXBlX3QgKnRhcGUsCgkJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1 ZiwgaW50IG4pCnsKCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHRhcGUtPmJoOwoJaW50IGNvdW50 OwoJaW50IHJldCA9IDA7CgoJd2hpbGUgKG4pIHsKCQlpZiAoYmggPT0gTlVMTCkgewoJCQlwcmlu dGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICVzXG4iLAoJCQkJCV9fZnVuY19f KTsKCQkJcmV0dXJuIDE7CgkJfQoJCWNvdW50ID0gbWluKCh1bnNpZ25lZCBpbnQpCgkJCQkoYmgt PmJfc2l6ZSAtIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkpLAoJCQkJKHVuc2lnbmVkIGludClu KTsKCQlpZiAoY29weV9mcm9tX3VzZXIoYmgtPmJfZGF0YSArIGF0b21pY19yZWFkKCZiaC0+Yl9j b3VudCksIGJ1ZiwKCQkJCWNvdW50KSkKCQkJcmV0ID0gMTsKCQluIC09IGNvdW50OwoJCWF0b21p Y19hZGQoY291bnQsICZiaC0+Yl9jb3VudCk7CgkJYnVmICs9IGNvdW50OwoJCWlmIChhdG9taWNf cmVhZCgmYmgtPmJfY291bnQpID09IGJoLT5iX3NpemUpIHsKCQkJYmggPSBiaC0+Yl9yZXFuZXh0 OwoJCQlpZiAoYmgpCgkJCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgMCk7CgkJfQoJfQoJdGFw ZS0+YmggPSBiaDsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgaWRldGFwZV9jb3B5X3N0YWdl X3RvX3VzZXIoaWRldGFwZV90YXBlX3QgKnRhcGUsIGNoYXIgX191c2VyICpidWYsCgkJCQkgICAg ICBpbnQgbikKewoJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gdGFwZS0+Ymg7CglpbnQgY291bnQ7 CglpbnQgcmV0ID0gMDsKCgl3aGlsZSAobikgewoJCWlmIChiaCA9PSBOVUxMKSB7CgkJCXByaW50 ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJoID09IE5VTEwgaW4gJXNcbiIsCgkJCQkJX19mdW5jX18p OwoJCQlyZXR1cm4gMTsKCQl9CgkJY291bnQgPSBtaW4odGFwZS0+Yl9jb3VudCwgbik7CgkJaWYg IChjb3B5X3RvX3VzZXIoYnVmLCB0YXBlLT5iX2RhdGEsIGNvdW50KSkKCQkJcmV0ID0gMTsKCQlu IC09IGNvdW50OwoJCXRhcGUtPmJfZGF0YSArPSBjb3VudDsKCQl0YXBlLT5iX2NvdW50IC09IGNv dW50OwoJCWJ1ZiArPSBjb3VudDsKCQlpZiAoIXRhcGUtPmJfY291bnQpIHsKCQkJYmggPSBiaC0+ Yl9yZXFuZXh0OwoJCQl0YXBlLT5iaCA9IGJoOwoJCQlpZiAoYmgpIHsKCQkJCXRhcGUtPmJfZGF0 YSA9IGJoLT5iX2RhdGE7CgkJCQl0YXBlLT5iX2NvdW50ID0gYXRvbWljX3JlYWQoJmJoLT5iX2Nv dW50KTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIGlkZXRhcGVfaW5p dF9tZXJnZV9idWZmZXIoaWRldGFwZV90YXBlX3QgKnRhcGUpCnsKCXN0cnVjdCBpZGV0YXBlX2Jo ICpiaCA9IHRhcGUtPm1lcmdlX2JoOwoJdGFwZS0+YmggPSB0YXBlLT5tZXJnZV9iaDsKCglpZiAo dGFwZS0+Y2hyZGV2X2RpciA9PSBJREVUQVBFX0RJUl9XUklURSkKCQlhdG9taWNfc2V0KCZiaC0+ Yl9jb3VudCwgMCk7CgllbHNlIHsKCQl0YXBlLT5iX2RhdGEgPSBiaC0+Yl9kYXRhOwoJCXRhcGUt PmJfY291bnQgPSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpOwoJfQp9CgovKgogKiBXcml0ZSBh IGZpbGVtYXJrIGlmIHdyaXRlX2ZpbGVtYXJrPTEuIEZsdXNoIHRoZSBkZXZpY2UgYnVmZmVycyB3 aXRob3V0CiAqIHdyaXRpbmcgYSBmaWxlbWFyayBvdGhlcndpc2UuCiAqLwpzdGF0aWMgdm9pZCBp ZGV0YXBlX2NyZWF0ZV93cml0ZV9maWxlbWFya19jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLAoJCXN0 cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCBpbnQgd3JpdGVfZmlsZW1hcmspCnsKCWlkZV9pbml0X3Bj KHBjKTsKCXBjLT5jWzBdID0gV1JJVEVfRklMRU1BUktTOwoJcGMtPmNbNF0gPSB3cml0ZV9maWxl bWFyazsKCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RTQzsKfQoKc3RhdGljIGludCBp ZGV0YXBlX3dhaXRfcmVhZHkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHRpbWVv dXQpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJc3RydWN0 IGdlbmRpc2sgKmRpc2sgPSB0YXBlLT5kaXNrOwoJaW50IGxvYWRfYXR0ZW1wdGVkID0gMDsKCgkv KiBXYWl0IGZvciB0aGUgdGFwZSB0byBiZWNvbWUgcmVhZHkgKi8KCXNldF9iaXQoSURFX0FGTEFH X01FRElVTV9QUkVTRU5ULCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCXRpbWVvdXQgKz0gamlmZmll czsKCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewoJCWlmIChpZGVfZG9f dGVzdF91bml0X3JlYWR5KGRyaXZlLCBkaXNrKSA9PSAwKQoJCQlyZXR1cm4gMDsKCQlpZiAoKHRh cGUtPnNlbnNlX2tleSA9PSAyICYmIHRhcGUtPmFzYyA9PSA0ICYmIHRhcGUtPmFzY3EgPT0gMikK CQkgICAgfHwgKHRhcGUtPmFzYyA9PSAweDNBKSkgewoJCQkvKiBubyBtZWRpYSAqLwoJCQlpZiAo bG9hZF9hdHRlbXB0ZWQpCgkJCQlyZXR1cm4gLUVOT01FRElVTTsKCQkJaWRlX2RvX3N0YXJ0X3N0 b3AoZHJpdmUsIGRpc2ssIElERVRBUEVfTFVfTE9BRF9NQVNLKTsKCQkJbG9hZF9hdHRlbXB0ZWQg PSAxOwoJCS8qIG5vdCBhYm91dCB0byBiZSByZWFkeSAqLwoJCX0gZWxzZSBpZiAoISh0YXBlLT5z ZW5zZV9rZXkgPT0gMiAmJiB0YXBlLT5hc2MgPT0gNCAmJgoJCQkgICAgICh0YXBlLT5hc2NxID09 IDEgfHwgdGFwZS0+YXNjcSA9PSA4KSkpCgkJCXJldHVybiAtRUlPOwoJCW1zbGVlcCgxMDApOwoJ fQoJcmV0dXJuIC1FSU87Cn0KCnN0YXRpYyBpbnQgaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMo aWRlX2RyaXZlX3QgKmRyaXZlKQp7CglzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZHJpdmUt PmRyaXZlcl9kYXRhOwoJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKCWludCByYzsKCglpZGV0YXBl X2NyZWF0ZV93cml0ZV9maWxlbWFya19jbWQoZHJpdmUsICZwYywgMCk7CglyYyA9IGlkZV9xdWV1 ZV9wY190YWlsKGRyaXZlLCB0YXBlLT5kaXNrLCAmcGMpOwoJaWYgKHJjKQoJCXJldHVybiByYzsK CWlkZXRhcGVfd2FpdF9yZWFkeShkcml2ZSwgNjAgKiA1ICogSFopOwoJcmV0dXJuIDA7Cn0KCnN0 YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKHN0cnVjdCBpZGVfYXRh cGlfcGMgKnBjKQp7CglpZGVfaW5pdF9wYyhwYyk7CglwYy0+Y1swXSA9IFJFQURfUE9TSVRJT047 CglwYy0+cmVxX3hmZXIgPSAyMDsKfQoKc3RhdGljIGludCBpZGV0YXBlX3JlYWRfcG9zaXRpb24o aWRlX2RyaXZlX3QgKmRyaXZlKQp7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2 ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CglpbnQgcG9zaXRpb247CgoJZGVidWdf bG9nKERCR19QUk9DUywgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CgoJaWRldGFwZV9jcmVhdGVf cmVhZF9wb3NpdGlvbl9jbWQoJnBjKTsKCWlmIChpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgdGFw ZS0+ZGlzaywgJnBjKSkKCQlyZXR1cm4gLTE7Cglwb3NpdGlvbiA9IHRhcGUtPmZpcnN0X2ZyYW1l OwoJcmV0dXJuIHBvc2l0aW9uOwp9CgpzdGF0aWMgdm9pZCBpZGV0YXBlX2NyZWF0ZV9sb2NhdGVf Y21kKGlkZV9kcml2ZV90ICpkcml2ZSwKCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKCQl1bnNp Z25lZCBpbnQgYmxvY2ssIHU4IHBhcnRpdGlvbiwgaW50IHNraXApCnsKCWlkZV9pbml0X3BjKHBj KTsKCXBjLT5jWzBdID0gUE9TSVRJT05fVE9fRUxFTUVOVDsKCXBjLT5jWzFdID0gMjsKCXB1dF91 bmFsaWduZWQoY3B1X3RvX2JlMzIoYmxvY2spLCAodW5zaWduZWQgaW50ICopICZwYy0+Y1szXSk7 CglwYy0+Y1s4XSA9IHBhcnRpdGlvbjsKCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RT QzsKfQoKc3RhdGljIHZvaWQgX19pZGVfdGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZlcihpZGVfZHJp dmVfdCAqZHJpdmUpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRh OwoKCWlmICh0YXBlLT5jaHJkZXZfZGlyICE9IElERVRBUEVfRElSX1JFQUQpCgkJcmV0dXJuOwoK CWNsZWFyX2JpdChJREVfQUZMQUdfRklMRU1BUkssICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwoJdGFw ZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7CglpZiAodGFwZS0+bWVyZ2VfYmggIT0gTlVMTCkgewoJCWlk ZV90YXBlX2tmcmVlX2J1ZmZlcih0YXBlKTsKCQl0YXBlLT5tZXJnZV9iaCA9IE5VTEw7Cgl9CgoJ dGFwZS0+Y2hyZGV2X2RpciA9IElERVRBUEVfRElSX05PTkU7Cn0KCi8qCiAqIFBvc2l0aW9uIHRo ZSB0YXBlIHRvIHRoZSByZXF1ZXN0ZWQgYmxvY2sgdXNpbmcgdGhlIExPQ0FURSBwYWNrZXQgY29t bWFuZC4KICogQSBSRUFEIFBPU0lUSU9OIGNvbW1hbmQgaXMgdGhlbiBpc3N1ZWQgdG8gY2hlY2sg d2hlcmUgd2UgYXJlIHBvc2l0aW9uZWQuIExpa2UKICogYWxsIGhpZ2hlciBsZXZlbCBvcGVyYXRp b25zLCB3ZSBxdWV1ZSB0aGUgY29tbWFuZHMgYXQgdGhlIHRhaWwgb2YgdGhlIHJlcXVlc3QKICog cXVldWUgYW5kIHdhaXQgZm9yIHRoZWlyIGNvbXBsZXRpb24uCiAqLwpzdGF0aWMgaW50IGlkZXRh cGVfcG9zaXRpb25fdGFwZShpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBibG9jaywK CQl1OCBwYXJ0aXRpb24sIGludCBza2lwKQp7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZl LT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gdGFwZS0+ZGlzazsKCWludCBy ZXR2YWw7CglzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwoKCWlmICh0YXBlLT5jaHJkZXZfZGlyID09 IElERVRBUEVfRElSX1JFQUQpCgkJX19pZGVfdGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZlcihkcml2 ZSk7CglpZGV0YXBlX3dhaXRfcmVhZHkoZHJpdmUsIDYwICogNSAqIEhaKTsKCWlkZXRhcGVfY3Jl YXRlX2xvY2F0ZV9jbWQoZHJpdmUsICZwYywgYmxvY2ssIHBhcnRpdGlvbiwgc2tpcCk7CglyZXR2 YWwgPSBpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKCWlmIChyZXR2YWwpCgkJ cmV0dXJuIChyZXR2YWwpOwoKCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7 CglyZXR1cm4gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYyk7Cn0KCnN0YXRpYyB2 b2lkIGlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGlkZV9kcml2ZV90ICpkcml2ZSwKCQkJ CQkgIGludCByZXN0b3JlX3Bvc2l0aW9uKQp7CglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZl LT5kcml2ZXJfZGF0YTsKCWludCBzZWVrLCBwb3NpdGlvbjsKCglfX2lkZV90YXBlX2Rpc2NhcmRf bWVyZ2VfYnVmZmVyKGRyaXZlKTsKCWlmIChyZXN0b3JlX3Bvc2l0aW9uKSB7CgkJcG9zaXRpb24g PSBpZGV0YXBlX3JlYWRfcG9zaXRpb24oZHJpdmUpOwoJCXNlZWsgPSBwb3NpdGlvbiA+IDAgPyBw b3NpdGlvbiA6IDA7CgkJaWYgKGlkZXRhcGVfcG9zaXRpb25fdGFwZShkcml2ZSwgc2VlaywgMCwg MCkpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6ICVzOiBwb3NpdGlvbl90YXBlIGZh aWxlZCBpbiIKCQkJCQkgIiAlc1xuIiwgdGFwZS0+bmFtZSwgX19mdW5jX18pOwoJCQlyZXR1cm47 CgkJfQoJfQp9CgovKgogKiBHZW5lcmF0ZSBhIHJlYWQvd3JpdGUgcmVxdWVzdCBmb3IgdGhlIGJs b2NrIGRldmljZSBpbnRlcmZhY2UgYW5kIHdhaXQgZm9yIGl0CiAqIHRvIGJlIHNlcnZpY2VkLgog Ki8Kc3RhdGljIGludCBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoaWRlX2RyaXZlX3QgKmRyaXZlLCBp bnQgY21kLCBpbnQgYmxvY2tzLAoJCQkJIHN0cnVjdCBpZGV0YXBlX2JoICpiaCkKewoJaWRldGFw ZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CglzdHJ1Y3QgcmVxdWVzdCAqcnE7 CglpbnQgcmV0LCBlcnJvcnM7CgoJZGVidWdfbG9nKERCR19TRU5TRSwgIiVzOiBjbWQ9JWRcbiIs IF9fZnVuY19fLCBjbWQpOwoKCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVB RCwgX19HRlBfV0FJVCk7CglycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwoJcnEtPmNt ZFsxM10gPSBjbWQ7CglycS0+cnFfZGlzayA9IHRhcGUtPmRpc2s7CglycS0+c3BlY2lhbCA9ICh2 b2lkICopYmg7CglycS0+c2VjdG9yID0gdGFwZS0+Zmlyc3RfZnJhbWU7CglycS0+bnJfc2VjdG9y cyA9IGJsb2NrczsKCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBibG9ja3M7CglibGtfZXhlY3V0 ZV9ycShkcml2ZS0+cXVldWUsIHRhcGUtPmRpc2ssIHJxLCAwKTsKCgllcnJvcnMgPSBycS0+ZXJy b3JzOwoJcmV0ID0gdGFwZS0+YmxrX3NpemUgKiAoYmxvY2tzIC0gcnEtPmN1cnJlbnRfbnJfc2Vj dG9ycyk7CglibGtfcHV0X3JlcXVlc3QocnEpOwoKCWlmICgoY21kICYgKFJFUV9JREVUQVBFX1JF QUQgfCBSRVFfSURFVEFQRV9XUklURSkpID09IDApCgkJcmV0dXJuIDA7CgoJaWYgKHRhcGUtPm1l cmdlX2JoKQoJCWlkZXRhcGVfaW5pdF9tZXJnZV9idWZmZXIodGFwZSk7CglpZiAoZXJyb3JzID09 IElERVRBUEVfRVJST1JfR0VORVJBTCkKCQlyZXR1cm4gLUVJTzsKCXJldHVybiByZXQ7Cn0KCnN0 YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX2lucXVpcnlfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMg KnBjKQp7CglpZGVfaW5pdF9wYyhwYyk7CglwYy0+Y1swXSA9IElOUVVJUlk7CglwYy0+Y1s0XSA9 IDI1NDsKCXBjLT5yZXFfeGZlciA9IDI1NDsKfQoKc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVf cmV3aW5kX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsCgkJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMp CnsKCWlkZV9pbml0X3BjKHBjKTsKCXBjLT5jWzBdID0gUkVaRVJPX1VOSVQ7CglwYy0+ZmxhZ3Mg fD0gUENfRkxBR19XQUlUX0ZPUl9EU0M7Cn0KCnN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX2Vy YXNlX2NtZChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKewoJaWRlX2luaXRfcGMocGMpOwoJcGMt PmNbMF0gPSBFUkFTRTsKCXBjLT5jWzFdID0gMTsKCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRf Rk9SX0RTQzsKfQoKc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfc3BhY2VfY21kKHN0cnVjdCBp ZGVfYXRhcGlfcGMgKnBjLCBpbnQgY291bnQsIHU4IGNtZCkKewoJaWRlX2luaXRfcGMocGMpOwoJ cGMtPmNbMF0gPSBTUEFDRTsKCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIoY291bnQpLCAodW5z aWduZWQgaW50ICopICZwYy0+Y1sxXSk7CglwYy0+Y1sxXSA9IGNtZDsKCXBjLT5mbGFncyB8PSBQ Q19GTEFHX1dBSVRfRk9SX0RTQzsKfQoKLyogUXVldWUgdXAgYSBjaGFyYWN0ZXIgZGV2aWNlIG9y aWdpbmF0ZWQgd3JpdGUgcmVxdWVzdC4gKi8Kc3RhdGljIGludCBpZGV0YXBlX2FkZF9jaHJkZXZf d3JpdGVfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBibG9ja3MpCnsKCWlkZXRhcGVf dGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoKCWRlYnVnX2xvZyhEQkdfQ0hSREVW LCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKCglyZXR1cm4gaWRldGFwZV9xdWV1ZV9yd190YWls KGRyaXZlLCBSRVFfSURFVEFQRV9XUklURSwKCQkJCSAgICAgYmxvY2tzLCB0YXBlLT5tZXJnZV9i aCk7Cn0KCnN0YXRpYyB2b2lkIGlkZV90YXBlX2ZsdXNoX21lcmdlX2J1ZmZlcihpZGVfZHJpdmVf dCAqZHJpdmUpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJ aW50IGJsb2NrcywgbWluOwoJc3RydWN0IGlkZXRhcGVfYmggKmJoOwoKCWlmICh0YXBlLT5jaHJk ZXZfZGlyICE9IElERVRBUEVfRElSX1dSSVRFKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFw ZTogYnVnOiBUcnlpbmcgdG8gZW1wdHkgbWVyZ2UgYnVmZmVyIgoJCQkJIiBidXQgd2UgYXJlIG5v dCB3cml0aW5nLlxuIik7CgkJcmV0dXJuOwoJfQoJaWYgKHRhcGUtPm1lcmdlX2JoX3NpemUgPiB0 YXBlLT5idWZmZXJfc2l6ZSkgewoJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJ1ZzogbWVy Z2VfYnVmZmVyIHRvbyBiaWdcbiIpOwoJCXRhcGUtPm1lcmdlX2JoX3NpemUgPSB0YXBlLT5idWZm ZXJfc2l6ZTsKCX0KCWlmICh0YXBlLT5tZXJnZV9iaF9zaXplKSB7CgkJYmxvY2tzID0gdGFwZS0+ bWVyZ2VfYmhfc2l6ZSAvIHRhcGUtPmJsa19zaXplOwoJCWlmICh0YXBlLT5tZXJnZV9iaF9zaXpl ICUgdGFwZS0+YmxrX3NpemUpIHsKCQkJdW5zaWduZWQgaW50IGk7CgoJCQlibG9ja3MrKzsKCQkJ aSA9IHRhcGUtPmJsa19zaXplIC0gdGFwZS0+bWVyZ2VfYmhfc2l6ZSAlCgkJCQl0YXBlLT5ibGtf c2l6ZTsKCQkJYmggPSB0YXBlLT5iaC0+Yl9yZXFuZXh0OwoJCQl3aGlsZSAoYmgpIHsKCQkJCWF0 b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKCQkJCWJoID0gYmgtPmJfcmVxbmV4dDsKCQkJfQoJ CQliaCA9IHRhcGUtPmJoOwoJCQl3aGlsZSAoaSkgewoJCQkJaWYgKGJoID09IE5VTEwpIHsKCQkJ CQlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogYnVnLCIKCQkJCQkJCSAiIGJoIE5VTExcbiIp OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJbWluID0gbWluKGksICh1bnNpZ25lZCBpbnQpKGJoLT5i X3NpemUgLQoJCQkJCQlhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpKSk7CgkJCQltZW1zZXQoYmgt PmJfZGF0YSArIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCksCgkJCQkJCTAsIG1pbik7CgkJCQlh dG9taWNfYWRkKG1pbiwgJmJoLT5iX2NvdW50KTsKCQkJCWkgLT0gbWluOwoJCQkJYmggPSBiaC0+ Yl9yZXFuZXh0OwoJCQl9CgkJfQoJCSh2b2lkKSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVx dWVzdChkcml2ZSwgYmxvY2tzKTsKCQl0YXBlLT5tZXJnZV9iaF9zaXplID0gMDsKCX0KCWlmICh0 YXBlLT5tZXJnZV9iaCAhPSBOVUxMKSB7CgkJaWRlX3RhcGVfa2ZyZWVfYnVmZmVyKHRhcGUpOwoJ CXRhcGUtPm1lcmdlX2JoID0gTlVMTDsKCX0KCXRhcGUtPmNocmRldl9kaXIgPSBJREVUQVBFX0RJ Ul9OT05FOwp9CgpzdGF0aWMgaW50IGlkZXRhcGVfaW5pdF9yZWFkKGlkZV9kcml2ZV90ICpkcml2 ZSkKewoJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CglpbnQgYnl0 ZXNfcmVhZDsKCgkvKiBJbml0aWFsaXplIHJlYWQgb3BlcmF0aW9uICovCglpZiAodGFwZS0+Y2hy ZGV2X2RpciAhPSBJREVUQVBFX0RJUl9SRUFEKSB7CgkJaWYgKHRhcGUtPmNocmRldl9kaXIgPT0g SURFVEFQRV9ESVJfV1JJVEUpIHsKCQkJaWRlX3RhcGVfZmx1c2hfbWVyZ2VfYnVmZmVyKGRyaXZl KTsKCQkJaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMoZHJpdmUpOwoJCX0KCQlpZiAodGFwZS0+ bWVyZ2VfYmggfHwgdGFwZS0+bWVyZ2VfYmhfc2l6ZSkgewoJCQlwcmludGsoS0VSTl9FUlIgImlk ZS10YXBlOiBtZXJnZV9iaF9zaXplIHNob3VsZCBiZSIKCQkJCQkgIiAwIG5vd1xuIik7CgkJCXRh cGUtPm1lcmdlX2JoX3NpemUgPSAwOwoJCX0KCQl0YXBlLT5tZXJnZV9iaCA9IGlkZV90YXBlX2tt YWxsb2NfYnVmZmVyKHRhcGUsIDAsIDApOwoJCWlmICghdGFwZS0+bWVyZ2VfYmgpCgkJCXJldHVy biAtRU5PTUVNOwoJCXRhcGUtPmNocmRldl9kaXIgPSBJREVUQVBFX0RJUl9SRUFEOwoKCQkvKgoJ CSAqIElzc3VlIGEgcmVhZCAwIGNvbW1hbmQgdG8gZW5zdXJlIHRoYXQgRFNDIGhhbmRzaGFrZSBp cwoJCSAqIHN3aXRjaGVkIGZyb20gY29tcGxldGlvbiBtb2RlIHRvIGJ1ZmZlciBhdmFpbGFibGUg bW9kZS4KCQkgKiBObyBwb2ludCBpbiBpc3N1aW5nIHRoaXMgaWYgRFNDIG92ZXJsYXAgaXNuJ3Qg c3VwcG9ydGVkLCBzb21lCgkJICogZHJpdmVzIChTZWFnYXRlIFNUVDM0MDFBKSB3aWxsIHJldHVy biBhbiBlcnJvci4KCQkgKi8KCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19EU0Nf T1ZFUkxBUCkgewoJCQlieXRlc19yZWFkID0gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLAoJ CQkJCQkJUkVRX0lERVRBUEVfUkVBRCwgMCwKCQkJCQkJCXRhcGUtPm1lcmdlX2JoKTsKCQkJaWYg KGJ5dGVzX3JlYWQgPCAwKSB7CgkJCQlpZGVfdGFwZV9rZnJlZV9idWZmZXIodGFwZSk7CgkJCQl0 YXBlLT5tZXJnZV9iaCA9IE5VTEw7CgkJCQl0YXBlLT5jaHJkZXZfZGlyID0gSURFVEFQRV9ESVJf Tk9ORTsKCQkJCXJldHVybiBieXRlc19yZWFkOwoJCQl9CgkJfQoJfQoKCXJldHVybiAwOwp9Cgov KiBjYWxsZWQgZnJvbSBpZGV0YXBlX2NocmRldl9yZWFkKCkgdG8gc2VydmljZSBhIGNocmRldiBy ZWFkIHJlcXVlc3QuICovCnN0YXRpYyBpbnQgaWRldGFwZV9hZGRfY2hyZGV2X3JlYWRfcmVxdWVz dChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBibG9ja3MpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBl ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoKCWRlYnVnX2xvZyhEQkdfUFJPQ1MsICJFbnRlciAlcywg JWQgYmxvY2tzXG4iLCBfX2Z1bmNfXywgYmxvY2tzKTsKCgkvKiBJZiB3ZSBhcmUgYXQgYSBmaWxl bWFyaywgcmV0dXJuIGEgcmVhZCBsZW5ndGggb2YgMCAqLwoJaWYgKHRlc3RfYml0KElERV9BRkxB R19GSUxFTUFSSywgJmRyaXZlLT5hdGFwaV9mbGFncykpCgkJcmV0dXJuIDA7CgoJaWRldGFwZV9p bml0X3JlYWQoZHJpdmUpOwoKCXJldHVybiBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJF UV9JREVUQVBFX1JFQUQsIGJsb2NrcywKCQkJCSAgICAgdGFwZS0+bWVyZ2VfYmgpOwp9CgpzdGF0 aWMgdm9pZCBpZGV0YXBlX3BhZF96ZXJvcyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBiY291bnQp CnsKCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJc3RydWN0IGlk ZXRhcGVfYmggKmJoOwoJaW50IGJsb2NrczsKCgl3aGlsZSAoYmNvdW50KSB7CgkJdW5zaWduZWQg aW50IGNvdW50OwoKCQliaCA9IHRhcGUtPm1lcmdlX2JoOwoJCWNvdW50ID0gbWluKHRhcGUtPmJ1 ZmZlcl9zaXplLCBiY291bnQpOwoJCWJjb3VudCAtPSBjb3VudDsKCQlibG9ja3MgPSBjb3VudCAv IHRhcGUtPmJsa19zaXplOwoJCXdoaWxlIChjb3VudCkgewoJCQlhdG9taWNfc2V0KCZiaC0+Yl9j b3VudCwKCQkJCSAgIG1pbihjb3VudCwgKHVuc2lnbmVkIGludCliaC0+Yl9zaXplKSk7CgkJCW1l bXNldChiaC0+Yl9kYXRhLCAwLCBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpKTsKCQkJY291bnQg LT0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KTsKCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwoJCX0K CQlpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLCBibG9ja3Ms CgkJCQkgICAgICB0YXBlLT5tZXJnZV9iaCk7Cgl9Cn0KCi8qCiAqIFJld2luZHMgdGhlIHRhcGUg dG8gdGhlIEJlZ2lubmluZyBPZiB0aGUgY3VycmVudCBQYXJ0aXRpb24gKEJPUCkuIFdlCiAqIGN1 cnJlbnRseSBzdXBwb3J0IG9ubHkgb25lIHBhcnRpdGlvbi4KICovCnN0YXRpYyBpbnQgaWRldGFw ZV9yZXdpbmRfdGFwZShpZGVfZHJpdmVfdCAqZHJpdmUpCnsKCXN0cnVjdCBpZGVfdGFwZV9vYmog KnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CglzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHRhcGUt PmRpc2s7CglpbnQgcmV0dmFsOwoJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKCglkZWJ1Z19sb2co REJHX1NFTlNFLCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKCglpZGV0YXBlX2NyZWF0ZV9yZXdp bmRfY21kKGRyaXZlLCAmcGMpOwoJcmV0dmFsID0gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRp c2ssICZwYyk7CglpZiAocmV0dmFsKQoJCXJldHVybiByZXR2YWw7CgoJaWRldGFwZV9jcmVhdGVf cmVhZF9wb3NpdGlvbl9jbWQoJnBjKTsKCXJldHZhbCA9IGlkZV9xdWV1ZV9wY190YWlsKGRyaXZl LCBkaXNrLCAmcGMpOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoJcmV0dXJuIDA7Cn0K Ci8qIG10aW8uaCBjb21wYXRpYmxlIGNvbW1hbmRzIHNob3VsZCBiZSBpc3N1ZWQgdG8gdGhlIGNo cmRldiBpbnRlcmZhY2UuICovCnN0YXRpYyBpbnQgaWRldGFwZV9ibGtkZXZfaW9jdGwoaWRlX2Ry aXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgY21kLAoJCQkJdW5zaWduZWQgbG9uZyBhcmcpCnsK CWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJdm9pZCBfX3VzZXIg KmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CgoJc3RydWN0IGlkZXRhcGVfY29uZmlnIHsKCQlp bnQgZHNjX3J3X2ZyZXF1ZW5jeTsKCQlpbnQgZHNjX21lZGlhX2FjY2Vzc19mcmVxdWVuY3k7CgkJ aW50IG5yX3N0YWdlczsKCX0gY29uZmlnOwoKCWRlYnVnX2xvZyhEQkdfUFJPQ1MsICJFbnRlciAl c1xuIiwgX19mdW5jX18pOwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIDB4MDM0MDoKCQlpZiAoY29w eV9mcm9tX3VzZXIoJmNvbmZpZywgYXJncCwgc2l6ZW9mKGNvbmZpZykpKQoJCQlyZXR1cm4gLUVG QVVMVDsKCQl0YXBlLT5iZXN0X2RzY19yd19mcmVxID0gY29uZmlnLmRzY19yd19mcmVxdWVuY3k7 CgkJYnJlYWs7CgljYXNlIDB4MDM1MDoKCQljb25maWcuZHNjX3J3X2ZyZXF1ZW5jeSA9IChpbnQp IHRhcGUtPmJlc3RfZHNjX3J3X2ZyZXE7CgkJY29uZmlnLm5yX3N0YWdlcyA9IDE7CgkJaWYgKGNv cHlfdG9fdXNlcihhcmdwLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCgkJCXJldHVybiAtRUZB VUxUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTzsKCX0KCXJldHVybiAwOwp9Cgpz dGF0aWMgaW50IGlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MoaWRlX2RyaXZlX3QgKmRyaXZl LCBzaG9ydCBtdF9vcCwKCQkJCQlpbnQgbXRfY291bnQpCnsKCWlkZXRhcGVfdGFwZV90ICp0YXBl ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSB0YXBlLT5kaXNr OwoJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKCWludCByZXR2YWwsIGNvdW50ID0gMDsKCWludCBz cHJldiA9ICEhKHRhcGUtPmNhcHNbNF0gJiAweDIwKTsKCglpZiAobXRfY291bnQgPT0gMCkKCQly ZXR1cm4gMDsKCWlmIChNVEJTRiA9PSBtdF9vcCB8fCBNVEJTRk0gPT0gbXRfb3ApIHsKCQlpZiAo IXNwcmV2KQoJCQlyZXR1cm4gLUVJTzsKCQltdF9jb3VudCA9IC1tdF9jb3VudDsKCX0KCglpZiAo dGFwZS0+Y2hyZGV2X2RpciA9PSBJREVUQVBFX0RJUl9SRUFEKSB7CgkJdGFwZS0+bWVyZ2VfYmhf c2l6ZSA9IDA7CgkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJREVfQUZMQUdfRklMRU1BUkssICZk cml2ZS0+YXRhcGlfZmxhZ3MpKQoJCQkrK2NvdW50OwoJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2Vf YnVmZmVyKGRyaXZlLCAwKTsKCX0KCglzd2l0Y2ggKG10X29wKSB7CgljYXNlIE1URlNGOgoJY2Fz ZSBNVEJTRjoKCQlpZGV0YXBlX2NyZWF0ZV9zcGFjZV9jbWQoJnBjLCBtdF9jb3VudCAtIGNvdW50 LAoJCQkJCSBJREVUQVBFX1NQQUNFX09WRVJfRklMRU1BUkspOwoJCXJldHVybiBpZGVfcXVldWVf cGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKCWNhc2UgTVRGU0ZNOgoJY2FzZSBNVEJTRk06CgkJ aWYgKCFzcHJldikKCQkJcmV0dXJuIC1FSU87CgkJcmV0dmFsID0gaWRldGFwZV9zcGFjZV9vdmVy X2ZpbGVtYXJrcyhkcml2ZSwgTVRGU0YsCgkJCQkJCSAgICAgIG10X2NvdW50IC0gY291bnQpOwoJ CWlmIChyZXR2YWwpCgkJCXJldHVybiByZXR2YWw7CgkJY291bnQgPSAoTVRCU0ZNID09IG10X29w ID8gMSA6IC0xKTsKCQlyZXR1cm4gaWRldGFwZV9zcGFjZV9vdmVyX2ZpbGVtYXJrcyhkcml2ZSwg TVRGU0YsIGNvdW50KTsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogTVRJ TyBvcGVyYXRpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKCQkJCW10X29wKTsKCQlyZXR1cm4gLUVJ TzsKCX0KfQoKLyoKICogT3VyIGNoYXJhY3RlciBkZXZpY2UgcmVhZCAvIHdyaXRlIGZ1bmN0aW9u cy4KICoKICogVGhlIHRhcGUgaXMgb3B0aW1pemVkIHRvIG1heGltaXplIHRocm91Z2hwdXQgd2hl biBpdCBpcyB0cmFuc2ZlcnJpbmcgYW4KICogaW50ZWdyYWwgbnVtYmVyIG9mIHRoZSAiY29udGlu dW91cyB0cmFuc2ZlciBsaW1pdCIsIHdoaWNoIGlzIGEgcGFyYW1ldGVyIG9mCiAqIHRoZSBzcGVj aWZpYyB0YXBlICgyNmtCIG9uIG15IHBhcnRpY3VsYXIgdGFwZSwgMzJrQiBmb3IgT25zdHJlYW0p LgogKgogKiBBcyBvZiB2ZXJzaW9uIDEuMyBvZiB0aGUgZHJpdmVyLCB0aGUgY2hhcmFjdGVyIGRl dmljZSBwcm92aWRlcyBhbiBhYnN0cmFjdAogKiBjb250aW51b3VzIHZpZXcgb2YgdGhlIG1lZGlh IC0gYW55IG1peCBvZiBibG9jayBzaXplcyAoZXZlbiAxIGJ5dGUpIG9uIHRoZQogKiBzYW1lIGJh Y2t1cC9yZXN0b3JlIHByb2NlZHVyZSBpcyBzdXBwb3J0ZWQuIFRoZSBkcml2ZXIgd2lsbCBpbnRl cm5hbGx5CiAqIGNvbnZlcnQgdGhlIHJlcXVlc3RzIHRvIHRoZSByZWNvbW1lbmRlZCB0cmFuc2Zl ciB1bml0LCBzbyB0aGF0IGFuIHVubWF0Y2gKICogYmV0d2VlbiB0aGUgdXNlcidzIGJsb2NrIHNp emUgdG8gdGhlIHJlY29tbWVuZGVkIHNpemUgd2lsbCBvbmx5IHJlc3VsdCBpbiBhCiAqIChzbGln aHRseSkgaW5jcmVhc2VkIGRyaXZlciBvdmVyaGVhZCwgYnV0IHdpbGwgbm8gbG9uZ2VyIGhpdCBw ZXJmb3JtYW5jZS4KICogVGhpcyBpcyBub3QgYXBwbGljYWJsZSB0byBPbnN0cmVhbS4KICovCnN0 YXRpYyBzc2l6ZV90IGlkZXRhcGVfY2hyZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIg X191c2VyICpidWYsCgkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJc3RydWN0 IGlkZV90YXBlX29iaiAqdGFwZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCWlkZV9kcml2ZV90ICpk cml2ZSA9IHRhcGUtPmRyaXZlOwoJc3NpemVfdCBieXRlc19yZWFkLCB0ZW1wLCBhY3R1YWxseV9y ZWFkID0gMCwgcmM7Cglzc2l6ZV90IHJldCA9IDA7Cgl1MTYgY3RsID0gKih1MTYgKikmdGFwZS0+ Y2Fwc1sxMl07CgoJZGVidWdfbG9nKERCR19DSFJERVYsICJFbnRlciAlcywgY291bnQgJVpkXG4i LCBfX2Z1bmNfXywgY291bnQpOwoKCWlmICh0YXBlLT5jaHJkZXZfZGlyICE9IElERVRBUEVfRElS X1JFQUQpIHsKCQlpZiAodGVzdF9iaXQoSURFX0FGTEFHX0RFVEVDVF9CUywgJmRyaXZlLT5hdGFw aV9mbGFncykpCgkJCWlmIChjb3VudCA+IHRhcGUtPmJsa19zaXplICYmCgkJCSAgICAoY291bnQg JSB0YXBlLT5ibGtfc2l6ZSkgPT0gMCkKCQkJCXRhcGUtPnVzZXJfYnNfZmFjdG9yID0gY291bnQg LyB0YXBlLT5ibGtfc2l6ZTsKCX0KCXJjID0gaWRldGFwZV9pbml0X3JlYWQoZHJpdmUpOwoJaWYg KHJjIDwgMCkKCQlyZXR1cm4gcmM7CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gKDApOwoJaWYg KHRhcGUtPm1lcmdlX2JoX3NpemUpIHsKCQlhY3R1YWxseV9yZWFkID0gbWluKCh1bnNpZ25lZCBp bnQpKHRhcGUtPm1lcmdlX2JoX3NpemUpLAoJCQkJICAgICh1bnNpZ25lZCBpbnQpY291bnQpOwoJ CWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIGFjdHVhbGx5X3JlYWQp KQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJ1ZiArPSBhY3R1YWxseV9yZWFkOwoJCXRhcGUtPm1lcmdl X2JoX3NpemUgLT0gYWN0dWFsbHlfcmVhZDsKCQljb3VudCAtPSBhY3R1YWxseV9yZWFkOwoJfQoJ d2hpbGUgKGNvdW50ID49IHRhcGUtPmJ1ZmZlcl9zaXplKSB7CgkJYnl0ZXNfcmVhZCA9IGlkZXRh cGVfYWRkX2NocmRldl9yZWFkX3JlcXVlc3QoZHJpdmUsIGN0bCk7CgkJaWYgKGJ5dGVzX3JlYWQg PD0gMCkKCQkJZ290byBmaW5pc2g7CgkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRh cGUsIGJ1ZiwgYnl0ZXNfcmVhZCkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnVmICs9IGJ5dGVzX3Jl YWQ7CgkJY291bnQgLT0gYnl0ZXNfcmVhZDsKCQlhY3R1YWxseV9yZWFkICs9IGJ5dGVzX3JlYWQ7 Cgl9CglpZiAoY291bnQpIHsKCQlieXRlc19yZWFkID0gaWRldGFwZV9hZGRfY2hyZGV2X3JlYWRf cmVxdWVzdChkcml2ZSwgY3RsKTsKCQlpZiAoYnl0ZXNfcmVhZCA8PSAwKQoJCQlnb3RvIGZpbmlz aDsKCQl0ZW1wID0gbWluKCh1bnNpZ25lZCBsb25nKWNvdW50LCAodW5zaWduZWQgbG9uZylieXRl c19yZWFkKTsKCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCB0ZW1w KSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlhY3R1YWxseV9yZWFkICs9IHRlbXA7CgkJdGFwZS0+bWVy Z2VfYmhfc2l6ZSA9IGJ5dGVzX3JlYWQtdGVtcDsKCX0KZmluaXNoOgoJaWYgKCFhY3R1YWxseV9y ZWFkICYmIHRlc3RfYml0KElERV9BRkxBR19GSUxFTUFSSywgJmRyaXZlLT5hdGFwaV9mbGFncykp IHsKCQlkZWJ1Z19sb2coREJHX1NFTlNFLCAiJXM6IHNwYWNpbmcgb3ZlciBmaWxlbWFya1xuIiwg dGFwZS0+bmFtZSk7CgoJCWlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MoZHJpdmUsIE1URlNG LCAxKTsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsbHlfcmVhZDsK fQoKc3RhdGljIHNzaXplX3QgaWRldGFwZV9jaHJkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUs IGNvbnN0IGNoYXIgX191c2VyICpidWYsCgkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpw cG9zKQp7CglzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJ aWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7Cglzc2l6ZV90IGFjdHVhbGx5X3dyaXR0 ZW4gPSAwOwoJc3NpemVfdCByZXQgPSAwOwoJdTE2IGN0bCA9ICoodTE2ICopJnRhcGUtPmNhcHNb MTJdOwoKCS8qIFRoZSBkcml2ZSBpcyB3cml0ZSBwcm90ZWN0ZWQuICovCglpZiAodGFwZS0+d3Jp dGVfcHJvdCkKCQlyZXR1cm4gLUVBQ0NFUzsKCglkZWJ1Z19sb2coREJHX0NIUkRFViwgIkVudGVy ICVzLCBjb3VudCAlWmRcbiIsIF9fZnVuY19fLCBjb3VudCk7CgoJLyogSW5pdGlhbGl6ZSB3cml0 ZSBvcGVyYXRpb24gKi8KCWlmICh0YXBlLT5jaHJkZXZfZGlyICE9IElERVRBUEVfRElSX1dSSVRF KSB7CgkJaWYgKHRhcGUtPmNocmRldl9kaXIgPT0gSURFVEFQRV9ESVJfUkVBRCkKCQkJaWRlX3Rh cGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDEpOwoJCWlmICh0YXBlLT5tZXJnZV9iaCB8 fCB0YXBlLT5tZXJnZV9iaF9zaXplKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IG1l cmdlX2JoX3NpemUgIgoJCQkJInNob3VsZCBiZSAwIG5vd1xuIik7CgkJCXRhcGUtPm1lcmdlX2Jo X3NpemUgPSAwOwoJCX0KCQl0YXBlLT5tZXJnZV9iaCA9IGlkZV90YXBlX2ttYWxsb2NfYnVmZmVy KHRhcGUsIDAsIDApOwoJCWlmICghdGFwZS0+bWVyZ2VfYmgpCgkJCXJldHVybiAtRU5PTUVNOwoJ CXRhcGUtPmNocmRldl9kaXIgPSBJREVUQVBFX0RJUl9XUklURTsKCQlpZGV0YXBlX2luaXRfbWVy Z2VfYnVmZmVyKHRhcGUpOwoKCQkvKgoJCSAqIElzc3VlIGEgd3JpdGUgMCBjb21tYW5kIHRvIGVu c3VyZSB0aGF0IERTQyBoYW5kc2hha2UgaXMKCQkgKiBzd2l0Y2hlZCBmcm9tIGNvbXBsZXRpb24g bW9kZSB0byBidWZmZXIgYXZhaWxhYmxlIG1vZGUuIE5vCgkJICogcG9pbnQgaW4gaXNzdWluZyB0 aGlzIGlmIERTQyBvdmVybGFwIGlzbid0IHN1cHBvcnRlZCwgc29tZQoJCSAqIGRyaXZlcyAoU2Vh Z2F0ZSBTVFQzNDAxQSkgd2lsbCByZXR1cm4gYW4gZXJyb3IuCgkJICovCgkJaWYgKGRyaXZlLT5k ZXZfZmxhZ3MgJiBJREVfREZMQUdfRFNDX09WRVJMQVApIHsKCQkJc3NpemVfdCByZXR2YWwgPSBp ZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsCgkJCQkJCQlSRVFfSURFVEFQRV9XUklURSwgMCwK CQkJCQkJCXRhcGUtPm1lcmdlX2JoKTsKCQkJaWYgKHJldHZhbCA8IDApIHsKCQkJCWlkZV90YXBl X2tmcmVlX2J1ZmZlcih0YXBlKTsKCQkJCXRhcGUtPm1lcmdlX2JoID0gTlVMTDsKCQkJCXRhcGUt PmNocmRldl9kaXIgPSBJREVUQVBFX0RJUl9OT05FOwoJCQkJcmV0dXJuIHJldHZhbDsKCQkJfQoJ CX0KCX0KCWlmIChjb3VudCA9PSAwKQoJCXJldHVybiAoMCk7CglpZiAodGFwZS0+bWVyZ2VfYmhf c2l6ZSkgewoJCWlmICh0YXBlLT5tZXJnZV9iaF9zaXplID49IHRhcGUtPmJ1ZmZlcl9zaXplKSB7 CgkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJ1ZzogbWVyZ2UgYnVmIHRvbyBiaWdcbiIp OwoJCQl0YXBlLT5tZXJnZV9iaF9zaXplID0gMDsKCQl9CgkJYWN0dWFsbHlfd3JpdHRlbiA9IG1p bigodW5zaWduZWQgaW50KQoJCQkJKHRhcGUtPmJ1ZmZlcl9zaXplIC0gdGFwZS0+bWVyZ2VfYmhf c2l6ZSksCgkJCQkodW5zaWduZWQgaW50KWNvdW50KTsKCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdl X2Zyb21fdXNlcih0YXBlLCBidWYsIGFjdHVhbGx5X3dyaXR0ZW4pKQoJCQkJcmV0ID0gLUVGQVVM VDsKCQlidWYgKz0gYWN0dWFsbHlfd3JpdHRlbjsKCQl0YXBlLT5tZXJnZV9iaF9zaXplICs9IGFj dHVhbGx5X3dyaXR0ZW47CgkJY291bnQgLT0gYWN0dWFsbHlfd3JpdHRlbjsKCgkJaWYgKHRhcGUt Pm1lcmdlX2JoX3NpemUgPT0gdGFwZS0+YnVmZmVyX3NpemUpIHsKCQkJc3NpemVfdCByZXR2YWw7 CgkJCXRhcGUtPm1lcmdlX2JoX3NpemUgPSAwOwoJCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJk ZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgY3RsKTsKCQkJaWYgKHJldHZhbCA8PSAwKQoJCQkJcmV0 dXJuIChyZXR2YWwpOwoJCX0KCX0KCXdoaWxlIChjb3VudCA+PSB0YXBlLT5idWZmZXJfc2l6ZSkg ewoJCXNzaXplX3QgcmV0dmFsOwoJCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRh cGUsIGJ1ZiwgdGFwZS0+YnVmZmVyX3NpemUpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJ1ZiArPSB0 YXBlLT5idWZmZXJfc2l6ZTsKCQljb3VudCAtPSB0YXBlLT5idWZmZXJfc2l6ZTsKCQlyZXR2YWwg PSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgY3RsKTsKCQlhY3R1YWxs eV93cml0dGVuICs9IHRhcGUtPmJ1ZmZlcl9zaXplOwoJCWlmIChyZXR2YWwgPD0gMCkKCQkJcmV0 dXJuIChyZXR2YWwpOwoJfQoJaWYgKGNvdW50KSB7CgkJYWN0dWFsbHlfd3JpdHRlbiArPSBjb3Vu dDsKCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCBidWYsIGNvdW50KSkK CQkJcmV0ID0gLUVGQVVMVDsKCQl0YXBlLT5tZXJnZV9iaF9zaXplICs9IGNvdW50OwoJfQoJcmV0 dXJuIHJldCA/IHJldCA6IGFjdHVhbGx5X3dyaXR0ZW47Cn0KCnN0YXRpYyBpbnQgaWRldGFwZV93 cml0ZV9maWxlbWFyayhpZGVfZHJpdmVfdCAqZHJpdmUpCnsKCXN0cnVjdCBpZGVfdGFwZV9vYmog KnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CglzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwoKCS8q IFdyaXRlIGEgZmlsZW1hcmsgKi8KCWlkZXRhcGVfY3JlYXRlX3dyaXRlX2ZpbGVtYXJrX2NtZChk cml2ZSwgJnBjLCAxKTsKCWlmIChpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgdGFwZS0+ZGlzaywg JnBjKSkgewoJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IENvdWxkbid0IHdyaXRlIGEgZmls ZW1hcmtcbiIpOwoJCXJldHVybiAtRUlPOwoJfQoJcmV0dXJuIDA7Cn0KCi8qCiAqIENhbGxlZCBm cm9tIGlkZXRhcGVfY2hyZGV2X2lvY3RsIHdoZW4gdGhlIGdlbmVyYWwgbXRpbyBNVElPQ1RPUCBp b2N0bCBpcwogKiByZXF1ZXN0ZWQuCiAqCiAqIE5vdGU6IE1UQlNGIGFuZCBNVEJTRk0gYXJlIG5v dCBzdXBwb3J0ZWQgd2hlbiB0aGUgdGFwZSBkb2Vzbid0IHN1cHBvcnQKICogc3BhY2luZyBvdmVy IGZpbGVtYXJrcyBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uIEluIHRoaXMgY2FzZSwgTVRGU0ZN IGlzIGFsc28KICogdXN1YWxseSBub3Qgc3VwcG9ydGVkLgogKgogKiBUaGUgZm9sbG93aW5nIGNv bW1hbmRzIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZDoKICoKICogTVRGU1MsIE1UQlNTLCBN VFdTTSwgTVRTRVRERU5TSVRZLCBNVFNFVERSVkJVRkZFUiwgTVRfU1RfQk9PTEVBTlMsCiAqIE1U X1NUX1dSSVRFX1RIUkVTSE9MRC4KICovCnN0YXRpYyBpbnQgaWRldGFwZV9tdGlvY3RvcChpZGVf ZHJpdmVfdCAqZHJpdmUsIHNob3J0IG10X29wLCBpbnQgbXRfY291bnQpCnsKCWlkZXRhcGVfdGFw ZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwoJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSB0 YXBlLT5kaXNrOwoJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKCWludCBpLCByZXR2YWw7CgoJZGVi dWdfbG9nKERCR19FUlIsICJIYW5kbGluZyBNVElPQ1RPUCBpb2N0bDogbXRfb3A9JWQsIG10X2Nv dW50PSVkXG4iLAoJCQltdF9vcCwgbXRfY291bnQpOwoKCXN3aXRjaCAobXRfb3ApIHsKCWNhc2Ug TVRGU0Y6CgljYXNlIE1URlNGTToKCWNhc2UgTVRCU0Y6CgljYXNlIE1UQlNGTToKCQlpZiAoIW10 X2NvdW50KQoJCQlyZXR1cm4gMDsKCQlyZXR1cm4gaWRldGFwZV9zcGFjZV9vdmVyX2ZpbGVtYXJr cyhkcml2ZSwgbXRfb3AsIG10X2NvdW50KTsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJc3dpdGNo IChtdF9vcCkgewoJY2FzZSBNVFdFT0Y6CgkJaWYgKHRhcGUtPndyaXRlX3Byb3QpCgkJCXJldHVy biAtRUFDQ0VTOwoJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRyaXZlLCAxKTsKCQlm b3IgKGkgPSAwOyBpIDwgbXRfY291bnQ7IGkrKykgewoJCQlyZXR2YWwgPSBpZGV0YXBlX3dyaXRl X2ZpbGVtYXJrKGRyaXZlKTsKCQkJaWYgKHJldHZhbCkKCQkJCXJldHVybiByZXR2YWw7CgkJfQoJ CXJldHVybiAwOwoJY2FzZSBNVFJFVzoKCQlpZGVfdGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZlcihk cml2ZSwgMCk7CgkJaWYgKGlkZXRhcGVfcmV3aW5kX3RhcGUoZHJpdmUpKQoJCQlyZXR1cm4gLUVJ TzsKCQlyZXR1cm4gMDsKCWNhc2UgTVRMT0FEOgoJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVm ZmVyKGRyaXZlLCAwKTsKCQlyZXR1cm4gaWRlX2RvX3N0YXJ0X3N0b3AoZHJpdmUsIGRpc2ssIElE RVRBUEVfTFVfTE9BRF9NQVNLKTsKCWNhc2UgTVRVTkxPQUQ6CgljYXNlIE1UT0ZGTDoKCQkvKgoJ CSAqIElmIGRvb3IgaXMgbG9ja2VkLCBhdHRlbXB0IHRvIHVubG9jayBiZWZvcmUKCQkgKiBhdHRl bXB0aW5nIHRvIGVqZWN0LgoJCSAqLwoJCWlmICh0YXBlLT5kb29yX2xvY2tlZCkgewoJCQlpZiAo IWlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgZGlzaywgMCkpCgkJCQl0YXBlLT5kb29yX2xvY2tl ZCA9IERPT1JfVU5MT0NLRUQ7CgkJfQoJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRy aXZlLCAwKTsKCQlyZXR2YWwgPSBpZGVfZG9fc3RhcnRfc3RvcChkcml2ZSwgZGlzaywgIUlERVRB UEVfTFVfTE9BRF9NQVNLKTsKCQlpZiAoIXJldHZhbCkKCQkJY2xlYXJfYml0KElERV9BRkxBR19N RURJVU1fUFJFU0VOVCwgJmRyaXZlLT5hdGFwaV9mbGFncyk7CgkJcmV0dXJuIHJldHZhbDsKCWNh c2UgTVROT1A6CgkJaWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDApOwoJCXJl dHVybiBpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhkcml2ZSk7CgljYXNlIE1UUkVURU46CgkJ aWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDApOwoJCXJldHVybiBpZGVfZG9f c3RhcnRfc3RvcChkcml2ZSwgZGlzaywKCQkJSURFVEFQRV9MVV9SRVRFTlNJT05fTUFTSyB8IElE RVRBUEVfTFVfTE9BRF9NQVNLKTsKCWNhc2UgTVRFT006CgkJaWRldGFwZV9jcmVhdGVfc3BhY2Vf Y21kKCZwYywgMCwgSURFVEFQRV9TUEFDRV9UT19FT0QpOwoJCXJldHVybiBpZGVfcXVldWVfcGNf dGFpbChkcml2ZSwgZGlzaywgJnBjKTsKCWNhc2UgTVRFUkFTRToKCQkodm9pZClpZGV0YXBlX3Jl d2luZF90YXBlKGRyaXZlKTsKCQlpZGV0YXBlX2NyZWF0ZV9lcmFzZV9jbWQoJnBjKTsKCQlyZXR1 cm4gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYyk7CgljYXNlIE1UU0VUQkxLOgoJ CWlmIChtdF9jb3VudCkgewoJCQlpZiAobXRfY291bnQgPCB0YXBlLT5ibGtfc2l6ZSB8fAoJCQkg ICAgbXRfY291bnQgJSB0YXBlLT5ibGtfc2l6ZSkKCQkJCXJldHVybiAtRUlPOwoJCQl0YXBlLT51 c2VyX2JzX2ZhY3RvciA9IG10X2NvdW50IC8gdGFwZS0+YmxrX3NpemU7CgkJCWNsZWFyX2JpdChJ REVfQUZMQUdfREVURUNUX0JTLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCQl9IGVsc2UKCQkJc2V0 X2JpdChJREVfQUZMQUdfREVURUNUX0JTLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCQlyZXR1cm4g MDsKCWNhc2UgTVRTRUVLOgoJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRyaXZlLCAw KTsKCQlyZXR1cm4gaWRldGFwZV9wb3NpdGlvbl90YXBlKGRyaXZlLAoJCQltdF9jb3VudCAqIHRh cGUtPnVzZXJfYnNfZmFjdG9yLCB0YXBlLT5wYXJ0aXRpb24sIDApOwoJY2FzZSBNVFNFVFBBUlQ6 CgkJaWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDApOwoJCXJldHVybiBpZGV0 YXBlX3Bvc2l0aW9uX3RhcGUoZHJpdmUsIDAsIG10X2NvdW50LCAwKTsKCWNhc2UgTVRGU1I6Cglj YXNlIE1UQlNSOgoJY2FzZSBNVExPQ0s6CgkJcmV0dmFsID0gaWRlX3NldF9tZWRpYV9sb2NrKGRy aXZlLCBkaXNrLCAxKTsKCQlpZiAocmV0dmFsKQoJCQlyZXR1cm4gcmV0dmFsOwoJCXRhcGUtPmRv b3JfbG9ja2VkID0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRDsKCQlyZXR1cm4gMDsKCWNhc2UgTVRV TkxPQ0s6CgkJcmV0dmFsID0gaWRlX3NldF9tZWRpYV9sb2NrKGRyaXZlLCBkaXNrLCAwKTsKCQlp ZiAocmV0dmFsKQoJCQlyZXR1cm4gcmV0dmFsOwoJCXRhcGUtPmRvb3JfbG9ja2VkID0gRE9PUl9V TkxPQ0tFRDsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFw ZTogTVRJTyBvcGVyYXRpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKCQkJCW10X29wKTsKCQlyZXR1 cm4gLUVJTzsKCX0KfQoKLyoKICogT3VyIGNoYXJhY3RlciBkZXZpY2UgaW9jdGxzLiBHZW5lcmFs IG10aW8uaCBtYWduZXRpYyBpbyBjb21tYW5kcyBhcmUKICogc3VwcG9ydGVkIGhlcmUsIGFuZCBu b3QgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaW50ZXJmYWNlLiBPdXIgb3duCiAqIGlkZS10 YXBlIGlvY3RscyBhcmUgc3VwcG9ydGVkIG9uIGJvdGggaW50ZXJmYWNlcy4KICovCnN0YXRpYyBp bnQgaWRldGFwZV9jaHJkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUg KmZpbGUsCgkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0 IGlkZV90YXBlX29iaiAqdGFwZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCWlkZV9kcml2ZV90ICpk cml2ZSA9IHRhcGUtPmRyaXZlOwoJc3RydWN0IG10b3AgbXRvcDsKCXN0cnVjdCBtdGdldCBtdGdl dDsKCXN0cnVjdCBtdHBvcyBtdHBvczsKCWludCBibG9ja19vZmZzZXQgPSAwLCBwb3NpdGlvbiA9 IHRhcGUtPmZpcnN0X2ZyYW1lOwoJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilh cmc7CgoJZGVidWdfbG9nKERCR19DSFJERVYsICJFbnRlciAlcywgY21kPSV1XG4iLCBfX2Z1bmNf XywgY21kKTsKCglpZiAodGFwZS0+Y2hyZGV2X2RpciA9PSBJREVUQVBFX0RJUl9XUklURSkgewoJ CWlkZV90YXBlX2ZsdXNoX21lcmdlX2J1ZmZlcihkcml2ZSk7CgkJaWRldGFwZV9mbHVzaF90YXBl X2J1ZmZlcnMoZHJpdmUpOwoJfQoJaWYgKGNtZCA9PSBNVElPQ0dFVCB8fCBjbWQgPT0gTVRJT0NQ T1MpIHsKCQlibG9ja19vZmZzZXQgPSB0YXBlLT5tZXJnZV9iaF9zaXplIC8KCQkJKHRhcGUtPmJs a19zaXplICogdGFwZS0+dXNlcl9ic19mYWN0b3IpOwoJCXBvc2l0aW9uID0gaWRldGFwZV9yZWFk X3Bvc2l0aW9uKGRyaXZlKTsKCQlpZiAocG9zaXRpb24gPCAwKQoJCQlyZXR1cm4gLUVJTzsKCX0K CXN3aXRjaCAoY21kKSB7CgljYXNlIE1USU9DVE9QOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmbXRv cCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBtdG9wKSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCXJldHVy biBpZGV0YXBlX210aW9jdG9wKGRyaXZlLCBtdG9wLm10X29wLCBtdG9wLm10X2NvdW50KTsKCWNh c2UgTVRJT0NHRVQ6CgkJbWVtc2V0KCZtdGdldCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGdldCkpOwoJ CW10Z2V0Lm10X3R5cGUgPSBNVF9JU1NDU0kyOwoJCW10Z2V0Lm10X2Jsa25vID0gcG9zaXRpb24g LyB0YXBlLT51c2VyX2JzX2ZhY3RvciAtIGJsb2NrX29mZnNldDsKCQltdGdldC5tdF9kc3JlZyA9 CgkJCSgodGFwZS0+YmxrX3NpemUgKiB0YXBlLT51c2VyX2JzX2ZhY3RvcikKCQkJIDw8IE1UX1NU X0JMS1NJWkVfU0hJRlQpICYgTVRfU1RfQkxLU0laRV9NQVNLOwoKCQlpZiAodGFwZS0+ZHJ2X3dy aXRlX3Byb3QpCgkJCW10Z2V0Lm10X2dzdGF0IHw9IEdNVF9XUl9QUk9UKDB4ZmZmZmZmZmYpOwoK CQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtdGdldCwgc2l6ZW9mKHN0cnVjdCBtdGdldCkpKQoJ CQlyZXR1cm4gLUVGQVVMVDsKCQlyZXR1cm4gMDsKCWNhc2UgTVRJT0NQT1M6CgkJbXRwb3MubXRf Ymxrbm8gPSBwb3NpdGlvbiAvIHRhcGUtPnVzZXJfYnNfZmFjdG9yIC0gYmxvY2tfb2Zmc2V0OwoJ CWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm10cG9zLCBzaXplb2Yoc3RydWN0IG10cG9zKSkpCgkJ CXJldHVybiAtRUZBVUxUOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlpZiAodGFwZS0+Y2hyZGV2 X2RpciA9PSBJREVUQVBFX0RJUl9SRUFEKQoJCQlpZGVfdGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZl cihkcml2ZSwgMSk7CgkJcmV0dXJuIGlkZXRhcGVfYmxrZGV2X2lvY3RsKGRyaXZlLCBjbWQsIGFy Zyk7Cgl9Cn0KCi8qCiAqIERvIGEgbW9kZSBzZW5zZSBwYWdlIDAgd2l0aCBibG9jayBkZXNjcmlw dG9yIGFuZCBpZiBpdCBzdWNjZWVkcyBzZXQgdGhlIHRhcGUKICogYmxvY2sgc2l6ZSB3aXRoIHRo ZSByZXBvcnRlZCB2YWx1ZS4KICovCnN0YXRpYyB2b2lkIGlkZV90YXBlX2dldF9ic2l6ZV9mcm9t X2JkZXNjKGlkZV9kcml2ZV90ICpkcml2ZSkKewoJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2 ZS0+ZHJpdmVyX2RhdGE7CglzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwoKCWlkZXRhcGVfY3JlYXRl X21vZGVfc2Vuc2VfY21kKCZwYywgSURFVEFQRV9CTE9DS19ERVNDUklQVE9SKTsKCWlmIChpZGVf cXVldWVfcGNfdGFpbChkcml2ZSwgdGFwZS0+ZGlzaywgJnBjKSkgewoJCXByaW50ayhLRVJOX0VS UiAiaWRlLXRhcGU6IENhbid0IGdldCBibG9jayBkZXNjcmlwdG9yXG4iKTsKCQlpZiAodGFwZS0+ YmxrX3NpemUgPT0gMCkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUtdGFwZTogQ2Fubm90 IGRlYWwgd2l0aCB6ZXJvICIKCQkJCQkgICAgImJsb2NrIHNpemUsIGFzc3VtaW5nIDMya1xuIik7 CgkJCXRhcGUtPmJsa19zaXplID0gMzI3Njg7CgkJfQoJCXJldHVybjsKCX0KCXRhcGUtPmJsa19z aXplID0gKHBjLmJ1Zls0ICsgNV0gPDwgMTYpICsKCQkJCShwYy5idWZbNCArIDZdIDw8IDgpICAr CgkJCQkgcGMuYnVmWzQgKyA3XTsKCXRhcGUtPmRydl93cml0ZV9wcm90ID0gKHBjLmJ1ZlsyXSAm IDB4ODApID4+IDc7Cn0KCnN0YXRpYyBpbnQgaWRldGFwZV9jaHJkZXZfb3BlbihzdHJ1Y3QgaW5v ZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKewoJdW5zaWduZWQgaW50IG1pbm9yID0gaW1p bm9yKGlub2RlKSwgaSA9IG1pbm9yICYgfjB4YzA7CglpZGVfZHJpdmVfdCAqZHJpdmU7CglpZGV0 YXBlX3RhcGVfdCAqdGFwZTsKCWludCByZXR2YWw7CgoJaWYgKGkgPj0gTUFYX0hXSUZTICogTUFY X0RSSVZFUykKCQlyZXR1cm4gLUVOWElPOwoKCWxvY2tfa2VybmVsKCk7Cgl0YXBlID0gaWRlX3Rh cGVfY2hyZGV2X2dldChpKTsKCWlmICghdGFwZSkgewoJCXVubG9ja19rZXJuZWwoKTsKCQlyZXR1 cm4gLUVOWElPOwoJfQoKCWRlYnVnX2xvZyhEQkdfQ0hSREVWLCAiRW50ZXIgJXNcbiIsIF9fZnVu Y19fKTsKCgkvKgoJICogV2UgcmVhbGx5IHdhbnQgdG8gZG8gbm9uc2Vla2FibGVfb3Blbihpbm9k ZSwgZmlscCk7IGhlcmUsIGJ1dCBzb21lCgkgKiB2ZXJzaW9ucyBvZiB0YXIgaW5jb3JyZWN0bHkg Y2FsbCBsc2VlayBvbiB0YXBlcyBhbmQgYmFpbCBvdXQgaWYgdGhhdAoJICogZmFpbHMuICBTbyB3 ZSBkaXNhbGxvdyBwcmVhZCgpIGFuZCBwd3JpdGUoKSwgYnV0IHBlcm1pdCBsc2Vla3MuCgkgKi8K CWZpbHAtPmZfbW9kZSAmPSB+KEZNT0RFX1BSRUFEIHwgRk1PREVfUFdSSVRFKTsKCglkcml2ZSA9 IHRhcGUtPmRyaXZlOwoKCWZpbHAtPnByaXZhdGVfZGF0YSA9IHRhcGU7CgoJaWYgKHRlc3RfYW5k X3NldF9iaXQoSURFX0FGTEFHX0JVU1ksICZkcml2ZS0+YXRhcGlfZmxhZ3MpKSB7CgkJcmV0dmFs ID0gLUVCVVNZOwoJCWdvdG8gb3V0X3B1dF90YXBlOwoJfQoKCXJldHZhbCA9IGlkZXRhcGVfd2Fp dF9yZWFkeShkcml2ZSwgNjAgKiBIWik7CglpZiAocmV0dmFsKSB7CgkJY2xlYXJfYml0KElERV9B RkxBR19CVVNZLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCQlwcmludGsoS0VSTl9FUlIgImlkZS10 YXBlOiAlczogZHJpdmUgbm90IHJlYWR5XG4iLCB0YXBlLT5uYW1lKTsKCQlnb3RvIG91dF9wdXRf dGFwZTsKCX0KCglpZGV0YXBlX3JlYWRfcG9zaXRpb24oZHJpdmUpOwoJaWYgKCF0ZXN0X2JpdChJ REVfQUZMQUdfQUREUkVTU19WQUxJRCwgJmRyaXZlLT5hdGFwaV9mbGFncykpCgkJKHZvaWQpaWRl dGFwZV9yZXdpbmRfdGFwZShkcml2ZSk7CgoJLyogUmVhZCBibG9jayBzaXplIGFuZCB3cml0ZSBw cm90ZWN0IHN0YXR1cyBmcm9tIGRyaXZlLiAqLwoJaWRlX3RhcGVfZ2V0X2JzaXplX2Zyb21fYmRl c2MoZHJpdmUpOwoKCS8qIFNldCB3cml0ZSBwcm90ZWN0IGZsYWcgaWYgZGV2aWNlIGlzIG9wZW5l ZCBhcyByZWFkLW9ubHkuICovCglpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9f UkRPTkxZKQoJCXRhcGUtPndyaXRlX3Byb3QgPSAxOwoJZWxzZQoJCXRhcGUtPndyaXRlX3Byb3Qg PSB0YXBlLT5kcnZfd3JpdGVfcHJvdDsKCgkvKiBNYWtlIHN1cmUgZHJpdmUgaXNuJ3Qgd3JpdGUg cHJvdGVjdGVkIGlmIHVzZXIgd2FudHMgdG8gd3JpdGUuICovCglpZiAodGFwZS0+d3JpdGVfcHJv dCkgewoJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkgfHwKCQkg ICAgKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikgewoJCQljbGVhcl9iaXQo SURFX0FGTEFHX0JVU1ksICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwoJCQlyZXR2YWwgPSAtRVJPRlM7 CgkJCWdvdG8gb3V0X3B1dF90YXBlOwoJCX0KCX0KCgkvKiBMb2NrIHRoZSB0YXBlIGRyaXZlIGRv b3Igc28gdXNlciBjYW4ndCBlamVjdC4gKi8KCWlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRB UEVfRElSX05PTkUpIHsKCQlpZiAoIWlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgdGFwZS0+ZGlz aywgMSkpIHsKCQkJaWYgKHRhcGUtPmRvb3JfbG9ja2VkICE9IERPT1JfRVhQTElDSVRMWV9MT0NL RUQpCgkJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfTE9DS0VEOwoJCX0KCX0KCXVubG9ja19r ZXJuZWwoKTsKCXJldHVybiAwOwoKb3V0X3B1dF90YXBlOgoJaWRlX3RhcGVfcHV0KHRhcGUpOwoJ dW5sb2NrX2tlcm5lbCgpOwoJcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIHZvaWQgaWRldGFwZV93 cml0ZV9yZWxlYXNlKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IG1pbm9yKQp7Cglp ZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCglpZGVfdGFwZV9mbHVz aF9tZXJnZV9idWZmZXIoZHJpdmUpOwoJdGFwZS0+bWVyZ2VfYmggPSBpZGVfdGFwZV9rbWFsbG9j X2J1ZmZlcih0YXBlLCAxLCAwKTsKCWlmICh0YXBlLT5tZXJnZV9iaCAhPSBOVUxMKSB7CgkJaWRl dGFwZV9wYWRfemVyb3MoZHJpdmUsIHRhcGUtPmJsa19zaXplICoKCQkJCSh0YXBlLT51c2VyX2Jz X2ZhY3RvciAtIDEpKTsKCQlpZGVfdGFwZV9rZnJlZV9idWZmZXIodGFwZSk7CgkJdGFwZS0+bWVy Z2VfYmggPSBOVUxMOwoJfQoJaWRldGFwZV93cml0ZV9maWxlbWFyayhkcml2ZSk7CglpZGV0YXBl X2ZsdXNoX3RhcGVfYnVmZmVycyhkcml2ZSk7CglpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhk cml2ZSk7Cn0KCnN0YXRpYyBpbnQgaWRldGFwZV9jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUg Kmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKewoJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9 IGZpbHAtPnByaXZhdGVfZGF0YTsKCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwoJ dW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKCglsb2NrX2tlcm5lbCgpOwoJdGFw ZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCglkZWJ1Z19sb2coREJHX0NIUkRFViwgIkVudGVyICVz XG4iLCBfX2Z1bmNfXyk7CgoJaWYgKHRhcGUtPmNocmRldl9kaXIgPT0gSURFVEFQRV9ESVJfV1JJ VEUpCgkJaWRldGFwZV93cml0ZV9yZWxlYXNlKGRyaXZlLCBtaW5vcik7CglpZiAodGFwZS0+Y2hy ZGV2X2RpciA9PSBJREVUQVBFX0RJUl9SRUFEKSB7CgkJaWYgKG1pbm9yIDwgMTI4KQoJCQlpZGVf dGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZlcihkcml2ZSwgMSk7Cgl9CgoJaWYgKG1pbm9yIDwgMTI4 ICYmIHRlc3RfYml0KElERV9BRkxBR19NRURJVU1fUFJFU0VOVCwgJmRyaXZlLT5hdGFwaV9mbGFn cykpCgkJKHZvaWQpIGlkZXRhcGVfcmV3aW5kX3RhcGUoZHJpdmUpOwoJaWYgKHRhcGUtPmNocmRl dl9kaXIgPT0gSURFVEFQRV9ESVJfTk9ORSkgewoJCWlmICh0YXBlLT5kb29yX2xvY2tlZCA9PSBE T09SX0xPQ0tFRCkgewoJCQlpZiAoIWlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgdGFwZS0+ZGlz aywgMCkpCgkJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfVU5MT0NLRUQ7CgkJfQoJfQoJY2xl YXJfYml0KElERV9BRkxBR19CVVNZLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKCWlkZV90YXBlX3B1 dCh0YXBlKTsKCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBpZGV0 YXBlX2dldF9pbnF1aXJ5X3Jlc3VsdHMoaWRlX2RyaXZlX3QgKmRyaXZlKQp7CglpZGV0YXBlX3Rh cGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7 CgljaGFyIGZ3X3Jldls0XSwgdmVuZG9yX2lkWzhdLCBwcm9kdWN0X2lkWzE2XTsKCglpZGV0YXBl X2NyZWF0ZV9pbnF1aXJ5X2NtZCgmcGMpOwoJaWYgKGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCB0 YXBlLT5kaXNrLCAmcGMpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IGNhbid0 IGdldCBJTlFVSVJZIHJlc3VsdHNcbiIsCgkJCQl0YXBlLT5uYW1lKTsKCQlyZXR1cm47Cgl9Cglt ZW1jcHkodmVuZG9yX2lkLCAmcGMuYnVmWzhdLCA4KTsKCW1lbWNweShwcm9kdWN0X2lkLCAmcGMu YnVmWzE2XSwgMTYpOwoJbWVtY3B5KGZ3X3JldiwgJnBjLmJ1ZlszMl0sIDQpOwoKCWlkZV9maXhz dHJpbmcodmVuZG9yX2lkLCA4LCAwKTsKCWlkZV9maXhzdHJpbmcocHJvZHVjdF9pZCwgMTYsIDAp OwoJaWRlX2ZpeHN0cmluZyhmd19yZXYsIDQsIDApOwoKCXByaW50ayhLRVJOX0lORk8gImlkZS10 YXBlOiAlcyA8LT4gJXM6ICUuOHMgJS4xNnMgcmV2ICUuNHNcbiIsCgkJCWRyaXZlLT5uYW1lLCB0 YXBlLT5uYW1lLCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsIGZ3X3Jldik7Cn0KCi8qCiAqIEFzayB0 aGUgdGFwZSBhYm91dCBpdHMgdmFyaW91cyBwYXJhbWV0ZXJzLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3 aWxsIGFkanVzdCBvdXIKICogZGF0YSB0cmFuc2ZlciBidWZmZXIJc2l6ZSB0byB0aGUgcmVjb21t ZW5kZWQgdmFsdWUgYXMgcmV0dXJuZWQgYnkgdGhlIHRhcGUuCiAqLwpzdGF0aWMgdm9pZCBpZGV0 YXBlX2dldF9tb2RlX3NlbnNlX3Jlc3VsdHMoaWRlX2RyaXZlX3QgKmRyaXZlKQp7CglpZGV0YXBl X3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKCXN0cnVjdCBpZGVfYXRhcGlfcGMg cGM7Cgl1OCAqY2FwczsKCXU4IHNwZWVkLCBtYXhfc3BlZWQ7CgoJaWRldGFwZV9jcmVhdGVfbW9k ZV9zZW5zZV9jbWQoJnBjLCBJREVUQVBFX0NBUEFCSUxJVElFU19QQUdFKTsKCWlmIChpZGVfcXVl dWVfcGNfdGFpbChkcml2ZSwgdGFwZS0+ZGlzaywgJnBjKSkgewoJCXByaW50ayhLRVJOX0VSUiAi aWRlLXRhcGU6IENhbid0IGdldCB0YXBlIHBhcmFtZXRlcnMgLSBhc3N1bWluZyIKCQkJCSIgc29t ZSBkZWZhdWx0IHZhbHVlc1xuIik7CgkJdGFwZS0+YmxrX3NpemUgPSA1MTI7CgkJcHV0X3VuYWxp Z25lZCg1MiwgICAodTE2ICopJnRhcGUtPmNhcHNbMTJdKTsKCQlwdXRfdW5hbGlnbmVkKDU0MCwg ICh1MTYgKikmdGFwZS0+Y2Fwc1sxNF0pOwoJCXB1dF91bmFsaWduZWQoNio1MiwgKHUxNiAqKSZ0 YXBlLT5jYXBzWzE2XSk7CgkJcmV0dXJuOwoJfQoJY2FwcyA9IHBjLmJ1ZiArIDQgKyBwYy5idWZb M107CgoJLyogY29udmVydCB0byBob3N0IG9yZGVyIGFuZCBzYXZlIGZvciBsYXRlciB1c2UgKi8K CXNwZWVkID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikmY2Fwc1sxNF0pOwoJbWF4X3NwZWVkID0g YmUxNl90b19jcHVwKChfX2JlMTYgKikmY2Fwc1s4XSk7CgoJKih1MTYgKikmY2Fwc1s4XSA9IG1h eF9zcGVlZDsKCSoodTE2ICopJmNhcHNbMTJdID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikmY2Fw c1sxMl0pOwoJKih1MTYgKikmY2Fwc1sxNF0gPSBzcGVlZDsKCSoodTE2ICopJmNhcHNbMTZdID0g YmUxNl90b19jcHVwKChfX2JlMTYgKikmY2Fwc1sxNl0pOwoKCWlmICghc3BlZWQpIHsKCQlwcmlu dGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXM6IGludmFsaWQgdGFwZSBzcGVlZCAiCgkJCQkiKGFz c3VtaW5nIDY1MEtCL3NlYylcbiIsIGRyaXZlLT5uYW1lKTsKCQkqKHUxNiAqKSZjYXBzWzE0XSA9 IDY1MDsKCX0KCWlmICghbWF4X3NwZWVkKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6 ICVzOiBpbnZhbGlkIG1heF9zcGVlZCAiCgkJCQkiKGFzc3VtaW5nIDY1MEtCL3NlYylcbiIsIGRy aXZlLT5uYW1lKTsKCQkqKHUxNiAqKSZjYXBzWzhdID0gNjUwOwoJfQoKCW1lbWNweSgmdGFwZS0+ Y2FwcywgY2FwcywgMjApOwoKCS8qIGRldmljZSBsYWNrcyBsb2NraW5nIHN1cHBvcnQgYWNjb3Jk aW5nIHRvIGNhcGFiaWxpdGllcyBwYWdlICovCglpZiAoKGNhcHNbNl0gJiAxKSA9PSAwKQoJCWRy aXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19ET09STE9DS0lORzsKCglpZiAoY2Fwc1s3XSAm IDB4MDIpCgkJdGFwZS0+YmxrX3NpemUgPSA1MTI7CgllbHNlIGlmIChjYXBzWzddICYgMHgwNCkK CQl0YXBlLT5ibGtfc2l6ZSA9IDEwMjQ7Cn0KCiNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKI2Rl ZmluZSBpZGVfdGFwZV9kZXZzZXRfZ2V0KG5hbWUsIGZpZWxkKSBcCnN0YXRpYyBpbnQgZ2V0XyMj bmFtZShpZGVfZHJpdmVfdCAqZHJpdmUpIFwKeyBcCglpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRy aXZlLT5kcml2ZXJfZGF0YTsgXAoJcmV0dXJuIHRhcGUtPmZpZWxkOyBcCn0KCiNkZWZpbmUgaWRl X3RhcGVfZGV2c2V0X3NldChuYW1lLCBmaWVsZCkgXApzdGF0aWMgaW50IHNldF8jI25hbWUoaWRl X2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKSBcCnsgXAoJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBk cml2ZS0+ZHJpdmVyX2RhdGE7IFwKCXRhcGUtPmZpZWxkID0gYXJnOyBcCglyZXR1cm4gMDsgXAp9 CgojZGVmaW5lIGlkZV90YXBlX2RldnNldF9yd19maWVsZChfbmFtZSwgX2ZpZWxkKSBcCmlkZV90 YXBlX2RldnNldF9nZXQoX25hbWUsIF9maWVsZCkgXAppZGVfdGFwZV9kZXZzZXRfc2V0KF9uYW1l LCBfZmllbGQpIFwKSURFX0RFVlNFVChfbmFtZSwgRFNfU1lOQywgZ2V0XyMjX25hbWUsIHNldF8j I19uYW1lKQoKI2RlZmluZSBpZGVfdGFwZV9kZXZzZXRfcl9maWVsZChfbmFtZSwgX2ZpZWxkKSBc CmlkZV90YXBlX2RldnNldF9nZXQoX25hbWUsIF9maWVsZCkgXApJREVfREVWU0VUKF9uYW1lLCAw LCBnZXRfIyNfbmFtZSwgTlVMTCkKCnN0YXRpYyBpbnQgbXVsZl90ZHNjKGlkZV9kcml2ZV90ICpk cml2ZSkJeyByZXR1cm4gMTAwMDsgfQpzdGF0aWMgaW50IGRpdmZfdGRzYyhpZGVfZHJpdmVfdCAq ZHJpdmUpCXsgcmV0dXJuICAgSFo7IH0Kc3RhdGljIGludCBkaXZmX2J1ZmZlcihpZGVfZHJpdmVf dCAqZHJpdmUpCXsgcmV0dXJuICAgIDI7IH0Kc3RhdGljIGludCBkaXZmX2J1ZmZlcl9zaXplKGlk ZV9kcml2ZV90ICpkcml2ZSkJeyByZXR1cm4gMTAyNDsgfQoKaWRlX2RldnNldF9yd19mbGFnKGRz Y19vdmVybGFwLCBJREVfREZMQUdfRFNDX09WRVJMQVApOwoKaWRlX3RhcGVfZGV2c2V0X3J3X2Zp ZWxkKGRlYnVnX21hc2ssIGRlYnVnX21hc2spOwppZGVfdGFwZV9kZXZzZXRfcndfZmllbGQodGRz YywgYmVzdF9kc2NfcndfZnJlcSk7CgppZGVfdGFwZV9kZXZzZXRfcl9maWVsZChhdmdfc3BlZWQs IGF2Z19zcGVlZCk7CmlkZV90YXBlX2RldnNldF9yX2ZpZWxkKHNwZWVkLCBjYXBzWzE0XSk7Cmlk ZV90YXBlX2RldnNldF9yX2ZpZWxkKGJ1ZmZlciwgY2Fwc1sxNl0pOwppZGVfdGFwZV9kZXZzZXRf cl9maWVsZChidWZmZXJfc2l6ZSwgYnVmZmVyX3NpemUpOwoKc3RhdGljIGNvbnN0IHN0cnVjdCBp ZGVfcHJvY19kZXZzZXQgaWRldGFwZV9zZXR0aW5nc1tdID0gewoJX19JREVfUFJPQ19ERVZTRVQo YXZnX3NwZWVkLAkwLCAweGZmZmYsIE5VTEwsIE5VTEwpLAoJX19JREVfUFJPQ19ERVZTRVQoYnVm ZmVyLAkwLCAweGZmZmYsIE5VTEwsIGRpdmZfYnVmZmVyKSwKCV9fSURFX1BST0NfREVWU0VUKGJ1 ZmZlcl9zaXplLAkwLCAweGZmZmYsIE5VTEwsIGRpdmZfYnVmZmVyX3NpemUpLAoJX19JREVfUFJP Q19ERVZTRVQoZGVidWdfbWFzaywJMCwgMHhmZmZmLCBOVUxMLCBOVUxMKSwKCV9fSURFX1BST0Nf REVWU0VUKGRzY19vdmVybGFwLAkwLCAgICAgIDEsIE5VTEwsIE5VTEwpLAoJX19JREVfUFJPQ19E RVZTRVQoc3BlZWQsCTAsIDB4ZmZmZiwgTlVMTCwgTlVMTCksCglfX0lERV9QUk9DX0RFVlNFVCh0 ZHNjLAkJSURFVEFQRV9EU0NfUldfTUlOLCBJREVUQVBFX0RTQ19SV19NQVgsCgkJCQkJbXVsZl90 ZHNjLCBkaXZmX3Rkc2MpLAoJeyAwIH0sCn07CiNlbmRpZgoKLyoKICogVGhlIGZ1bmN0aW9uIGJl bG93IGlzIGNhbGxlZCB0bzoKICoKICogMS4gSW5pdGlhbGl6ZSBvdXIgdmFyaW91cyBzdGF0ZSB2 YXJpYWJsZXMuCiAqIDIuIEFzayB0aGUgdGFwZSBmb3IgaXRzIGNhcGFiaWxpdGllcy4KICogMy4g QWxsb2NhdGUgYSBidWZmZXIgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBkYXRhIHRyYW5zZmVyLiBU aGUgYnVmZmVyIHNpemUKICogaXMgY2hvc2VuIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRhdGlvbiB3 aGljaCB3ZSByZWNlaXZlZCBpbiBzdGVwIDIuCiAqCiAqIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50 IGlkZS5jIGFscmVhZHkgYXNzaWduZWQgdXMgYW4gaXJxLCBzbyB0aGF0IHdlIGNhbgogKiBxdWV1 ZSByZXF1ZXN0cyBoZXJlIGFuZCB3YWl0IGZvciB0aGVpciBjb21wbGV0aW9uLgogKi8Kc3RhdGlj IHZvaWQgaWRldGFwZV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXRhcGVfdGFwZV90ICp0 YXBlLCBpbnQgbWlub3IpCnsKCXVuc2lnbmVkIGxvbmcgdDsKCWludCBzcGVlZDsKCWludCBidWZm ZXJfc2l6ZTsKCXUxNiAqY3RsID0gKHUxNiAqKSZ0YXBlLT5jYXBzWzEyXTsKCglkcml2ZS0+cGNf Y2FsbGJhY2sJID0gaWRlX3RhcGVfY2FsbGJhY2s7Cglkcml2ZS0+cGNfdXBkYXRlX2J1ZmZlcnMg PSBpZGV0YXBlX3VwZGF0ZV9idWZmZXJzOwoJZHJpdmUtPnBjX2lvX2J1ZmZlcnMJID0gaWRlX3Rh cGVfaW9fYnVmZmVyczsKCglzcGluX2xvY2tfaW5pdCgmdGFwZS0+bG9jayk7CgoJZHJpdmUtPmRl dl9mbGFncyB8PSBJREVfREZMQUdfRFNDX09WRVJMQVA7CgoJaWYgKGRyaXZlLT5od2lmLT5ob3N0 X2ZsYWdzICYgSURFX0hGTEFHX05PX0RTQykgewoJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBl OiAlczogZGlzYWJsaW5nIERTQyBvdmVybGFwXG4iLAoJCQkJIHRhcGUtPm5hbWUpOwoJCWRyaXZl LT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19EU0NfT1ZFUkxBUDsKCX0KCgkvKiBTZWFnYXRlIFRy YXZhbiBkcml2ZXMgZG8gbm90IHN1cHBvcnQgRFNDIG92ZXJsYXAuICovCglpZiAoc3Ryc3RyKChj aGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF0sICJTZWFnYXRlIFNUVDM0MDEiKSkKCQlkcml2 ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7CgoJdGFwZS0+bWlub3IgPSBt aW5vcjsKCXRhcGUtPm5hbWVbMF0gPSAnaCc7Cgl0YXBlLT5uYW1lWzFdID0gJ3QnOwoJdGFwZS0+ bmFtZVsyXSA9ICcwJyArIG1pbm9yOwoJdGFwZS0+Y2hyZGV2X2RpciA9IElERVRBUEVfRElSX05P TkU7CgoJaWRldGFwZV9nZXRfaW5xdWlyeV9yZXN1bHRzKGRyaXZlKTsKCWlkZXRhcGVfZ2V0X21v ZGVfc2Vuc2VfcmVzdWx0cyhkcml2ZSk7CglpZGVfdGFwZV9nZXRfYnNpemVfZnJvbV9iZGVzYyhk cml2ZSk7Cgl0YXBlLT51c2VyX2JzX2ZhY3RvciA9IDE7Cgl0YXBlLT5idWZmZXJfc2l6ZSA9ICpj dGwgKiB0YXBlLT5ibGtfc2l6ZTsKCXdoaWxlICh0YXBlLT5idWZmZXJfc2l6ZSA+IDB4ZmZmZikg ewoJCXByaW50ayhLRVJOX05PVElDRSAiaWRlLXRhcGU6IGRlY3JlYXNpbmcgc3RhZ2Ugc2l6ZVxu Iik7CgkJKmN0bCAvPSAyOwoJCXRhcGUtPmJ1ZmZlcl9zaXplID0gKmN0bCAqIHRhcGUtPmJsa19z aXplOwoJfQoJYnVmZmVyX3NpemUgPSB0YXBlLT5idWZmZXJfc2l6ZTsKCXRhcGUtPnBhZ2VzX3Bl cl9idWZmZXIgPSBidWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKCWlmIChidWZmZXJfc2l6ZSAlIFBB R0VfU0laRSkgewoJCXRhcGUtPnBhZ2VzX3Blcl9idWZmZXIrKzsKCQl0YXBlLT5leGNlc3NfYmhf c2l6ZSA9IFBBR0VfU0laRSAtIGJ1ZmZlcl9zaXplICUgUEFHRV9TSVpFOwoJfQoKCS8qIHNlbGVj dCB0aGUgImJlc3QiIERTQyByZWFkL3dyaXRlIHBvbGxpbmcgZnJlcSAqLwoJc3BlZWQgPSBtYXgo Kih1MTYgKikmdGFwZS0+Y2Fwc1sxNF0sICoodTE2ICopJnRhcGUtPmNhcHNbOF0pOwoKCXQgPSAo SURFVEFQRV9GSUZPX1RIUkVTSE9MRCAqIHRhcGUtPmJ1ZmZlcl9zaXplICogSFopIC8gKHNwZWVk ICogMTAwMCk7CgoJLyoKCSAqIEVuc3VyZSB0aGF0IHRoZSBudW1iZXIgd2UgZ290IG1ha2VzIHNl bnNlOyBsaW1pdCBpdCB3aXRoaW4KCSAqIElERVRBUEVfRFNDX1JXX01JTiBhbmQgSURFVEFQRV9E U0NfUldfTUFYLgoJICovCgl0YXBlLT5iZXN0X2RzY19yd19mcmVxID0gY2xhbXBfdCh1bnNpZ25l ZCBsb25nLCB0LCBJREVUQVBFX0RTQ19SV19NSU4sCgkJCQkJIElERVRBUEVfRFNDX1JXX01BWCk7 CglwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXMgPC0+ICVzOiAlZEtCcHMsICVkKiVka0Ig YnVmZmVyLCAiCgkJIiVsdW1zIHREU0Mlc1xuIiwKCQlkcml2ZS0+bmFtZSwgdGFwZS0+bmFtZSwg Kih1MTYgKikmdGFwZS0+Y2Fwc1sxNF0sCgkJKCoodTE2ICopJnRhcGUtPmNhcHNbMTZdICogNTEy KSAvIHRhcGUtPmJ1ZmZlcl9zaXplLAoJCXRhcGUtPmJ1ZmZlcl9zaXplIC8gMTAyNCwKCQl0YXBl LT5iZXN0X2RzY19yd19mcmVxICogMTAwMCAvIEhaLAoJCShkcml2ZS0+ZGV2X2ZsYWdzICYgSURF X0RGTEFHX1VTSU5HX0RNQSkgPyAiLCBETUEiIDogIiIpOwoKCWlkZV9wcm9jX3JlZ2lzdGVyX2Ry aXZlcihkcml2ZSwgdGFwZS0+ZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVtb3Zl KGlkZV9kcml2ZV90ICpkcml2ZSkKewoJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJp dmVyX2RhdGE7CgoJaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsIHRhcGUtPmRyaXZl cik7CgoJaWRlX3VucmVnaXN0ZXJfcmVnaW9uKHRhcGUtPmRpc2spOwoKCWlkZV90YXBlX3B1dCh0 YXBlKTsKfQoKc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikK ewoJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IHRvX2lkZV9kcnYoa3JlZiwgaWRlX3RhcGVf b2JqKTsKCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwoJc3RydWN0IGdlbmRpc2sg KmcgPSB0YXBlLT5kaXNrOwoKCUJVR19PTih0YXBlLT5tZXJnZV9iaF9zaXplKTsKCglkcml2ZS0+ ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7Cglkcml2ZS0+ZHJpdmVyX2RhdGEg PSBOVUxMOwoJZGV2aWNlX2Rlc3Ryb3koaWRldGFwZV9zeXNmc19jbGFzcywgTUtERVYoSURFVEFQ RV9NQUpPUiwgdGFwZS0+bWlub3IpKTsKCWRldmljZV9kZXN0cm95KGlkZXRhcGVfc3lzZnNfY2xh c3MsCgkJCU1LREVWKElERVRBUEVfTUFKT1IsIHRhcGUtPm1pbm9yICsgMTI4KSk7CglpZGV0YXBl X2RldnNbdGFwZS0+bWlub3JdID0gTlVMTDsKCWctPnByaXZhdGVfZGF0YSA9IE5VTEw7CglwdXRf ZGlzayhnKTsKCWtmcmVlKHRhcGUpOwp9CgojaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCnN0YXRp YyBpbnQgcHJvY19pZGV0YXBlX3JlYWRfbmFtZQoJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwg b2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQp7CglpZGVfZHJpdmVf dAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKCWlkZXRhcGVfdGFwZV90CSp0YXBlID0g ZHJpdmUtPmRyaXZlcl9kYXRhOwoJY2hhcgkJKm91dCA9IHBhZ2U7CglpbnQJCWxlbjsKCglsZW4g PSBzcHJpbnRmKG91dCwgIiVzXG4iLCB0YXBlLT5uYW1lKTsKCVBST0NfSURFX1JFQURfUkVUVVJO KHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cn0KCnN0YXRpYyBpZGVfcHJvY19l bnRyeV90IGlkZXRhcGVfcHJvY1tdID0gewoJeyAiY2FwYWNpdHkiLAlTX0lGUkVHfFNfSVJVR08s CXByb2NfaWRlX3JlYWRfY2FwYWNpdHksIE5VTEwgfSwKCXsgIm5hbWUiLAlTX0lGUkVHfFNfSVJV R08sCXByb2NfaWRldGFwZV9yZWFkX25hbWUsCU5VTEwgfSwKCXsgTlVMTCwgMCwgTlVMTCwgTlVM TCB9Cn07CgpzdGF0aWMgaWRlX3Byb2NfZW50cnlfdCAqaWRlX3RhcGVfcHJvY19lbnRyaWVzKGlk ZV9kcml2ZV90ICpkcml2ZSkKewoJcmV0dXJuIGlkZXRhcGVfcHJvYzsKfQoKc3RhdGljIGNvbnN0 IHN0cnVjdCBpZGVfcHJvY19kZXZzZXQgKmlkZV90YXBlX3Byb2NfZGV2c2V0cyhpZGVfZHJpdmVf dCAqZHJpdmUpCnsKCXJldHVybiBpZGV0YXBlX3NldHRpbmdzOwp9CiNlbmRpZgoKc3RhdGljIGlu dCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKCnN0YXRpYyBpZGVfZHJpdmVyX3QgaWRl dGFwZV9kcml2ZXIgPSB7CgkuZ2VuX2RyaXZlciA9IHsKCQkub3duZXIJCT0gVEhJU19NT0RVTEUs CgkJLm5hbWUJCT0gImlkZS10YXBlIiwKCQkuYnVzCQk9ICZpZGVfYnVzX3R5cGUsCgl9LAoJLnBy b2JlCQkJPSBpZGVfdGFwZV9wcm9iZSwKCS5yZW1vdmUJCQk9IGlkZV90YXBlX3JlbW92ZSwKCS52 ZXJzaW9uCQk9IElERVRBUEVfVkVSU0lPTiwKCS5kb19yZXF1ZXN0CQk9IGlkZXRhcGVfZG9fcmVx dWVzdCwKCS5lbmRfcmVxdWVzdAkJPSBpZGV0YXBlX2VuZF9yZXF1ZXN0LAoJLmVycm9yCQkJPSBf X2lkZV9lcnJvciwKI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwoJLnByb2NfZW50cmllcwkJPSBp ZGVfdGFwZV9wcm9jX2VudHJpZXMsCgkucHJvY19kZXZzZXRzCQk9IGlkZV90YXBlX3Byb2NfZGV2 c2V0cywKI2VuZGlmCn07CgovKiBPdXIgY2hhcmFjdGVyIGRldmljZSBzdXBwb3J0aW5nIGZ1bmN0 aW9ucywgcGFzc2VkIHRvIHJlZ2lzdGVyX2NocmRldi4gKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBm aWxlX29wZXJhdGlvbnMgaWRldGFwZV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJ LnJlYWQJCT0gaWRldGFwZV9jaHJkZXZfcmVhZCwKCS53cml0ZQkJPSBpZGV0YXBlX2NocmRldl93 cml0ZSwKCS5pb2N0bAkJPSBpZGV0YXBlX2NocmRldl9pb2N0bCwKCS5vcGVuCQk9IGlkZXRhcGVf Y2hyZGV2X29wZW4sCgkucmVsZWFzZQk9IGlkZXRhcGVfY2hyZGV2X3JlbGVhc2UsCn07CgpzdGF0 aWMgaW50IGlkZXRhcGVfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1v ZGUpCnsKCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9nZXQoYmRldi0+YmRf ZGlzayk7CgoJaWYgKCF0YXBlKQoJCXJldHVybiAtRU5YSU87CgoJcmV0dXJuIDA7Cn0KCnN0YXRp YyBpbnQgaWRldGFwZV9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90IG1vZGUp CnsKCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfZHJ2X2coZGlzaywgaWRlX3RhcGVf b2JqKTsKCglpZGVfdGFwZV9wdXQodGFwZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBpZGV0 YXBlX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKCQkJdW5z aWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBpZGVfdGFwZV9vYmog KnRhcGUgPSBpZGVfZHJ2X2coYmRldi0+YmRfZGlzaywgaWRlX3RhcGVfb2JqKTsKCWlkZV9kcml2 ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwoJaW50IGVyciA9IGdlbmVyaWNfaWRlX2lvY3RsKGRy aXZlLCBiZGV2LCBjbWQsIGFyZyk7CglpZiAoZXJyID09IC1FSU5WQUwpCgkJZXJyID0gaWRldGFw ZV9ibGtkZXZfaW9jdGwoZHJpdmUsIGNtZCwgYXJnKTsKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBz dHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgaWRldGFwZV9ibG9ja19vcHMgPSB7Cgkub3du ZXIJCT0gVEhJU19NT0RVTEUsCgkub3BlbgkJPSBpZGV0YXBlX29wZW4sCgkucmVsZWFzZQk9IGlk ZXRhcGVfcmVsZWFzZSwKCS5sb2NrZWRfaW9jdGwJPSBpZGV0YXBlX2lvY3RsLAp9OwoKc3RhdGlj IGludCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCnsKCWlkZXRhcGVfdGFwZV90 ICp0YXBlOwoJc3RydWN0IGdlbmRpc2sgKmc7CglpbnQgbWlub3I7CgoJaWYgKCFzdHJzdHIoImlk ZS10YXBlIiwgZHJpdmUtPmRyaXZlcl9yZXEpKQoJCWdvdG8gZmFpbGVkOwoKCWlmIChkcml2ZS0+ bWVkaWEgIT0gaWRlX3RhcGUpCgkJZ290byBmYWlsZWQ7CgoJaWYgKChkcml2ZS0+ZGV2X2ZsYWdz ICYgSURFX0RGTEFHX0lEX1JFQUQpICYmCgkgICAgaWRlX2NoZWNrX2F0YXBpX2RldmljZShkcml2 ZSwgRFJWX05BTUUpID09IDApIHsKCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogbm90 IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YiCgkJCQkiIHRoZSBkcml2ZXJcbiIsIGRyaXZl LT5uYW1lKTsKCQlnb3RvIGZhaWxlZDsKCX0KCXRhcGUgPSBremFsbG9jKHNpemVvZihpZGV0YXBl X3RhcGVfdCksIEdGUF9LRVJORUwpOwoJaWYgKHRhcGUgPT0gTlVMTCkgewoJCXByaW50ayhLRVJO X0VSUiAiaWRlLXRhcGU6ICVzOiBDYW4ndCBhbGxvY2F0ZSBhIHRhcGUgc3RydWN0XG4iLAoJCQkJ ZHJpdmUtPm5hbWUpOwoJCWdvdG8gZmFpbGVkOwoJfQoKCWcgPSBhbGxvY19kaXNrKDEgPDwgUEFS VE5fQklUUyk7CglpZiAoIWcpCgkJZ290byBvdXRfZnJlZV90YXBlOwoKCWlkZV9pbml0X2Rpc2so ZywgZHJpdmUpOwoKCWtyZWZfaW5pdCgmdGFwZS0+a3JlZik7CgoJdGFwZS0+ZHJpdmUgPSBkcml2 ZTsKCXRhcGUtPmRyaXZlciA9ICZpZGV0YXBlX2RyaXZlcjsKCXRhcGUtPmRpc2sgPSBnOwoKCWct PnByaXZhdGVfZGF0YSA9ICZ0YXBlLT5kcml2ZXI7CgoJZHJpdmUtPmRyaXZlcl9kYXRhID0gdGFw ZTsKCgltdXRleF9sb2NrKCZpZGV0YXBlX3JlZl9tdXRleCk7Cglmb3IgKG1pbm9yID0gMDsgaWRl dGFwZV9kZXZzW21pbm9yXTsgbWlub3IrKykKCQk7CglpZGV0YXBlX2RldnNbbWlub3JdID0gdGFw ZTsKCW11dGV4X3VubG9jaygmaWRldGFwZV9yZWZfbXV0ZXgpOwoKCWlkZXRhcGVfc2V0dXAoZHJp dmUsIHRhcGUsIG1pbm9yKTsKCglkZXZpY2VfY3JlYXRlKGlkZXRhcGVfc3lzZnNfY2xhc3MsICZk cml2ZS0+Z2VuZGV2LAoJCSAgICAgIE1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yKSwgTlVMTCwg IiVzIiwgdGFwZS0+bmFtZSk7CglkZXZpY2VfY3JlYXRlKGlkZXRhcGVfc3lzZnNfY2xhc3MsICZk cml2ZS0+Z2VuZGV2LAoJCSAgICAgIE1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yICsgMTI4KSwg TlVMTCwKCQkgICAgICAibiVzIiwgdGFwZS0+bmFtZSk7CgoJZy0+Zm9wcyA9ICZpZGV0YXBlX2Js b2NrX29wczsKCWlkZV9yZWdpc3Rlcl9yZWdpb24oZyk7CgoJcmV0dXJuIDA7CgpvdXRfZnJlZV90 YXBlOgoJa2ZyZWUodGFwZSk7CmZhaWxlZDoKCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgdm9p ZCBfX2V4aXQgaWRldGFwZV9leGl0KHZvaWQpCnsKCWRyaXZlcl91bnJlZ2lzdGVyKCZpZGV0YXBl X2RyaXZlci5nZW5fZHJpdmVyKTsKCWNsYXNzX2Rlc3Ryb3koaWRldGFwZV9zeXNmc19jbGFzcyk7 Cgl1bnJlZ2lzdGVyX2NocmRldihJREVUQVBFX01BSk9SLCAiaHQiKTsKfQoKc3RhdGljIGludCBf X2luaXQgaWRldGFwZV9pbml0KHZvaWQpCnsKCWludCBlcnJvciA9IDE7CglpZGV0YXBlX3N5c2Zz X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiaWRlX3RhcGUiKTsKCWlmIChJU19F UlIoaWRldGFwZV9zeXNmc19jbGFzcykpIHsKCQlpZGV0YXBlX3N5c2ZzX2NsYXNzID0gTlVMTDsK CQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgc3lzZnMgY2xhc3MgZm9yIGlkZSB0 YXBlc1xuIik7CgkJZXJyb3IgPSAtRUJVU1k7CgkJZ290byBvdXQ7Cgl9CgoJaWYgKHJlZ2lzdGVy X2NocmRldihJREVUQVBFX01BSk9SLCAiaHQiLCAmaWRldGFwZV9mb3BzKSkgewoJCXByaW50ayhL RVJOX0VSUiAiaWRlLXRhcGU6IEZhaWxlZCB0byByZWdpc3RlciBjaHJkZXYiCgkJCQkiIGludGVy ZmFjZVxuIik7CgkJZXJyb3IgPSAtRUJVU1k7CgkJZ290byBvdXRfZnJlZV9jbGFzczsKCX0KCgll cnJvciA9IGRyaXZlcl9yZWdpc3RlcigmaWRldGFwZV9kcml2ZXIuZ2VuX2RyaXZlcik7CglpZiAo ZXJyb3IpCgkJZ290byBvdXRfZnJlZV9kcml2ZXI7CgoJcmV0dXJuIDA7CgpvdXRfZnJlZV9kcml2 ZXI6Cglkcml2ZXJfdW5yZWdpc3RlcigmaWRldGFwZV9kcml2ZXIuZ2VuX2RyaXZlcik7Cm91dF9m cmVlX2NsYXNzOgoJY2xhc3NfZGVzdHJveShpZGV0YXBlX3N5c2ZzX2NsYXNzKTsKb3V0OgoJcmV0 dXJuIGVycm9yOwp9CgpNT0RVTEVfQUxJQVMoImlkZToqbS10YXBlKiIpOwptb2R1bGVfaW5pdChp ZGV0YXBlX2luaXQpOwptb2R1bGVfZXhpdChpZGV0YXBlX2V4aXQpOwpNT0RVTEVfQUxJQVNfQ0hB UkRFVl9NQUpPUihJREVUQVBFX01BSk9SKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJBVEFQSSBTdHJl YW1pbmcgVEFQRSBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoACg==