From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <13426df10709191242o5aa7c124m6f943ceef61f8d2a@mail.gmail.com> Date: Wed, 19 Sep 2007 12:42:47 -0700 From: "ron minnich" To: "Fans of the OS Plan 9 from Bell Labs" <9fans@cse.psu.edu> Subject: Re: [9fans] THNX linux kernel In-Reply-To: <7e7c42d4dac527cf66a872848b63715d@mail.rpi.edu> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_17574_423155.1190230967982" References: <13426df10709042258g3d46c6a3nb74757e95e125002@mail.gmail.com> <7e7c42d4dac527cf66a872848b63715d@mail.rpi.edu> Topicbox-Message-UUID: c14211c4-ead2-11e9-9d60-3106f5b1d025 ------=_Part_17574_423155.1190230967982 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On 9/19/07, cummij@rpi.edu wrote: > > lguest: Mmapping vmlinux seg 0 gave 0xffffffff not 0x100000: invalid argument > lguest: Mmapping vmlinux seg 1 gave 0xffffffff not 0x16e000: invalid argument > lguest: syscall 64 is not resolved! > lguest used greatest stack depth: 1580 bytes left you need my patched lguest.c, which I have attached. That kernel must not have my patches, hmm, I will put my latest kernel tree onto sources in just a minute. It is rc6. It has some better improvements in it from Rusty. I may have to make clean in it as the tree is HUGE. Thanks ron ------=_Part_17574_423155.1190230967982 Content-Type: text/x-csrc; name="lguest.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="lguest.c" X-Attachment-Id: f_f6s8muyl LypQOjEwMCBUaGlzIGlzIHRoZSBMYXVuY2hlciBjb2RlLCBhIHNpbXBsZSBwcm9ncmFtIHdoaWNo IGxheXMgb3V0IHRoZQogKiAicGh5c2ljYWwiIG1lbW9yeSBmb3IgdGhlIG5ldyBHdWVzdCBieSBt YXBwaW5nIHRoZSBrZXJuZWwgaW1hZ2UgYW5kIHRoZQogKiB2aXJ0dWFsIGRldmljZXMsIHRoZW4g cmVhZHMgcmVwZWF0ZWRseSBmcm9tIC9kZXYvbGd1ZXN0IHRvIHJ1biB0aGUgR3Vlc3QuCiAqCiAq IFRoZSBvbmx5IHRyaWNrOiB0aGUgTWFrZWZpbGUgbGlua3MgaXQgYXQgYSBoaWdoIGFkZHJlc3Mg c28gaXQgd2lsbCBiZSBjbGVhcgogKiBvZiB0aGUgZ3Vlc3QgbWVtb3J5IHJlZ2lvbi4gIEl0IG1l YW5zIHRoYXQgZWFjaCBHdWVzdCBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4KICogYWJvdXQgMi41RyBv ZiBtZW1vcnkgb24gYSBub3JtYWxseSBjb25maWd1cmVkIEhvc3QuIDoqLwojZGVmaW5lIF9MQVJH RUZJTEU2NF9TT1VSQ0UKI2RlZmluZSBfR05VX1NPVVJDRQojaW5jbHVkZSA8c3RkaW8uaD4KI2lu Y2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxlcnIuaD4KI2lu Y2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxlbGYuaD4KI2lu Y2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9z dGF0Lmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUg PHN0ZGJvb2wuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVk ZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvdGlt ZS5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8 bmV0L2lmLmg+CiNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiNpbmNsdWRlIDxsaW51eC9pZl90 dW4uaD4KI2luY2x1ZGUgPHN5cy91aW8uaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUg PGdldG9wdC5oPgojaW5jbHVkZSA8emxpYi5oPgovKkw6MTEwIFdlIGNhbiBpZ25vcmUgdGhlIDI4 IGluY2x1ZGUgZmlsZXMgd2UgbmVlZCBmb3IgdGhpcyBwcm9ncmFtLCBidXQgSSBkbwogKiB3YW50 IHRvIGRyYXcgYXR0ZW50aW9uIHRvIHRoZSB1c2Ugb2Yga2VybmVsLXN0eWxlIHR5cGVzLgogKgog KiBBcyBMaW51cyBzYWlkLCAiQyBpcyBhIFNwYXJ0YW4gbGFuZ3VhZ2UsIGFuZCBzbyBzaG91bGQg eW91ciBuYW1pbmcgYmUuIiAgSQogKiBsaWtlIHRoZXNlIGFiYnJldmlhdGlvbnMgYW5kIHRoZSBo ZWFkZXIgd2UgbmVlZCB1c2VzIHRoZW0sIHNvIHdlIGRlZmluZSB0aGVtCiAqIGhlcmUuCiAqLwp0 eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CnR5cGVkZWYgdWludDMyX3QgdTMyOwp0eXBl ZGVmIHVpbnQxNl90IHUxNjsKdHlwZWRlZiB1aW50OF90IHU4OwojaW5jbHVkZSAiLi4vLi4vaW5j bHVkZS9saW51eC9sZ3Vlc3RfbGF1bmNoZXIuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvYXNt LWkzODYvZTgyMC5oIgovKjoqLwoKI2RlZmluZSBQQUdFX1BSRVNFTlQgMHg3IAkvKiBQcmVzZW50 LCBSVywgRXhlY3V0ZSAqLwojZGVmaW5lIE5FVF9QRUVSTlVNIDEKI2RlZmluZSBCUklER0VfUEZY ICJicmlkZ2U6IgojaWZuZGVmIFNJT0NCUkFERElGCiNkZWZpbmUgU0lPQ0JSQURESUYJMHg4OWEy CQkvKiBhZGQgaW50ZXJmYWNlIHRvIGJyaWRnZSAgICAgICovCiNlbmRpZgoKLypMOjEyMCB2ZXJi b3NlIGlzIGJvdGggYSBnbG9iYWwgZmxhZyBhbmQgYSBtYWNyby4gIFRoZSBDIHByZXByb2Nlc3Nv ciBhbGxvd3MKICogdGhpcywgYW5kIGFsdGhvdWdoIEkgd291bGRuJ3QgcmVjb21tZW5kIGl0LCBp dCB3b3JrcyBxdWl0ZSBuaWNlbHkgaGVyZS4gKi8Kc3RhdGljIGJvb2wgdmVyYm9zZTsKI2RlZmlu ZSB2ZXJib3NlKGFyZ3MuLi4pIFwKCWRvIHsgaWYgKHZlcmJvc2UpIHByaW50ZihhcmdzKTsgfSB3 aGlsZSgwKQovKjoqLwoKLyogVGhlIHBpcGUgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgd2FrZXIg cHJvY2VzcyAqLwpzdGF0aWMgaW50IHdha2VyX2ZkOwovKiBUaGUgdG9wIG9mIGd1ZXN0IHBoeXNp Y2FsIG1lbW9yeS4gKi8Kc3RhdGljIHUzMiB0b3A7CgovKiBUaGlzIGlzIG91ciBsaXN0IG9mIGRl dmljZXMuICovCnN0cnVjdCBkZXZpY2VfbGlzdAp7CgkvKiBTdW1tYXJ5IGluZm9ybWF0aW9uIGFi b3V0IHRoZSBkZXZpY2VzIGluIG91ciBsaXN0OiByZWFkeSB0byBwYXNzIHRvCgkgKiBzZWxlY3Qo KSB0byBhc2sgd2hpY2ggbmVlZCBzZXJ2aWNpbmcuKi8KCWZkX3NldCBpbmZkczsKCWludCBtYXhf aW5mZDsKCgkvKiBUaGUgZGVzY3JpcHRvciBwYWdlIGZvciB0aGUgZGV2aWNlcy4gKi8KCXN0cnVj dCBsZ3Vlc3RfZGV2aWNlX2Rlc2MgKmRlc2NzOwoKCS8qIEEgc2luZ2xlIGxpbmtlZCBsaXN0IG9m IGRldmljZXMuICovCglzdHJ1Y3QgZGV2aWNlICpkZXY7CgkvKiAuLi4gQW5kIGFuIGVuZCBwb2lu dGVyIHNvIHdlIGNhbiBlYXNpbHkgYXBwZW5kIG5ldyBkZXZpY2VzICovCglzdHJ1Y3QgZGV2aWNl ICoqbGFzdGRldjsKfTsKCi8qIFRoZSBkZXZpY2Ugc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmds ZSBkZXZpY2UuICovCnN0cnVjdCBkZXZpY2UKewoJLyogVGhlIGxpbmtlZC1saXN0IHBvaW50ZXIu ICovCglzdHJ1Y3QgZGV2aWNlICpuZXh0OwoJLyogVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZGV2 aWNlLCBhcyBtYXBwZWQgaW50byB0aGUgR3Vlc3QuICovCglzdHJ1Y3QgbGd1ZXN0X2RldmljZV9k ZXNjICpkZXNjOwoJLyogVGhlIG1lbW9yeSBwYWdlKHMpIG9mIHRoaXMgZGV2aWNlLCBpZiBhbnku ICBBbHNvIG1hcHBlZCBpbiBHdWVzdC4gKi8KCXZvaWQgKm1lbTsKCgkvKiBJZiBoYW5kbGVfaW5w dXQgaXMgc2V0LCBpdCB3YW50cyB0byBiZSBjYWxsZWQgd2hlbiB0aGlzIGZpbGUKCSAqIGRlc2Ny aXB0b3IgaXMgcmVhZHkuICovCglpbnQgZmQ7Cglib29sICgqaGFuZGxlX2lucHV0KShpbnQgZmQs IHN0cnVjdCBkZXZpY2UgKm1lKTsKCgkvKiBJZiBoYW5kbGVfb3V0cHV0IGlzIHNldCwgaXQgd2Fu dHMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIEd1ZXN0IHNlbmRzCgkgKiBETUEgdG8gdGhpcyBrZXku ICovCgl1bnNpZ25lZCBsb25nIHdhdGNoX2tleTsKCXUzMiAoKmhhbmRsZV9vdXRwdXQpKGludCBm ZCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCgkJCSAgICAgdW5zaWduZWQgaW50IG51bSwgc3Ry dWN0IGRldmljZSAqbWUpOwoKCS8qIERldmljZS1zcGVjaWZpYyBkYXRhLiAqLwoJdm9pZCAqcHJp djsKfTsKCi8qTDoxMzAKICogTG9hZGluZyB0aGUgS2VybmVsLgogKgogKiBXZSBzdGFydCB3aXRo IGNvdXBsZSBvZiBzaW1wbGUgaGVscGVyIHJvdXRpbmVzLiAgb3Blbl9vcl9kaWUoKSBhdm9pZHMK ICogZXJyb3ItY2hlY2tpbmcgY29kZSBjbHV0dGVyaW5nIHRoZSBjYWxsZXJzOiAqLwpzdGF0aWMg aW50IG9wZW5fb3JfZGllKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKewoJaW50IGZkID0g b3BlbihuYW1lLCBmbGFncyk7CglpZiAoZmQgPCAwKQoJCWVycigxLCAiRmFpbGVkIHRvIG9wZW4g JXMiLCBuYW1lKTsKCXJldHVybiBmZDsKfQoKLyogbWFwX3plcm9lZF9wYWdlcygpIHRha2VzIGEg KHBhZ2UtYWxpZ25lZCkgYWRkcmVzcyBhbmQgYSBudW1iZXIgb2YgcGFnZXMuICovCnN0YXRpYyB2 b2lkICptYXBfemVyb2VkX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IG51 bSkKewoJLyogV2UgY2FjaGUgdGhlIC9kZXYvemVybyBmaWxlLWRlc2NyaXB0b3Igc28gd2Ugb25s eSBvcGVuIGl0IG9uY2UuICovCglzdGF0aWMgaW50IGZkID0gLTE7CgoJaWYgKGZkID09IC0xKQoJ CWZkID0gb3Blbl9vcl9kaWUoIi9kZXYvemVybyIsIE9fUkRPTkxZKTsKCgkvKiBXZSB1c2UgYSBw cml2YXRlIG1hcHBpbmcgKGllLiBpZiB3ZSB3cml0ZSB0byB0aGUgcGFnZSwgaXQgd2lsbCBiZQoJ ICogY29waWVkKSwgYW5kIG9idmlvdXNseSB3ZSBpbnNpc3QgdGhhdCBpdCBiZSBtYXBwZWQgd2hl cmUgd2UgYXNrLiAqLwoJaWYgKG1tYXAoKHZvaWQgKilhZGRyLCBnZXRwYWdlc2l6ZSgpICogbnVt LAoJCSBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIE1BUF9GSVhFRHxNQVBfUFJJVkFU RSwgZmQsIDApCgkgICAgIT0gKHZvaWQgKilhZGRyKQoJCWVycigxLCAiTW1hcGluZyAldSBwYWdl cyBvZiAvZGV2L3plcm8gQCVwIiwgbnVtLCAodm9pZCAqKWFkZHIpOwoKCS8qIFJldHVybmluZyB0 aGUgYWRkcmVzcyBpcyBqdXN0IGEgY291cnRlc3k6IGNhbiBzaW1wbGlmeSBjYWxsZXJzLiAqLwoJ cmV0dXJuICh2b2lkICopYWRkcjsKfQoKLyogVG8gZmluZCBvdXQgd2hlcmUgdG8gc3RhcnQgd2Ug bG9vayBmb3IgdGhlIG1hZ2ljIEd1ZXN0IHN0cmluZywgd2hpY2ggbWFya3MKICogdGhlIGNvZGUg d2Ugc2VlIGluIGxndWVzdF9hc20uUy4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHdlIGFyZSBjdXJy ZW50bHkKICogcGxvdHRpbmcgdG8gcmVwbGFjZSB3aXRoIHRoZSBub3JtYWwgTGludXggZW50cnkg cG9pbnQuICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGVudHJ5X3BvaW50KHZvaWQgKnN0YXJ0LCB2 b2lkICplbmQsCgkJCQkgdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldCkKewoJdm9pZCAqcDsKCgkv KiBUaGUgc2NhbiBnaXZlcyB1cyB0aGUgcGh5c2ljYWwgc3RhcnRpbmcgYWRkcmVzcy4gIFdlIHdh bnQgdGhlCgkgKiB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhpcyBjYXNlLCBhbmQgZm9ydHVuYXRlbHks IHdlIGFscmVhZHkgZmlndXJlZAoJICogb3V0IHRoZSBwaHlzaWNhbC12aXJ0dWFsIGRpZmZlcmVu Y2UgYW5kIHBhc3NlZCBpdCBoZXJlIGluCgkgKiAicGFnZV9vZmZzZXQiLiAqLwoJZm9yIChwID0g c3RhcnQ7IHAgPCBlbmQ7IHArKykKCQlpZiAobWVtY21wKHAsICJHZW51aW5lTGd1ZXN0Iiwgc3Ry bGVuKCJHZW51aW5lTGd1ZXN0IikpID09IDApCgkJCXJldHVybiAobG9uZylwICsgc3RybGVuKCJH ZW51aW5lTGd1ZXN0IikgKyBwYWdlX29mZnNldDsKCgllcnIoMSwgIklzIHRoaXMgaW1hZ2UgYSBn ZW51aW5lIGxndWVzdD8iKTsKfQoKLyogVGhpcyByb3V0aW5lIHRha2VzIGFuIG9wZW4gdm1saW51 eCBpbWFnZSwgd2hpY2ggaXMgaW4gRUxGLCBhbmQgbWFwcyBpdCBpbnRvCiAqIHRoZSBHdWVzdCBt ZW1vcnkuICBFTEYgPSBFbWJlZGRlZCBMaW5raW5nIEZvcm1hdCwgd2hpY2ggaXMgdGhlIGZvcm1h dCB1c2VkCiAqIGJ5IGFsbCBtb2Rlcm4gYmluYXJpZXMgb24gTGludXggaW5jbHVkaW5nIHRoZSBr ZXJuZWwuCiAqCiAqIFRoZSBFTEYgaGVhZGVycyBnaXZlICp0d28qIGFkZHJlc3NlczogYSBwaHlz aWNhbCBhZGRyZXNzLCBhbmQgYSB2aXJ0dWFsCiAqIGFkZHJlc3MuICBUaGUgR3Vlc3Qga2VybmVs IGV4cGVjdHMgdG8gYmUgcGxhY2VkIGluIG1lbW9yeSBhdCB0aGUgcGh5c2ljYWwKICogYWRkcmVz cywgYW5kIHRoZSBwYWdlIHRhYmxlcyBzZXQgdXAgc28gaXQgd2lsbCBjb3JyZXNwb25kIHRvIHRo YXQgdmlydHVhbAogKiBhZGRyZXNzLiAgV2UgcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4g dGhlIHZpcnR1YWwgYW5kIHBoeXNpY2FsCiAqIGFkZHJlc3NlcyBpbiB0aGUgInBhZ2Vfb2Zmc2V0 IiBwb2ludGVyLgogKgogKiBXZSByZXR1cm4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MuICovCnN0YXRp YyB1bnNpZ25lZCBsb25nIG1hcF9lbGYoaW50IGVsZl9mZCwgY29uc3QgRWxmMzJfRWhkciAqZWhk ciwKCQkJICAgICB1bnNpZ25lZCBsb25nICpwYWdlX29mZnNldCkKewoJdm9pZCAqYWRkcjsKCUVs ZjMyX1BoZHIgcGhkcltlaGRyLT5lX3BobnVtXTsKCXVuc2lnbmVkIGludCBpOwoJdW5zaWduZWQg bG9uZyBzdGFydCA9IC0xVUwsIGVuZCA9IDA7CgoJLyogU2FuaXR5IGNoZWNrcyBvbiB0aGUgbWFp biBFTEYgaGVhZGVyOiBhbiB4ODYgZXhlY3V0YWJsZSB3aXRoIGEKCSAqIHJlYXNvbmFibGUgbnVt YmVyIG9mIGNvcnJlY3RseS1zaXplZCBwcm9ncmFtIGhlYWRlcnMuICovCglpZiAoZWhkci0+ZV90 eXBlICE9IEVUX0VYRUMKCSAgICB8fCBlaGRyLT5lX21hY2hpbmUgIT0gRU1fMzg2CgkgICAgfHwg ZWhkci0+ZV9waGVudHNpemUgIT0gc2l6ZW9mKEVsZjMyX1BoZHIpCgkgICAgfHwgZWhkci0+ZV9w aG51bSA8IDEgfHwgZWhkci0+ZV9waG51bSA+IDY1NTM2VS9zaXplb2YoRWxmMzJfUGhkcikpCgkJ ZXJyeCgxLCAiTWFsZm9ybWVkIGVsZiBoZWFkZXIiKTsKCgkvKiBBbiBFTEYgZXhlY3V0YWJsZSBj b250YWlucyBhbiBFTEYgaGVhZGVyIGFuZCBhIG51bWJlciBvZiAicHJvZ3JhbSIKCSAqIGhlYWRl cnMgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcGFydHMgKCJzZWdtZW50cyIpIG9mIHRoZSBwcm9ncmFt IHRvCgkgKiBsb2FkIHdoZXJlLiAqLwoKCS8qIFdlIHJlYWQgaW4gYWxsIHRoZSBwcm9ncmFtIGhl YWRlcnMgYXQgb25jZTogKi8KCWlmIChsc2VlayhlbGZfZmQsIGVoZHItPmVfcGhvZmYsIFNFRUtf U0VUKSA8IDApCgkJZXJyKDEsICJTZWVraW5nIHRvIHByb2dyYW0gaGVhZGVycyIpOwoJaWYgKHJl YWQoZWxmX2ZkLCBwaGRyLCBzaXplb2YocGhkcikpICE9IHNpemVvZihwaGRyKSkKCQllcnIoMSwg IlJlYWRpbmcgcHJvZ3JhbSBoZWFkZXJzIik7CgoJLyogV2UgZG9uJ3Qga25vdyBwYWdlX29mZnNl dCB5ZXQuICovCgkqcGFnZV9vZmZzZXQgPSAwOwoKCS8qIFRyeSBhbGwgdGhlIGhlYWRlcnM6IHRo ZXJlIGFyZSB1c3VhbGx5IG9ubHkgdGhyZWUuICBBIHJlYWQtb25seSBvbmUsCgkgKiBhIHJlYWQt d3JpdGUgb25lLCBhbmQgYSAibm90ZSIgc2VjdGlvbiB3aGljaCBpc24ndCBsb2FkYWJsZS4gKi8K CWZvciAoaSA9IDA7IGkgPCBlaGRyLT5lX3BobnVtOyBpKyspIHsKCQkvKiBJZiB0aGlzIGlzbid0 IGEgbG9hZGFibGUgc2VnbWVudCwgd2UgaWdub3JlIGl0ICovCgkJaWYgKHBoZHJbaV0ucF90eXBl ICE9IFBUX0xPQUQpCgkJCWNvbnRpbnVlOwoKCQl2ZXJib3NlKCJTZWN0aW9uICVpOiBzaXplICVp IGFkZHIgJXBcbiIsCgkJCWksIHBoZHJbaV0ucF9tZW1zeiwgKHZvaWQgKilwaGRyW2ldLnBfcGFk ZHIpOwoKCQkvKiBXZSBleHBlY3QgYSBzaW1wbGUgbGluZWFyIGFkZHJlc3Mgc3BhY2U6IGV2ZXJ5 IHNlZ21lbnQgbXVzdAoJCSAqIGhhdmUgdGhlIHNhbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZpcnR1 YWwgKHBfdmFkZHIpIGFuZAoJCSAqIHBoeXNpY2FsIChwX3BhZGRyKSBhZGRyZXNzLiAqLwoJCWlm ICghKnBhZ2Vfb2Zmc2V0KQoJCQkqcGFnZV9vZmZzZXQgPSBwaGRyW2ldLnBfdmFkZHIgLSBwaGRy W2ldLnBfcGFkZHI7CgkJZWxzZSBpZiAoKnBhZ2Vfb2Zmc2V0ICE9IHBoZHJbaV0ucF92YWRkciAt IHBoZHJbaV0ucF9wYWRkcikKCQkJZXJyeCgxLCAiUGFnZSBvZmZzZXQgb2Ygc2VjdGlvbiAlaSBk aWZmZXJlbnQiLCBpKTsKCgkJLyogV2UgdHJhY2sgdGhlIGZpcnN0IGFuZCBsYXN0IGFkZHJlc3Mg d2UgbWFwcGVkLCBzbyB3ZSBjYW4KCQkgKiB0ZWxsIGVudHJ5X3BvaW50KCkgd2hlcmUgdG8gc2Nh bi4gKi8KCQlpZiAocGhkcltpXS5wX3BhZGRyIDwgc3RhcnQpCgkJCXN0YXJ0ID0gcGhkcltpXS5w X3BhZGRyOwoJCWlmIChwaGRyW2ldLnBfcGFkZHIgKyBwaGRyW2ldLnBfZmlsZXN6ID4gZW5kKQoJ CQllbmQgPSBwaGRyW2ldLnBfcGFkZHIgKyBwaGRyW2ldLnBfZmlsZXN6OwoKCQkvKiBXZSBtYXAg dGhpcyBzZWN0aW9uIG9mIHRoZSBmaWxlIGF0IGl0cyBwaHlzaWNhbCBhZGRyZXNzLiAgV2UKCQkg KiBtYXAgaXQgcmVhZCAmIHdyaXRlIGV2ZW4gaWYgdGhlIGhlYWRlciBzYXlzIHRoaXMgc2VnbWVu dCBpcwoJCSAqIHJlYWQtb25seS4gIFRoZSBrZXJuZWwgcmVhbGx5IHdhbnRzIHRvIGJlIHdyaXRh YmxlOiBpdAoJCSAqIHBhdGNoZXMgaXRzIG93biBpbnN0cnVjdGlvbnMgd2hpY2ggd291bGQgbm9y bWFsbHkgYmUKCQkgKiByZWFkLW9ubHkuCgkJICoKCQkgKiBNQVBfUFJJVkFURSBtZWFucyB0aGF0 IHRoZSBwYWdlIHdvbid0IGJlIGNvcGllZCB1bnRpbCBhCgkJICogd3JpdGUgaXMgZG9uZSB0byBp dC4gIFRoaXMgYWxsb3dzIHVzIHRvIHNoYXJlIG11Y2ggb2YgdGhlCgkJICoga2VybmVsIG1lbW9y eSBiZXR3ZWVuIEd1ZXN0cy4gKi8KCQlhZGRyID0gbW1hcCgodm9pZCAqKXBoZHJbaV0ucF9wYWRk ciwKCQkJICAgIHBoZHJbaV0ucF9maWxlc3osCgkJCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURXxQ Uk9UX0VYRUMsCgkJCSAgICBNQVBfRklYRUR8TUFQX1BSSVZBVEUsCgkJCSAgICBlbGZfZmQsIHBo ZHJbaV0ucF9vZmZzZXQpOwoJCWlmIChhZGRyICE9ICh2b2lkICopcGhkcltpXS5wX3BhZGRyKQoJ CQllcnIoMSwgIk1tYXBpbmcgdm1saW51eCBzZWcgJWkgZ2F2ZSAlcCBub3QgJXAiLAoJCQkgICAg aSwgYWRkciwgKHZvaWQgKilwaGRyW2ldLnBfcGFkZHIpOwoJfQoKCXJldHVybiBlbnRyeV9wb2lu dCgodm9pZCAqKXN0YXJ0LCAodm9pZCAqKWVuZCwgKnBhZ2Vfb2Zmc2V0KTsKfQoKLypMOjE3MCBQ cmVwYXJlIHRvIGJlIFNIT0NLRUQgYW5kIEFNQVpFRC4gIEFuZCBwb3NzaWJseSBhIHRyaWZsZSBu YXVzZWF0ZWQuCiAqCiAqIFdlIGtub3cgdGhhdCBDT05GSUdfUEFHRV9PRkZTRVQgc2V0cyB3aGF0 IHZpcnR1YWwgYWRkcmVzcyB0aGUga2VybmVsIGV4cGVjdHMKICogdG8gYmUuICBXZSBkb24ndCBr bm93IHdoYXQgdGhhdCBvcHRpb24gd2FzLCBidXQgd2UgY2FuIGZpZ3VyZSBpdCBvdXQKICogYXBw cm94aW1hdGVseSBieSBsb29raW5nIGF0IHRoZSBhZGRyZXNzZXMgaW4gdGhlIGNvZGUuICBJIGNo b3NlIHRoZSBjb21tb24KICogY2FzZSBvZiByZWFkaW5nIGEgbWVtb3J5IGxvY2F0aW9uIGludG8g dGhlICVlYXggcmVnaXN0ZXI6CiAqCiAqICBtb3ZsIDxzb21lLWFkZHJlc3M+LCAlZWF4CiAqCiAq IFRoaXMgZ2V0cyBlbmNvZGVkIGFzIGZpdmUgYnl0ZXM6ICIweEExIDw0LWJ5dGUtYWRkcmVzcz4i LiAgRm9yIGV4YW1wbGUsCiAqICIweEExIDB4MTggMHg2MCAweDQ3IDB4QzAiIHJlYWRzIHRoZSBh ZGRyZXNzIDB4QzA0NzYwMTggaW50byAlZWF4LgogKgogKiBJbiB0aGlzIGV4YW1wbGUgY2FuIGd1 ZXNzIHRoYXQgdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aAogKiBDT05GSUdfUEFHRV9PRkZT RVQgc2V0IHRvIDB4QzAwMDAwMDAgKGl0J3MgYWx3YXlzIGEgcm91bmQgbnVtYmVyKS4gIElmIHRo ZQogKiBrZXJuZWwgd2VyZSBsYXJnZXIgdGhhbiAxNk1CLCB3ZSBtaWdodCBzZWUgMHhDMSBhZGRy ZXNzZXMgc2hvdyB1cCwgYnV0IG91cgogKiBrZXJuZWwgaXNuJ3QgdGhhdCBibG9hdGVkIHlldC4K ICoKICogVW5mb3J0dW5hdGVseSwgeDg2IGhhcyB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb25z LCBzbyBmaW5kaW5nIHRoaXMKICogcGFydGljdWxhciBpbnN0cnVjdGlvbiBwcm9wZXJseSBpbnZv bHZlcyB3cml0aW5nIGEgZGlzYXNzZW1ibGVyLiAgSW5zdGVhZCwKICogd2UgcmVseSBvbiBzdGF0 aXN0aWNzLiAgV2UgbG9vayBmb3IgIjB4QTEiIGFuZCB0YWxseSB0aGUgZGlmZmVyZW50IGJ5dGVz CiAqIHdoaWNoIG9jY3VyIDQgYnl0ZXMgbGF0ZXIgKHRoZSAiMHhDMCIgaW4gb3VyIGV4YW1wbGUg YWJvdmUpLiAgV2hlbiBvbmUgb2YKICogdGhvc2UgYnl0ZXMgYXBwZWFycyB0aHJlZSB0aW1lcywg d2UgY2FuIGJlIHJlYXNvbmFibHkgY29uZmlkZW50IHRoYXQgaXQKICogZm9ybXMgdGhlIHN0YXJ0 IG9mIENPTkZJR19QQUdFX09GRlNFVC4KICoKICogVGhpcyBpcyBhbWF6aW5nbHkgcmVsaWFibGUu ICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGludHVpdF9wYWdlX29mZnNldCh1bnNpZ25lZCBjaGFy ICppbWcsIHVuc2lnbmVkIGxvbmcgbGVuKQp7Cgl1bnNpZ25lZCBpbnQgaSwgcG9zc2liaWxpdGll c1syNTZdID0geyAwIH07CgoJZm9yIChpID0gMDsgaSArIDQgPCBsZW47IGkrKykgewoJCS8qIG1v diAweFhYWFhYWFhYLCVlYXggKi8KCQlpZiAoaW1nW2ldID09IDB4QTEgJiYgKytwb3NzaWJpbGl0 aWVzW2ltZ1tpKzRdXSA+IDMpCgkJCXJldHVybiAodW5zaWduZWQgbG9uZylpbWdbaSs0XSA8PCAy NDsKCX0KCWVycngoMSwgImNvdWxkIG5vdCBkZXRlcm1pbmUgcGFnZSBvZmZzZXQiKTsKfQoKLypM OjE2MCBVbmZvcnR1bmF0ZWx5IHRoZSBlbnRpcmUgRUxGIGltYWdlIGlzbid0IGNvbXByZXNzZWQ6 IHRoZSBzZWdtZW50cwogKiB3aGljaCBuZWVkIGxvYWRpbmcgYXJlIGV4dHJhY3RlZCBhbmQgY29t cHJlc3NlZCByYXcuICBUaGlzIGRlbmllcyB1cyB0aGUKICogaW5mb3JtYXRpb24gd2UgbmVlZCB0 byBtYWtlIGEgZnVsbHktZ2VuZXJhbCBsb2FkZXIuICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIHVu cGFja19iemltYWdlKGludCBmZCwgdW5zaWduZWQgbG9uZyAqcGFnZV9vZmZzZXQpCnsKCWd6Rmls ZSBmOwoJaW50IHJldCwgbGVuID0gMDsKCS8qIEEgYnpJbWFnZSBhbHdheXMgZ2V0cyBsb2FkZWQg YXQgcGh5c2ljYWwgYWRkcmVzcyAxTS4gIFRoaXMgaXMKCSAqIGFjdHVhbGx5IGNvbmZpZ3VyYWJs ZSBhcyBDT05GSUdfUEhZU0lDQUxfU1RBUlQsIGJ1dCBhcyB0aGUgY29tbWVudAoJICogdGhlcmUg c2F5cywgIkRvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9p bmciLgoJICogSW5kZWVkLiAqLwoJdm9pZCAqaW1nID0gKHZvaWQgKikweDEwMDAwMDsKCgkvKiBn emRvcGVuIHRha2VzIG91ciBmaWxlIGRlc2NyaXB0b3IgKGNhcmVmdWxseSBwbGFjZWQgYXQgdGhl IHN0YXJ0IG9mCgkgKiB0aGUgR1pJUCBoZWFkZXIgd2UgZm91bmQpIGFuZCByZXR1cm5zIGEgZ3pG aWxlLiAqLwoJZiA9IGd6ZG9wZW4oZmQsICJyYiIpOwoJLyogV2UgcmVhZCBpdCBpbnRvIG1lbW9y eSBpbiA2NGsgY2h1bmtzIHVudGlsIHdlIGhpdCB0aGUgZW5kLiAqLwoJd2hpbGUgKChyZXQgPSBn enJlYWQoZiwgaW1nICsgbGVuLCA2NTUzNikpID4gMCkKCQlsZW4gKz0gcmV0OwoJaWYgKHJldCA8 IDApCgkJZXJyKDEsICJyZWFkaW5nIGltYWdlIGZyb20gYnpJbWFnZSIpOwoKCXZlcmJvc2UoIlVu cGFja2VkIHNpemUgJWkgYWRkciAlcFxuIiwgbGVuLCBpbWcpOwoKCS8qIFdpdGhvdXQgdGhlIEVM RiBoZWFkZXIsIHdlIGNhbid0IHRlbGwgdmlydHVhbC1waHlzaWNhbCBnYXAuICBUaGlzIGlzCgkg KiBDT05GSUdfUEFHRV9PRkZTRVQsIGFuZCBwZW9wbGUgZG8gYWN0dWFsbHkgY2hhbmdlIGl0LiAg Rm9ydHVuYXRlbHksCgkgKiBJIGhhdmUgYSBjbGV2ZXIgd2F5IG9mIGZpZ3VyaW5nIGl0IG91dCBm cm9tIHRoZSBjb2RlIGl0c2VsZi4gICovCgkqcGFnZV9vZmZzZXQgPSBpbnR1aXRfcGFnZV9vZmZz ZXQoaW1nLCBsZW4pOwoKCXJldHVybiBlbnRyeV9wb2ludChpbWcsIGltZyArIGxlbiwgKnBhZ2Vf b2Zmc2V0KTsKfQoKLypMOjE1MCBBIGJ6SW1hZ2UsIHVubGlrZSBhbiBFTEYgZmlsZSwgaXMgbm90 IG1lYW50IHRvIGJlIGxvYWRlZC4gIFlvdSdyZQogKiBzdXBwb3NlZCB0byBqdW1wIGludG8gaXQg YW5kIGl0IHdpbGwgdW5wYWNrIGl0c2VsZi4gIFdlIGNhbid0IGRvIHRoYXQKICogYmVjYXVzZSB0 aGUgR3Vlc3QgY2FuJ3QgcnVuIHRoZSB1bnBhY2tpbmcgY29kZSwgYW5kIGFkZGluZyBmZWF0dXJl cyB0bwogKiBsZ3Vlc3Qga2lsbHMgcHVwcGllcywgc28gd2UgZG9uJ3Qgd2FudCB0by4KICoKICog VGhlIGJ6SW1hZ2UgaXMgZm9ybWVkIGJ5IHB1dHRpbmcgdGhlIGRlY29tcHJlc3NpbmcgY29kZSBp biBmcm9udCBvZiB0aGUKICogY29tcHJlc3NlZCBrZXJuZWwgY29kZS4gIFNvIHdlIGNhbiBzaW1w bGUgc2NhbiB0aHJvdWdoIGl0IGxvb2tpbmcgZm9yIHRoZQogKiBmaXJzdCAiZ3ppcCIgaGVhZGVy LCBhbmQgc3RhcnQgZGVjb21wcmVzc2luZyBmcm9tIHRoZXJlLiAqLwpzdGF0aWMgdW5zaWduZWQg bG9uZyBsb2FkX2J6aW1hZ2UoaW50IGZkLCB1bnNpZ25lZCBsb25nICpwYWdlX29mZnNldCkKewoJ dW5zaWduZWQgY2hhciBjOwoJaW50IHN0YXRlID0gMDsKCgkvKiBHWklQIGhlYWRlciBpcyAweDFG IDB4OEIgPG1ldGhvZD4gPGZsYWdzPi4uLiA8Y29tcHJlc3NlZC1ieT4uICovCgl3aGlsZSAocmVh ZChmZCwgJmMsIDEpID09IDEpIHsKCQlzd2l0Y2ggKHN0YXRlKSB7CgkJY2FzZSAwOgoJCQlpZiAo YyA9PSAweDFGKQoJCQkJc3RhdGUrKzsKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQlpZiAoYyA9PSAw eDhCKQoJCQkJc3RhdGUrKzsKCQkJZWxzZQoJCQkJc3RhdGUgPSAwOwoJCQlicmVhazsKCQljYXNl IDIgLi4uIDg6CgkJCXN0YXRlKys7CgkJCWJyZWFrOwoJCWNhc2UgOToKCQkJLyogU2VlayBiYWNr IHRvIHRoZSBzdGFydCBvZiB0aGUgZ3ppcCBoZWFkZXIuICovCgkJCWxzZWVrKGZkLCAtMTAsIFNF RUtfQ1VSKTsKCQkJLyogT25lIGZpbmFsIGNoZWNrOiAiY29tcHJlc3NlZCB1bmRlciBVTklYIi4g Ki8KCQkJaWYgKGMgIT0gMHgwMykKCQkJCXN0YXRlID0gLTE7CgkJCWVsc2UKCQkJCXJldHVybiB1 bnBhY2tfYnppbWFnZShmZCwgcGFnZV9vZmZzZXQpOwoJCX0KCX0KCWVycngoMSwgIkNvdWxkIG5v dCBmaW5kIGtlcm5lbCBpbiBiekltYWdlIik7Cn0KCi8qTDoxNDAgTG9hZGluZyB0aGUga2VybmVs IGlzIGVhc3kgd2hlbiBpdCdzIGEgInZtbGludXgiLCBidXQgbW9zdCBrZXJuZWxzCiAqIGNvbWUg d3JhcHBlZCB1cCBpbiB0aGUgc2VsZi1kZWNvbXByZXNzaW5nICJiekltYWdlIiBmb3JtYXQuICBX aXRoIHNvbWUgZnVua3kKICogY29kaW5nLCB3ZSBjYW4gbG9hZCB0aG9zZSwgdG9vLiAqLwpzdGF0 aWMgdW5zaWduZWQgbG9uZyBsb2FkX2tlcm5lbChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKnBhZ2Vf b2Zmc2V0KQp7CglFbGYzMl9FaGRyIGhkcjsKCgkvKiBSZWFkIGluIHRoZSBmaXJzdCBmZXcgYnl0 ZXMuICovCglpZiAocmVhZChmZCwgJmhkciwgc2l6ZW9mKGhkcikpICE9IHNpemVvZihoZHIpKQoJ CWVycigxLCAiUmVhZGluZyBrZXJuZWwiKTsKCgkvKiBJZiBpdCdzIGFuIEVMRiBmaWxlLCBpdCBz dGFydHMgd2l0aCAiXDE3N0VMRiIgKi8KCWlmIChtZW1jbXAoaGRyLmVfaWRlbnQsIEVMRk1BRywg U0VMRk1BRykgPT0gMCkKCQlyZXR1cm4gbWFwX2VsZihmZCwgJmhkciwgcGFnZV9vZmZzZXQpOwoK CS8qIE90aGVyd2lzZSB3ZSBhc3N1bWUgaXQncyBhIGJ6SW1hZ2UsIGFuZCB0cnkgdG8gdW5wYWNr IGl0ICovCglyZXR1cm4gbG9hZF9iemltYWdlKGZkLCBwYWdlX29mZnNldCk7Cn0KCi8qIFRoaXMg aXMgYSB0cml2aWFsIGxpdHRsZSBoZWxwZXIgdG8gYWxpZ24gcGFnZXMuICBBbmRpIEtsZWVuIGhh dGVkIGl0IGJlY2F1c2UKICogaXQgY2FsbHMgZ2V0cGFnZXNpemUoKSB0d2ljZTogIml0J3MgZHVt YiBjb2RlLiIKICoKICogS2VybmVsIGd1eXMgZ2V0IHJlYWxseSBoZXQgdXAgYWJvdXQgb3B0aW1p emF0aW9uLCBldmVuIHdoZW4gaXQncyBub3QKICogbmVjZXNzYXJ5LiAgSSBsZWF2ZSB0aGlzIGNv ZGUgYXMgYSByZWFjdGlvbiBhZ2FpbnN0IHRoYXQuICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQg bG9uZyBwYWdlX2FsaWduKHVuc2lnbmVkIGxvbmcgYWRkcikKewoJLyogQWRkIHVwd2FyZHMgYW5k IHRydW5jYXRlIGRvd253YXJkcy4gKi8KCXJldHVybiAoKGFkZHIgKyBnZXRwYWdlc2l6ZSgpLTEp ICYgfihnZXRwYWdlc2l6ZSgpLTEpKTsKfQoKLypMOjE4MCBBbiAiaW5pdGlhbCByYW0gZGlzayIg aXMgYSBkaXNrIGltYWdlIGxvYWRlZCBpbnRvIG1lbW9yeSBhbG9uZyB3aXRoCiAqIHRoZSBrZXJu ZWwgd2hpY2ggdGhlIGtlcm5lbCBjYW4gdXNlIHRvIGJvb3QgZnJvbSB3aXRob3V0IG5lZWRpbmcg YW55CiAqIGRyaXZlcnMuICBNb3N0IGRpc3RyaWJ1dGlvbnMgbm93IHVzZSB0aGlzIGFzIHN0YW5k YXJkOiB0aGUgaW5pdHJkIGNvbnRhaW5zCiAqIHRoZSBjb2RlIHRvIGxvYWQgdGhlIGFwcHJvcHJp YXRlIGRyaXZlciBtb2R1bGVzIGZvciB0aGUgY3VycmVudCBtYWNoaW5lLgogKgogKiBJbXBvcnRh bnRseSwgSmFtZXMgTW9ycmlzIHdvcmtzIGZvciBSZWRIYXQsIGFuZCBGZWRvcmEgdXNlcyBpbml0 cmRzIGZvciBpdHMKICoga2VybmVscy4gIEhlIHNlbnQgbWUgdGhpcyAoYW5kIHRlbGxzIG1lIHdo ZW4gSSBicmVhayBpdCkuICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfaW5pdHJkKGNvbnN0 IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbWVtKQp7CglpbnQgaWZkOwoJc3RydWN0IHN0YXQg c3Q7Cgl1bnNpZ25lZCBsb25nIGxlbjsKCXZvaWQgKmlhZGRyOwoKCWlmZCA9IG9wZW5fb3JfZGll KG5hbWUsIE9fUkRPTkxZKTsKCS8qIGZzdGF0KCkgaXMgbmVlZGVkIHRvIGdldCB0aGUgZmlsZSBz aXplLiAqLwoJaWYgKGZzdGF0KGlmZCwgJnN0KSA8IDApCgkJZXJyKDEsICJmc3RhdCgpIG9uIGlu aXRyZCAnJXMnIiwgbmFtZSk7CgoJLyogVGhlIGxlbmd0aCBuZWVkcyB0byBiZSByb3VuZGVkIHVw IHRvIGEgcGFnZSBzaXplOiBtbWFwIG5lZWRzIHRoZQoJICogYWRkcmVzcyB0byBiZSBwYWdlIGFs aWduZWQuICovCglsZW4gPSBwYWdlX2FsaWduKHN0LnN0X3NpemUpOwoJLyogV2UgbWFwIHRoZSBp bml0cmQgYXQgdGhlIHRvcCBvZiBtZW1vcnkuICovCglpYWRkciA9IG1tYXAoKHZvaWQgKiltZW0g LSBsZW4sIHN0LnN0X3NpemUsCgkJICAgICBQUk9UX1JFQUR8UFJPVF9FWEVDfFBST1RfV1JJVEUs CgkJICAgICBNQVBfRklYRUR8TUFQX1BSSVZBVEUsIGlmZCwgMCk7CglpZiAoaWFkZHIgIT0gKHZv aWQgKiltZW0gLSBsZW4pCgkJZXJyKDEsICJNbWFwaW5nIGluaXRyZCAnJXMnIHJldHVybmVkICVw IG5vdCAlcCIsCgkJICAgIG5hbWUsIGlhZGRyLCAodm9pZCAqKW1lbSAtIGxlbik7CgkvKiBPbmNl IGEgZmlsZSBpcyBtYXBwZWQsIHlvdSBjYW4gY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvci4gIEl0 J3MgYQoJICogbGl0dGxlIG9kZCwgYnV0IHF1aXRlIHVzZWZ1bC4gKi8KCWNsb3NlKGlmZCk7Cgl2 ZXJib3NlKCJtYXBwZWQgaW5pdHJkICVzIHNpemU9JWx1IEAgJXBcbiIsIG5hbWUsIHN0LnN0X3Np emUsIGlhZGRyKTsKCgkvKiBXZSByZXR1cm4gdGhlIGluaXRyZCBzaXplLiAqLwoJcmV0dXJuIGxl bjsKfQoKLyogT25jZSB3ZSBrbm93IGhvdyBtdWNoIG1lbW9yeSB3ZSBoYXZlLCBhbmQgdGhlIGFk ZHJlc3MgdGhlIEd1ZXN0IGtlcm5lbAogKiBleHBlY3RzLCB3ZSBjYW4gY29uc3RydWN0IHNpbXBs ZSBsaW5lYXIgcGFnZSB0YWJsZXMgd2hpY2ggd2lsbCBnZXQgdGhlIEd1ZXN0CiAqIGZhciBlbm91 Z2ggaW50byB0aGUgYm9vdCB0byBjcmVhdGUgaXRzIG93bi4KICoKICogV2UgbGF5IHRoZW0gb3V0 IG9mIHRoZSB3YXksIGp1c3QgYmVsb3cgdGhlIGluaXRyZCAod2hpY2ggaXMgd2h5IHdlIG5lZWQg dG8KICoga25vdyBpdHMgc2l6ZSkuICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIHNldHVwX3BhZ2V0 YWJsZXModW5zaWduZWQgbG9uZyBtZW0sCgkJCQkgICAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9z aXplLAoJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldCkKewoJdTMyICpwZ2Rpciwg KmxpbmVhcjsKCXVuc2lnbmVkIGludCBtYXBwZWRfcGFnZXMsIGksIGxpbmVhcl9wYWdlczsKCXVu c2lnbmVkIGludCBwdGVzX3Blcl9wYWdlID0gZ2V0cGFnZXNpemUoKS9zaXplb2YodTMyKTsKCgkv KiBJZGVhbGx5IHdlIG1hcCBhbGwgcGh5c2ljYWwgbWVtb3J5IHN0YXJ0aW5nIGF0IHBhZ2Vfb2Zm c2V0LgoJICogSG93ZXZlciwgaWYgcGFnZV9vZmZzZXQgaXMgMHhDMDAwMDAwMCB3ZSBjYW4gb25s eSBtYXAgMUcgb2YgcGh5c2ljYWwKCSAqICgweEMwMDAwMDAwICsgMUcgb3ZlcmZsb3dzKS4gKi8K CWlmIChtZW0gPD0gLXBhZ2Vfb2Zmc2V0KQoJCW1hcHBlZF9wYWdlcyA9IG1lbS9nZXRwYWdlc2l6 ZSgpOwoJZWxzZQoJCW1hcHBlZF9wYWdlcyA9IC1wYWdlX29mZnNldC9nZXRwYWdlc2l6ZSgpOwoK CS8qIEVhY2ggUFRFIHBhZ2UgY2FuIG1hcCBwdGVzX3Blcl9wYWdlIHBhZ2VzOiBob3cgbWFueSBk byB3ZSBuZWVkPyAqLwoJbGluZWFyX3BhZ2VzID0gKG1hcHBlZF9wYWdlcyArIHB0ZXNfcGVyX3Bh Z2UtMSkvcHRlc19wZXJfcGFnZTsKCgkvKiBXZSBwdXQgdGhlIHRvcGxldmVsIHBhZ2UgZGlyZWN0 b3J5IHBhZ2UgYXQgdGhlIHRvcCBvZiBtZW1vcnkuICovCglwZ2RpciA9ICh2b2lkICopbWVtIC0g aW5pdHJkX3NpemUgLSBnZXRwYWdlc2l6ZSgpOwoKCS8qIE5vdyB3ZSB1c2UgdGhlIG5leHQgbGlu ZWFyX3BhZ2VzIHBhZ2VzIGFzIHB0ZSBwYWdlcyAqLwoJbGluZWFyID0gKHZvaWQgKilwZ2RpciAt IGxpbmVhcl9wYWdlcypnZXRwYWdlc2l6ZSgpOwoKCS8qIExpbmVhciBtYXBwaW5nIGlzIGVhc3k6 IHB1dCBldmVyeSBwYWdlJ3MgYWRkcmVzcyBpbnRvIHRoZSBtYXBwaW5nIGluCgkgKiBvcmRlci4g IFBBR0VfUFJFU0VOVCBjb250YWlucyB0aGUgZmxhZ3MgUHJlc2VudCwgV3JpdGFibGUgYW5kCgkg KiBFeGVjdXRhYmxlLiAqLwoJZm9yIChpID0gMDsgaSA8IG1hcHBlZF9wYWdlczsgaSsrKQoJCWxp bmVhcltpXSA9ICgoaSAqIGdldHBhZ2VzaXplKCkpIHwgUEFHRV9QUkVTRU5UKTsKCgkvKiBUaGUg dG9wIGxldmVsIHBvaW50cyB0byB0aGUgbGluZWFyIHBhZ2UgdGFibGUgcGFnZXMgYWJvdmUuICBU aGUKCSAqIGVudHJ5IHJlcHJlc2VudGluZyBwYWdlX29mZnNldCBwb2ludHMgdG8gdGhlIGZpcnN0 IG9uZSwgYW5kIHRoZXkKCSAqIGNvbnRpbnVlIGZyb20gdGhlcmUuICovCglmb3IgKGkgPSAwOyBp IDwgbWFwcGVkX3BhZ2VzOyBpICs9IHB0ZXNfcGVyX3BhZ2UpIHsKCQlwZ2RpclsoaSArIHBhZ2Vf b2Zmc2V0L2dldHBhZ2VzaXplKCkpL3B0ZXNfcGVyX3BhZ2VdCgkJCT0gKCgodTMyKWxpbmVhciAr IGkqc2l6ZW9mKHUzMikpIHwgUEFHRV9QUkVTRU5UKTsKCX0KCgl2ZXJib3NlKCJMaW5lYXIgbWFw cGluZyBvZiAldSBwYWdlcyBpbiAldSBwdGUgcGFnZXMgYXQgJXBcbiIsCgkJbWFwcGVkX3BhZ2Vz LCBsaW5lYXJfcGFnZXMsIGxpbmVhcik7CgoJLyogV2UgcmV0dXJuIHRoZSB0b3AgbGV2ZWwgKGd1 ZXN0LXBoeXNpY2FsKSBhZGRyZXNzOiB0aGUga2VybmVsIG5lZWRzCgkgKiB0byBrbm93IHdoZXJl IGl0IGlzLiAqLwoJcmV0dXJuICh1bnNpZ25lZCBsb25nKXBnZGlyOwp9CgovKiBTaW1wbGUgcm91 dGluZSB0byByb2xsIGFsbCB0aGUgY29tbWFuZGxpbmUgYXJndW1lbnRzIHRvZ2V0aGVyIHdpdGgg c3BhY2VzCiAqIGJldHdlZW4gdGhlbS4gKi8Kc3RhdGljIHZvaWQgY29uY2F0KGNoYXIgKmRzdCwg Y2hhciAqYXJnc1tdKQp7Cgl1bnNpZ25lZCBpbnQgaSwgbGVuID0gMDsKCglmb3IgKGkgPSAwOyBh cmdzW2ldOyBpKyspIHsKCQlzdHJjcHkoZHN0K2xlbiwgYXJnc1tpXSk7CgkJc3RyY2F0KGRzdCts ZW4sICIgIik7CgkJbGVuICs9IHN0cmxlbihhcmdzW2ldKSArIDE7Cgl9CgkvKiBJbiBjYXNlIGl0 J3MgZW1wdHkuICovCglkc3RbbGVuXSA9ICdcMCc7Cn0KCi8qIFRoaXMgaXMgd2hlcmUgd2UgYWN0 dWFsbHkgdGVsbCB0aGUga2VybmVsIHRvIGluaXRpYWxpemUgdGhlIEd1ZXN0LiAgV2Ugc2F3CiAq IHRoZSBhcmd1bWVudHMgaXQgZXhwZWN0cyB3aGVuIHdlIGxvb2tlZCBhdCBpbml0aWFsaXplKCkg aW4gbGd1ZXN0X3VzZXIuYzoKICogdGhlIHRvcCBwaHlzaWNhbCBwYWdlIHRvIGFsbG93LCB0aGUg dG9wIGxldmVsIHBhZ2V0YWJsZSwgdGhlIGVudHJ5IHBvaW50IGFuZAogKiB0aGUgcGFnZV9vZmZz ZXQgY29uc3RhbnQgZm9yIHRoZSBHdWVzdC4gKi8Kc3RhdGljIGludCB0ZWxsX2tlcm5lbCh1MzIg cGdkaXIsIHUzMiBzdGFydCwgdTMyIHBhZ2Vfb2Zmc2V0KQp7Cgl1MzIgYXJnc1tdID0geyBMSFJF UV9JTklUSUFMSVpFLAoJCSAgICAgICB0b3AvZ2V0cGFnZXNpemUoKSwgcGdkaXIsIHN0YXJ0LCBw YWdlX29mZnNldCB9OwoJaW50IGZkOwoKCWZkID0gb3Blbl9vcl9kaWUoIi9kZXYvbGd1ZXN0Iiwg T19SRFdSKTsKCWlmICh3cml0ZShmZCwgYXJncywgc2l6ZW9mKGFyZ3MpKSA8IDApCgkJZXJyKDEs ICJXcml0aW5nIHRvIC9kZXYvbGd1ZXN0Iik7CgoJLyogV2UgcmV0dXJuIHRoZSAvZGV2L2xndWVz dCBmaWxlIGRlc2NyaXB0b3IgdG8gY29udHJvbCB0aGlzIEd1ZXN0ICovCglyZXR1cm4gZmQ7Cn0K Lyo6Ki8KCnN0YXRpYyB2b2lkIHNldF9mZChpbnQgZmQsIHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2 aWNlcykKewoJRkRfU0VUKGZkLCAmZGV2aWNlcy0+aW5mZHMpOwoJaWYgKGZkID4gZGV2aWNlcy0+ bWF4X2luZmQpCgkJZGV2aWNlcy0+bWF4X2luZmQgPSBmZDsKfQoKLypMOjIwMAogKiBUaGUgV2Fr ZXIuCiAqCiAqIFdpdGggYSBjb25zb2xlIGFuZCBuZXR3b3JrIGRldmljZXMsIHdlIGNhbiBoYXZl IGxvdHMgb2YgaW5wdXQgd2hpY2ggd2UgbmVlZAogKiB0byBwcm9jZXNzLiAgV2UgY291bGQgdHJ5 IHRvIHRlbGwgdGhlIGtlcm5lbCB3aGF0IGZpbGUgZGVzY3JpcHRvcnMgdG8gd2F0Y2gsCiAqIGJ1 dCBoYW5kaW5nIGEgZmlsZSBkZXNjcmlwdG9yIG1hc2sgdGhyb3VnaCB0byB0aGUga2VybmVsIGlz IGZhaXJseSBpY2t5LgogKgogKiBJbnN0ZWFkLCB3ZSBmb3JrIG9mZiBhIHByb2Nlc3Mgd2hpY2gg d2F0Y2hlcyB0aGUgZmlsZSBkZXNjcmlwdG9ycyBhbmQgd3JpdGVzCiAqIHRoZSBMSFJFUV9CUkVB SyBjb21tYW5kIHRvIHRoZSAvZGV2L2xndWVzdCBmaWxlZGVzY3JpcHRvciB0byB0ZWxsIHRoZSBI b3N0CiAqIGxvb3AgdG8gc3RvcCBydW5uaW5nIHRoZSBHdWVzdC4gIFRoaXMgY2F1c2VzIGl0IHRv IHJldHVybiBmcm9tIHRoZQogKiAvZGV2L2xndWVzdCByZWFkIHdpdGggLUVBR0FJTiwgd2hlcmUg aXQgd2lsbCB3cml0ZSB0byAvZGV2L2xndWVzdCB0byByZXNldAogKiB0aGUgTEhSRVFfQlJFQUsg YW5kIHdha2UgdXMgdXAgYWdhaW4uCiAqCiAqIFRoaXMsIG9mIGNvdXJzZSwgaXMgbWVyZWx5IGEg ZGlmZmVyZW50ICpraW5kKiBvZiBpY2t5LgogKi8Kc3RhdGljIHZvaWQgd2FrZV9wYXJlbnQoaW50 IHBpcGVmZCwgaW50IGxndWVzdF9mZCwgc3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VzKQp7Cgkv KiBBZGQgdGhlIHBpcGUgZnJvbSB0aGUgTGF1bmNoZXIgdG8gdGhlIGZkc2V0IGluIHRoZSBkZXZp Y2VfbGlzdCwgc28KCSAqIHdlIHdhdGNoIGl0LCB0b28uICovCglzZXRfZmQocGlwZWZkLCBkZXZp Y2VzKTsKCglmb3IgKDs7KSB7CgkJZmRfc2V0IHJmZHMgPSBkZXZpY2VzLT5pbmZkczsKCQl1MzIg YXJnc1tdID0geyBMSFJFUV9CUkVBSywgMSB9OwoKCQkvKiBXYWl0IHVudGlsIGlucHV0IGlzIHJl YWR5IGZyb20gb25lIG9mIHRoZSBkZXZpY2VzLiAqLwoJCXNlbGVjdChkZXZpY2VzLT5tYXhfaW5m ZCsxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CgkJLyogSXMgaXQgYSBtZXNzYWdlIGZyb20g dGhlIExhdW5jaGVyPyAqLwoJCWlmIChGRF9JU1NFVChwaXBlZmQsICZyZmRzKSkgewoJCQlpbnQg aWdub3JlZmQ7CgkJCS8qIElmIHJlYWQoKSByZXR1cm5zIDAsIGl0IG1lYW5zIHRoZSBMYXVuY2hl ciBoYXMKCQkJICogZXhpdGVkLiAgV2Ugc2lsZW50bHkgZm9sbG93LiAqLwoJCQlpZiAocmVhZChw aXBlZmQsICZpZ25vcmVmZCwgc2l6ZW9mKGlnbm9yZWZkKSkgPT0gMCkKCQkJCWV4aXQoMCk7CgkJ CS8qIE90aGVyd2lzZSBpdCdzIHRlbGxpbmcgdXMgdGhlcmUncyBhIHByb2JsZW0gd2l0aCBvbmUK CQkJICogb2YgdGhlIGRldmljZXMsIGFuZCB3ZSBzaG91bGQgaWdub3JlIHRoYXQgZmlsZQoJCQkg KiBkZXNjcmlwdG9yIGZyb20gbm93IG9uLiAqLwoJCQlGRF9DTFIoaWdub3JlZmQsICZkZXZpY2Vz LT5pbmZkcyk7CgkJfSBlbHNlIC8qIFNlbmQgTEhSRVFfQlJFQUsgY29tbWFuZC4gKi8KCQkJd3Jp dGUobGd1ZXN0X2ZkLCBhcmdzLCBzaXplb2YoYXJncykpOwoJfQp9CgovKiBUaGlzIHJvdXRpbmUg anVzdCBzZXRzIHVwIGEgcGlwZSB0byB0aGUgV2FrZXIgcHJvY2Vzcy4gKi8Kc3RhdGljIGludCBz ZXR1cF93YWtlcihpbnQgbGd1ZXN0X2ZkLCBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZV9saXN0 KQp7CglpbnQgcGlwZWZkWzJdLCBjaGlsZDsKCgkvKiBXZSBjcmVhdGUgYSBwaXBlIHRvIHRhbGsg dG8gdGhlIHdha2VyLCBhbmQgYWxzbyBzbyBpdCBrbm93cyB3aGVuIHRoZQoJICogTGF1bmNoZXIg ZGllcyAoYW5kIGNsb3NlcyBwaXBlKS4gKi8KCXBpcGUocGlwZWZkKTsKCWNoaWxkID0gZm9yaygp OwoJaWYgKGNoaWxkID09IC0xKQoJCWVycigxLCAiZm9ya2luZyIpOwoKCWlmIChjaGlsZCA9PSAw KSB7CgkJLyogQ2xvc2UgdGhlICJ3cml0aW5nIiBlbmQgb2Ygb3VyIGNvcHkgb2YgdGhlIHBpcGUg Ki8KCQljbG9zZShwaXBlZmRbMV0pOwoJCXdha2VfcGFyZW50KHBpcGVmZFswXSwgbGd1ZXN0X2Zk LCBkZXZpY2VfbGlzdCk7Cgl9CgkvKiBDbG9zZSB0aGUgcmVhZGluZyBlbmQgb2Ygb3VyIGNvcHkg b2YgdGhlIHBpcGUuICovCgljbG9zZShwaXBlZmRbMF0pOwoKCS8qIEhlcmUgaXMgdGhlIGZkIHVz ZWQgdG8gdGFsayB0byB0aGUgd2FrZXIuICovCglyZXR1cm4gcGlwZWZkWzFdOwp9CgovKkw6MjEw CiAqIERldmljZSBIYW5kbGluZy4KICoKICogV2hlbiB0aGUgR3Vlc3Qgc2VuZHMgRE1BIHRvIHVz LCBpdCBzZW5kcyB1cyBhbiBhcnJheSBvZiBhZGRyZXNzZXMgYW5kIHNpemVzLgogKiBXZSBuZWVk IHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCB0cnlpbmcgdG8gcmVhY2ggaW50byB0aGUgTGF1bmNoZXIg aXRzZWxmLCBzbwogKiB3ZSBoYXZlIGEgY29udmVuaWVudCByb3V0aW5lIHdoaWNoIGNoZWNrIGl0 IGFuZCBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKICogaWYgc29tZXRoaW5nIGZ1bm55IGlz IGdvaW5nIG9uOgogKi8Kc3RhdGljIHZvaWQgKl9jaGVja19wb2ludGVyKHVuc2lnbmVkIGxvbmcg YWRkciwgdW5zaWduZWQgaW50IHNpemUsCgkJCSAgICB1bnNpZ25lZCBpbnQgbGluZSkKewoJLyog V2UgaGF2ZSB0byBzZXBhcmF0ZWx5IGNoZWNrIGFkZHIgYW5kIGFkZHIrc2l6ZSwgYmVjYXVzZSBz aXplIGNvdWxkCgkgKiBiZSBodWdlIGFuZCBhZGRyICsgc2l6ZSBtaWdodCB3cmFwIGFyb3VuZC4g Ki8KCWlmIChhZGRyID49IHRvcCB8fCBhZGRyICsgc2l6ZSA+PSB0b3ApCgkJZXJyeCgxLCAiJXM6 JWk6IEludmFsaWQgYWRkcmVzcyAlbGkiLCBfX0ZJTEVfXywgbGluZSwgYWRkcik7CgkvKiBXZSBy ZXR1cm4gYSBwb2ludGVyIGZvciB0aGUgY2FsbGVyJ3MgY29udmVuaWVuY2UsIG5vdyB3ZSBrbm93 IGl0J3MKCSAqIHNhZmUgdG8gdXNlLiAqLwoJcmV0dXJuICh2b2lkICopYWRkcjsKfQovKiBBIG1h Y3JvIHdoaWNoIHRyYW5zcGFyZW50bHkgaGFuZHMgdGhlIGxpbmUgbnVtYmVyIHRvIHRoZSByZWFs IGZ1bmN0aW9uLiAqLwojZGVmaW5lIGNoZWNrX3BvaW50ZXIoYWRkcixzaXplKSBfY2hlY2tfcG9p bnRlcihhZGRyLCBzaXplLCBfX0xJTkVfXykKCi8qIFRoZSBHdWVzdCBoYXMgZ2l2ZW4gdXMgdGhl IGFkZHJlc3Mgb2YgYSAic3RydWN0IGxndWVzdF9kbWEiLiAgV2UgY2hlY2sgaXQncwogKiBPSyBh bmQgY29udmVydCBpdCB0byBhbiBpb3ZlYyAod2hpY2ggaXMgYSBzaW1wbGUgYXJyYXkgb2YgcHRy L3NpemUKICogcGFpcnMpLiAqLwpzdGF0aWMgdTMyICpkbWEyaW92KHVuc2lnbmVkIGxvbmcgZG1h LCBzdHJ1Y3QgaW92ZWMgaW92W10sIHVuc2lnbmVkICpudW0pCnsKCXVuc2lnbmVkIGludCBpOwoJ c3RydWN0IGxndWVzdF9kbWEgKnVkbWE7CgoJLyogRmlyc3Qgd2UgbWFrZSBzdXJlIHRoYXQgdGhl IGFycmF5IG1lbW9yeSBpdHNlbGYgaXMgdmFsaWQuICovCgl1ZG1hID0gY2hlY2tfcG9pbnRlcihk bWEsIHNpemVvZigqdWRtYSkpOwoJLyogTm93IHdlIGNoZWNrIGVhY2ggZWxlbWVudCAqLwoJZm9y IChpID0gMDsgaSA8IExHVUVTVF9NQVhfRE1BX1NFQ1RJT05TOyBpKyspIHsKCQkvKiBBIHplcm8g bGVuZ3RoIGVuZHMgdGhlIGFycmF5LiAqLwoJCWlmICghdWRtYS0+bGVuW2ldKQoJCQlicmVhazsK CgkJaW92W2ldLmlvdl9iYXNlID0gY2hlY2tfcG9pbnRlcih1ZG1hLT5hZGRyW2ldLCB1ZG1hLT5s ZW5baV0pOwoJCWlvdltpXS5pb3ZfbGVuID0gdWRtYS0+bGVuW2ldOwoJfQoJKm51bSA9IGk7CgoJ LyogV2UgcmV0dXJuIHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSBjYWxsZXIgc2hvdWxkIHdyaXRl IHRoZSBhbW91bnQgb2YKCSAqIHRoZSBidWZmZXIgdXNlZC4gKi8KCXJldHVybiAmdWRtYS0+dXNl ZF9sZW47Cn0KCi8qIFRoaXMgcm91dGluZSBnZXRzIGEgRE1BIGJ1ZmZlciBmcm9tIHRoZSBHdWVz dCBmb3IgYSBnaXZlbiBrZXksIGFuZCBjb252ZXJ0cwogKiBpdCB0byBhbiBpb3ZlYyBhcnJheS4g IEl0IHJldHVybnMgdGhlIGludGVycnVwdCB0aGUgR3Vlc3Qgd2FudHMgd2hlbiB3ZSdyZQogKiBm aW5pc2hlZCwgYW5kIGEgcG9pbnRlciB0byB0aGUgInVzZWRfbGVuIiBmaWVsZCB0byBmaWxsIGlu LiAqLwpzdGF0aWMgdTMyICpnZXRfZG1hX2J1ZmZlcihpbnQgZmQsIHZvaWQgKmtleSwKCQkJICAg c3RydWN0IGlvdmVjIGlvdltdLCB1bnNpZ25lZCBpbnQgKm51bSwgdTMyICppcnEpCnsKCXUzMiBi dWZbXSA9IHsgTEhSRVFfR0VURE1BLCAodTMyKWtleSB9OwoJdW5zaWduZWQgbG9uZyB1ZG1hOwoJ dTMyICpyZXM7CgoJLyogQXNrIHRoZSBrZXJuZWwgZm9yIGEgRE1BIGJ1ZmZlciBjb3JyZXNwb25k aW5nIHRvIHRoaXMga2V5LiAqLwoJdWRtYSA9IHdyaXRlKGZkLCBidWYsIHNpemVvZihidWYpKTsK CS8qIFRoZXkgaGF2ZW4ndCByZWdpc3RlcmVkIGFueSwgb3IgdGhleSdyZSBhbGwgdXNlZD8gKi8K CWlmICh1ZG1hID09ICh1bnNpZ25lZCBsb25nKS0xKQoJCXJldHVybiBOVUxMOwoKCS8qIENvbnZl cnQgaXQgaW50byBvdXIgaW92ZWMgYXJyYXkgKi8KCXJlcyA9IGRtYTJpb3YodWRtYSwgaW92LCBu dW0pOwoJLyogVGhlIGtlcm5lbCBzdGFzaGVzIGlycSBpbiAtPnVzZWRfbGVuIHRvIGdldCBpdCBv dXQgdG8gdXMuICovCgkqaXJxID0gKnJlczsKCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gKChzdHJ1 Y3QgbGd1ZXN0X2RtYSAqKXVkbWEpLT51c2VkX2xlbi4gKi8KCXJldHVybiByZXM7Cn0KCi8qIFRo aXMgaXMgYSBjb252ZW5pZW50IHJvdXRpbmUgdG8gc2VuZCB0aGUgR3Vlc3QgYW4gaW50ZXJydXB0 LiAqLwpzdGF0aWMgdm9pZCB0cmlnZ2VyX2lycShpbnQgZmQsIHUzMiBpcnEpCnsKCXUzMiBidWZb XSA9IHsgTEhSRVFfSVJRLCBpcnEgfTsKCWlmICh3cml0ZShmZCwgYnVmLCBzaXplb2YoYnVmKSkg IT0gMCkKCQllcnIoMSwgIlRyaWdnZXJpbmcgaXJxICVpIiwgaXJxKTsKfQoKLyogVGhpcyBzaW1w bHkgc2V0cyB1cCBhbiBpb3ZlYyBhcnJheSB3aGVyZSB3ZSBjYW4gcHV0IGRhdGEgdG8gYmUgZGlz Y2FyZGVkLgogKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgR3Vlc3QgZG9lc24ndCB3YW50IG9yIGNh bid0IGhhbmRsZSB0aGUgaW5wdXQ6IHdlIGhhdmUKICogdG8gZ2V0IHJpZCBvZiBpdCBzb21ld2hl cmUsIGFuZCBpZiB3ZSBidXJ5IGl0IGluIHRoZSBjZWlsaW5nIHNwYWNlIGl0IHdpbGwKICogc3Rh cnQgdG8gc21lbGwgYWZ0ZXIgYSB3ZWVrLiAqLwpzdGF0aWMgdm9pZCBkaXNjYXJkX2lvdmVjKHN0 cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgKm51bSkKewoJc3RhdGljIGNoYXIgZGlzY2Fy ZF9idWZbMTAyNF07CgkqbnVtID0gMTsKCWlvdi0+aW92X2Jhc2UgPSBkaXNjYXJkX2J1ZjsKCWlv di0+aW92X2xlbiA9IHNpemVvZihkaXNjYXJkX2J1Zik7Cn0KCi8qIEhlcmUgaXMgdGhlIGlucHV0 IHRlcm1pbmFsIHNldHRpbmcgd2Ugc2F2ZSwgYW5kIHRoZSByb3V0aW5lIHRvIHJlc3RvcmUgdGhl bQogKiBvbiBleGl0IHNvIHRoZSB1c2VyIGNhbiBzZWUgd2hhdCB0aGV5IHR5cGUgbmV4dC4gKi8K c3RhdGljIHN0cnVjdCB0ZXJtaW9zIG9yaWdfdGVybTsKc3RhdGljIHZvaWQgcmVzdG9yZV90ZXJt KHZvaWQpCnsKCXRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csICZvcmlnX3Rlcm0pOwp9 CgovKiBXZSBhc3NvY2lhdGUgc29tZSBkYXRhIHdpdGggdGhlIGNvbnNvbGUgZm9yIG91ciBleGl0 IGhhY2suICovCnN0cnVjdCBjb25zb2xlX2Fib3J0CnsKCS8qIEhvdyBtYW55IHRpbWVzIGhhdmUg dGhleSBoaXQgXkM/ICovCglpbnQgY291bnQ7CgkvKiBXaGVuIGRpZCB0aGV5IHN0YXJ0PyAqLwoJ c3RydWN0IHRpbWV2YWwgc3RhcnQ7Cn07CgovKiBUaGlzIGlzIHRoZSByb3V0aW5lIHdoaWNoIGhh bmRsZXMgY29uc29sZSBpbnB1dCAoaWUuIHN0ZGluKS4gKi8Kc3RhdGljIGJvb2wgaGFuZGxlX2Nv bnNvbGVfaW5wdXQoaW50IGZkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXUzMiBpcnEgPSAwLCAq bGVucDsKCWludCBsZW47Cgl1bnNpZ25lZCBpbnQgbnVtOwoJc3RydWN0IGlvdmVjIGlvdltMR1VF U1RfTUFYX0RNQV9TRUNUSU9OU107CglzdHJ1Y3QgY29uc29sZV9hYm9ydCAqYWJvcnQgPSBkZXYt PnByaXY7CgoJLyogRmlyc3Qgd2UgZ2V0IHRoZSBjb25zb2xlIGJ1ZmZlciBmcm9tIHRoZSBHdWVz dC4gIFRoZSBrZXkgaXMgZGV2LT5tZW0KCSAqIHdoaWNoIHdhcyBzZXQgdG8gMCBpbiBzZXR1cF9j b25zb2xlKCkuICovCglsZW5wID0gZ2V0X2RtYV9idWZmZXIoZmQsIGRldi0+bWVtLCBpb3YsICZu dW0sICZpcnEpOwoJaWYgKCFsZW5wKSB7CgkJLyogSWYgaXQncyBub3QgcmVhZHkgZm9yIGlucHV0 LCB3YXJuIGFuZCBzZXQgdXAgdG8gZGlzY2FyZC4gKi8KCQl3YXJuKCJjb25zb2xlOiBubyBkbWEg YnVmZmVyISIpOwoJCWRpc2NhcmRfaW92ZWMoaW92LCAmbnVtKTsKCX0KCgkvKiBUaGlzIGlzIHdo eSB3ZSBjb252ZXJ0IHRvIGlvdmVjczogdGhlIHJlYWR2KCkgY2FsbCB1c2VzIHRoZW0sIGFuZCBz bwoJICogaXQgcmVhZHMgc3RyYWlnaHQgaW50byB0aGUgR3Vlc3QncyBidWZmZXIuICovCglsZW4g PSByZWFkdihkZXYtPmZkLCBpb3YsIG51bSk7CglpZiAobGVuIDw9IDApIHsKCQkvKiBUaGlzIGlt cGxpZXMgdGhhdCB0aGUgY29uc29sZSBpcyBjbG9zZWQsIGlzIC9kZXYvbnVsbCwgb3IKCQkgKiBz b21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZy4gIFdlIHN0aWxsIGdvIHRocm91Z2ggdGhlIHJl c3QKCQkgKiBvZiB0aGUgbG9naWMsIHRob3VnaCwgZXNwZWNpYWxseSB0aGUgZXhpdCBoYW5kbGlu ZyBiZWxvdy4gKi8KCQl3YXJueCgiRmFpbGVkIHRvIGdldCBjb25zb2xlIGlucHV0LCBpZ25vcmlu ZyBjb25zb2xlLiIpOwoJCWxlbiA9IDA7Cgl9CgoJLyogSWYgd2UgcmVhZCB0aGUgZGF0YSBpbnRv IHRoZSBHdWVzdCwgZmlsbCBpbiB0aGUgbGVuZ3RoIGFuZCBzZW5kIHRoZQoJICogaW50ZXJydXB0 LiAqLwoJaWYgKGxlbnApIHsKCQkqbGVucCA9IGxlbjsKCQl0cmlnZ2VyX2lycShmZCwgaXJxKTsK CX0KCgkvKiBUaHJlZSBeQyB3aXRoaW4gb25lIHNlY29uZD8gIEV4aXQuCgkgKgoJICogVGhpcyBp cyBzdWNoIGEgaGFjaywgYnV0IHdvcmtzIHN1cnByaXNpbmdseSB3ZWxsLiAgRWFjaCBeQyBoYXMg dG8gYmUKCSAqIGluIGEgYnVmZmVyIGJ5IGl0c2VsZiwgc28gdGhleSBjYW4ndCBiZSB0b28gZmFz dC4gIEJ1dCB3ZSBjaGVjayB0aGF0CgkgKiB3ZSBnZXQgdGhyZWUgd2l0aGluIGFib3V0IGEgc2Vj b25kLCBzbyB0aGV5IGNhbid0IGJlIHRvbyBzbG93LiAqLwoJaWYgKGxlbiA9PSAxICYmICgoY2hh ciAqKWlvdlswXS5pb3ZfYmFzZSlbMF0gPT0gMykgewoJCWlmICghYWJvcnQtPmNvdW50KyspCgkJ CWdldHRpbWVvZmRheSgmYWJvcnQtPnN0YXJ0LCBOVUxMKTsKCQllbHNlIGlmIChhYm9ydC0+Y291 bnQgPT0gMykgewoJCQlzdHJ1Y3QgdGltZXZhbCBub3c7CgkJCWdldHRpbWVvZmRheSgmbm93LCBO VUxMKTsKCQkJaWYgKG5vdy50dl9zZWMgPD0gYWJvcnQtPnN0YXJ0LnR2X3NlYysxKSB7CgkJCQl1 MzIgYXJnc1tdID0geyBMSFJFUV9CUkVBSywgMCB9OwoJCQkJLyogQ2xvc2UgdGhlIGZkIHNvIFdh a2VyIHdpbGwga25vdyBpdCBoYXMgdG8KCQkJCSAqIGV4aXQuICovCgkJCQljbG9zZSh3YWtlcl9m ZCk7CgkJCQkvKiBKdXN0IGluIGNhc2Ugd2FrZXIgaXMgYmxvY2tlZCBpbiBCUkVBSywgc2VuZAoJ CQkJICogdW5icmVhayBub3cuICovCgkJCQl3cml0ZShmZCwgYXJncywgc2l6ZW9mKGFyZ3MpKTsK CQkJCWV4aXQoMik7CgkJCX0KCQkJYWJvcnQtPmNvdW50ID0gMDsKCQl9Cgl9IGVsc2UKCQkvKiBB bnkgb3RoZXIga2V5IHJlc2V0cyB0aGUgYWJvcnQgY291bnRlci4gKi8KCQlhYm9ydC0+Y291bnQg PSAwOwoKCS8qIE5vdywgaWYgd2UgZGlkbid0IHJlYWQgYW55dGhpbmcsIHB1dCB0aGUgaW5wdXQg dGVybWluYWwgYmFjayBhbmQKCSAqIHJldHVybiBmYWlsdXJlIChtZWFuaW5nLCBkb24ndCBjYWxs IHVzIGFnYWluKS4gKi8KCWlmICghbGVuKSB7CgkJcmVzdG9yZV90ZXJtKCk7CgkJcmV0dXJuIGZh bHNlOwoJfQoJLyogRXZlcnl0aGluZyB3ZW50IE9LISAqLwoJcmV0dXJuIHRydWU7Cn0KCi8qIEhh bmRsaW5nIGNvbnNvbGUgb3V0cHV0IGlzIG11Y2ggc2ltcGxlciB0aGFuIGlucHV0LiAqLwpzdGF0 aWMgdTMyIGhhbmRsZV9jb25zb2xlX291dHB1dChpbnQgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAq aW92LAoJCQkJIHVuc2lnbmVkIG51bSwgc3RydWN0IGRldmljZSpkZXYpCnsKCS8qIFdoYXRldmVy IHRoZSBHdWVzdCBzZW5kcywgd3JpdGUgaXQgdG8gc3RhbmRhcmQgb3V0cHV0LiAgUmV0dXJuIHRo ZQoJICogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uICovCglyZXR1cm4gd3JpdGV2KFNURE9VVF9G SUxFTk8sIGlvdiwgbnVtKTsKfQoKLyogR3Vlc3QtPkhvc3QgbmV0d29yayBvdXRwdXQgaXMgYWxz byBwcmV0dHkgZWFzeS4gKi8Kc3RhdGljIHUzMiBoYW5kbGVfdHVuX291dHB1dChpbnQgZmQsIGNv bnN0IHN0cnVjdCBpb3ZlYyAqaW92LAoJCQkgICAgIHVuc2lnbmVkIG51bSwgc3RydWN0IGRldmlj ZSAqZGV2KQp7CgkvKiBXZSBwdXQgYSBmbGFnIGluIHRoZSAicHJpdiIgcG9pbnRlciBvZiB0aGUg bmV0d29yayBkZXZpY2UsIGFuZCBzZXQKCSAqIGl0IGFzIHNvb24gYXMgd2Ugc2VlIG91dHB1dC4g IFdlJ2xsIHNlZSB3aHkgaW4gaGFuZGxlX3R1bl9pbnB1dCgpICovCgkqKGJvb2wgKilkZXYtPnBy aXYgPSB0cnVlOwoJLyogV2hhdGV2ZXIgcGFja2V0IHRoZSBHdWVzdCBzZW50IHVzLCB3cml0ZSBp dCBvdXQgdG8gdGhlIHR1bgoJICogZGV2aWNlLiAqLwoJcmV0dXJuIHdyaXRldihkZXYtPmZkLCBp b3YsIG51bSk7Cn0KCi8qIFRoaXMgbWF0Y2hlcyB0aGUgcGVlcl9rZXkoKSBpbiBsZ3Vlc3RfbmV0 LmMuICBUaGUga2V5IGZvciBhbnkgZ2l2ZW4gc2xvdAogKiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUg bmV0d29yayBkZXZpY2UncyBwYWdlIHBsdXMgNCAqIHRoZSBzbG90IG51bWJlci4gKi8Kc3RhdGlj IHVuc2lnbmVkIGxvbmcgcGVlcl9vZmZzZXQodW5zaWduZWQgaW50IHBlZXJudW0pCnsKCXJldHVy biA0ICogcGVlcm51bTsKfQoKLyogVGhpcyBpcyB3aGVyZSB3ZSBoYW5kbGUgYSBwYWNrZXQgY29t aW5nIGluIGZyb20gdGhlIHR1biBkZXZpY2UgKi8Kc3RhdGljIGJvb2wgaGFuZGxlX3R1bl9pbnB1 dChpbnQgZmQsIHN0cnVjdCBkZXZpY2UgKmRldikKewoJdTMyIGlycSA9IDAsICpsZW5wOwoJaW50 IGxlbjsKCXVuc2lnbmVkIG51bTsKCXN0cnVjdCBpb3ZlYyBpb3ZbTEdVRVNUX01BWF9ETUFfU0VD VElPTlNdOwoKCS8qIEZpcnN0IHdlIGdldCBhIGJ1ZmZlciB0aGUgR3Vlc3QgaGFzIGJvdW5kIHRv IGl0cyBrZXkuICovCglsZW5wID0gZ2V0X2RtYV9idWZmZXIoZmQsIGRldi0+bWVtK3BlZXJfb2Zm c2V0KE5FVF9QRUVSTlVNKSwgaW92LCAmbnVtLAoJCQkgICAgICAmaXJxKTsKCWlmICghbGVucCkg ewoJCS8qIE5vdywgaXQncyBleHBlY3RlZCB0aGF0IGlmIHdlIHRyeSB0byBzZW5kIGEgcGFja2V0 IHRvbwoJCSAqIGVhcmx5LCB0aGUgR3Vlc3Qgd29uJ3QgYmUgcmVhZHkgeWV0LiAgVGhpcyBpcyB3 aHkgd2Ugc2V0IGEKCQkgKiBmbGFnIHdoZW4gdGhlIEd1ZXN0IHNlbmRzIGl0cyBmaXJzdCBwYWNr ZXQuICBJZiBpdCdzIHNlbnQgYQoJCSAqIHBhY2tldCB3ZSBhc3N1bWUgaXQgc2hvdWxkIGJlIHJl YWR5IHRvIHJlY2VpdmUgdGhlbS4KCQkgKgoJCSAqIEFjdHVhbGx5LCB0aGlzIGlzIHdoYXQgdGhl IHN0YXR1cyBiaXRzIGluIHRoZSBkZXNjcmlwdG9yIGFyZQoJCSAqIGZvcjogd2Ugc2hvdWxkICp1 c2UqIHRoZW0uICBGSVhNRSEgKi8KCQlpZiAoKihib29sICopZGV2LT5wcml2KQoJCQl3YXJuKCJu ZXR3b3JrOiBubyBkbWEgYnVmZmVyISIpOwoJCWRpc2NhcmRfaW92ZWMoaW92LCAmbnVtKTsKCX0K CgkvKiBSZWFkIHRoZSBwYWNrZXQgZnJvbSB0aGUgZGV2aWNlIGRpcmVjdGx5IGludG8gdGhlIEd1 ZXN0J3MgYnVmZmVyLiAqLwoJbGVuID0gcmVhZHYoZGV2LT5mZCwgaW92LCBudW0pOwoJaWYgKGxl biA8PSAwKQoJCWVycigxLCAicmVhZGluZyBuZXR3b3JrIik7CgoJLyogV3JpdGUgdGhlIHVzZWRf bGVuLCBhbmQgdHJpZ2dlciB0aGUgaW50ZXJydXB0IGZvciB0aGUgR3Vlc3QgKi8KCWlmIChsZW5w KSB7CgkJKmxlbnAgPSBsZW47CgkJdHJpZ2dlcl9pcnEoZmQsIGlycSk7Cgl9Cgl2ZXJib3NlKCJ0 dW4gaW5wdXQgcGFja2V0IGxlbiAlaSBbJTAyeCAlMDJ4XSAoJXMpXG4iLCBsZW4sCgkJKCh1OCAq KWlvdlswXS5pb3ZfYmFzZSlbMF0sICgodTggKilpb3ZbMF0uaW92X2Jhc2UpWzFdLAoJCWxlbnAg PyAic2VudCIgOiAiZGlzY2FyZGVkIik7CgkvKiBBbGwgZ29vZC4gKi8KCXJldHVybiB0cnVlOwp9 CgovKiBUaGUgbGFzdCBkZXZpY2UgaGFuZGxpbmcgcm91dGluZSBpcyBibG9jayBvdXRwdXQ6IHRo ZSBHdWVzdCBoYXMgc2VudCBhIERNQQogKiB0byB0aGUgYmxvY2sgZGV2aWNlLiAgSXQgd2lsbCBo YXZlIHBsYWNlZCB0aGUgY29tbWFuZCBpdCB3YW50cyBpbiB0aGUKICogInN0cnVjdCBsZ3Vlc3Rf YmxvY2tfcGFnZSIuICovCnN0YXRpYyB1MzIgaGFuZGxlX2Jsb2NrX291dHB1dChpbnQgZmQsIGNv bnN0IHN0cnVjdCBpb3ZlYyAqaW92LAoJCQkgICAgICAgdW5zaWduZWQgbnVtLCBzdHJ1Y3QgZGV2 aWNlICpkZXYpCnsKCXN0cnVjdCBsZ3Vlc3RfYmxvY2tfcGFnZSAqcCA9IGRldi0+bWVtOwoJdTMy IGlycSwgKmxlbnA7Cgl1bnNpZ25lZCBpbnQgbGVuLCByZXBseV9udW07CglzdHJ1Y3QgaW92ZWMg cmVwbHlbTEdVRVNUX01BWF9ETUFfU0VDVElPTlNdOwoJb2ZmNjRfdCBkZXZpY2VfbGVuLCBvZmYg PSAob2ZmNjRfdClwLT5zZWN0b3IgKiA1MTI7CgoJLyogRmlyc3Qgd2UgZXh0cmFjdCB0aGUgZGV2 aWNlIGxlbmd0aCBmcm9tIHRoZSBkZXYtPnByaXYgcG9pbnRlci4gKi8KCWRldmljZV9sZW4gPSAq KG9mZjY0X3QgKilkZXYtPnByaXY7CgoJLyogV2UgZmlyc3QgY2hlY2sgdGhhdCB0aGUgcmVhZCBv ciB3cml0ZSBpcyB3aXRoaW4gdGhlIGxlbmd0aCBvZiB0aGUKCSAqIGJsb2NrIGZpbGUuICovCglp ZiAob2ZmID49IGRldmljZV9sZW4pCgkJZXJyKDEsICJCYWQgb2Zmc2V0ICVsbHUgdnMgJWxsdSIs IG9mZiwgZGV2aWNlX2xlbik7CgkvKiBNb3ZlIHRvIHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUg YmxvY2sgZmlsZS4gIFRoaXMgc2hvdWxkbid0IGZhaWwsCgkgKiBidXQgYmVzdCB0byBjaGVjay4g Ki8KCWlmIChsc2VlazY0KGRldi0+ZmQsIG9mZiwgU0VFS19TRVQpICE9IG9mZikKCQllcnIoMSwg IkJhZCBzZWVrIHRvIHNlY3RvciAlaSIsIHAtPnNlY3Rvcik7CgoJdmVyYm9zZSgiQmxvY2s6ICVz IGF0IG9mZnNldCAlbGx1XG4iLCBwLT50eXBlID8gIldSSVRFIiA6ICJSRUFEIiwgb2ZmKTsKCgkv KiBUaGV5IHdlcmUgc3VwcG9zZWQgdG8gYmluZCBhIHJlcGx5IGJ1ZmZlciBhdCBrZXkgZXF1YWwg dG8gdGhlIHN0YXJ0CgkgKiBvZiB0aGUgYmxvY2sgZGV2aWNlIG1lbW9yeS4gIFdlIG5lZWQgdGhp cyB0byB0ZWxsIHRoZW0gd2hlbiB0aGUKCSAqIHJlcXVlc3QgaXMgZmluaXNoZWQuICovCglsZW5w ID0gZ2V0X2RtYV9idWZmZXIoZmQsIGRldi0+bWVtLCByZXBseSwgJnJlcGx5X251bSwgJmlycSk7 CglpZiAoIWxlbnApCgkJZXJyKDEsICJCbG9jayByZXF1ZXN0IGRpZG4ndCBnaXZlIHVzIGEgZG1h IGJ1ZmZlciIpOwoKCWlmIChwLT50eXBlKSB7CgkJLyogQSB3cml0ZSByZXF1ZXN0LiAgVGhlIERN QSB0aGV5IHNlbnQgY29udGFpbmVkIHRoZSBkYXRhLCBzbwoJCSAqIHdyaXRlIGl0IG91dC4gKi8K CQlsZW4gPSB3cml0ZXYoZGV2LT5mZCwgaW92LCBudW0pOwoJCS8qIEdyci4uLiBOb3cgd2Uga25v dyBob3cgbG9uZyB0aGUgInN0cnVjdCBsZ3Vlc3RfZG1hIiB0aGV5CgkJICogc2VudCB3YXMsIHdl IG1ha2Ugc3VyZSB0aGV5IGRpZG4ndCB0cnkgdG8gd3JpdGUgb3ZlciB0aGUgZW5kCgkJICogb2Yg dGhlIGJsb2NrIGZpbGUgKHBvc3NpYmx5IGV4dGVuZGluZyBpdCkuICovCgkJaWYgKG9mZiArIGxl biA+IGRldmljZV9sZW4pIHsKCQkJLyogVHJpbSBpdCBiYWNrIHRvIHRoZSBjb3JyZWN0IGxlbmd0 aCAqLwoJCQlmdHJ1bmNhdGUoZGV2LT5mZCwgZGV2aWNlX2xlbik7CgkJCS8qIERpZSwgYmFkIEd1 ZXN0LCBkaWUuICovCgkJCWVycngoMSwgIldyaXRlIHBhc3QgZW5kICVsbHUrJXUiLCBvZmYsIGxl bik7CgkJfQoJCS8qIFRoZSByZXBseSBsZW5ndGggaXMgMDogd2UganVzdCBzZW5kIGJhY2sgYW4g ZW1wdHkgRE1BIHRvCgkJICogaW50ZXJydXB0IHRoZW0gYW5kIHRlbGwgdGhlbSB0aGUgd3JpdGUg aXMgZmluaXNoZWQuICovCgkJKmxlbnAgPSAwOwoJfSBlbHNlIHsKCQkvKiBBIHJlYWQgcmVxdWVz dC4gIFRoZXkgc2VudCBhbiBlbXB0eSBETUEgdG8gc3RhcnQgdGhlCgkJICogcmVxdWVzdCwgYW5k IHdlIHB1dCB0aGUgcmVhZCBjb250ZW50cyBpbnRvIHRoZSByZXBseQoJCSAqIGJ1ZmZlci4gKi8K CQlsZW4gPSByZWFkdihkZXYtPmZkLCByZXBseSwgcmVwbHlfbnVtKTsKCQkqbGVucCA9IGxlbjsK CX0KCgkvKiBUaGUgcmVzdWx0IGlzIDEgKGRvbmUpLCAyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAo c2hvcnQgcmVhZCBvcgoJICogd3JpdGUpLiAqLwoJcC0+cmVzdWx0ID0gMSArIChwLT5ieXRlcyAh PSBsZW4pOwoJLyogTm93IHRlbGwgdGhlbSB3ZSd2ZSB1c2VkIHRoZWlyIHJlcGx5IGJ1ZmZlci4g Ki8KCXRyaWdnZXJfaXJxKGZkLCBpcnEpOwoKCS8qIFdlJ3JlIHN1cHBvc2VkIHRvIHJldHVybiB0 aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIHdlCgkgKiB1c2VkLiAgQnV0 IHRoZSBibG9jayBkZXZpY2UgdXNlcyB0aGUgInJlc3VsdCIgZmllbGQgaW5zdGVhZCwgc28gd2UK CSAqIGRvbid0IGJvdGhlci4gKi8KCXJldHVybiAwOwp9CgovKiBUaGlzIGlzIHRoZSBnZW5lcmlj IHJvdXRpbmUgd2UgY2FsbCB3aGVuIHRoZSBHdWVzdCBzZW5kcyBzb21lIERNQSBvdXQuICovCnN0 YXRpYyB2b2lkIGhhbmRsZV9vdXRwdXQoaW50IGZkLCB1bnNpZ25lZCBsb25nIGRtYSwgdW5zaWdu ZWQgbG9uZyBrZXksCgkJCSAgc3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VzKQp7CglzdHJ1Y3Qg ZGV2aWNlICppOwoJdTMyICpsZW5wOwoJc3RydWN0IGlvdmVjIGlvdltMR1VFU1RfTUFYX0RNQV9T RUNUSU9OU107Cgl1bnNpZ25lZCBudW0gPSAwOwoKCS8qIENvbnZlcnQgdGhlICJzdHJ1Y3QgbGd1 ZXN0X2RtYSIgdGhleSdyZSBzZW5kaW5nIHRvIGEgInN0cnVjdAoJICogaW92ZWMiLiAqLwoJbGVu cCA9IGRtYTJpb3YoZG1hLCBpb3YsICZudW0pOwoKCS8qIENoZWNrIGVhY2ggZGV2aWNlOiBpZiB0 aGV5IGV4cGVjdCBvdXRwdXQgdG8gdGhpcyBrZXksIHRlbGwgdGhlbSB0bwoJICogaGFuZGxlIGl0 LiAqLwoJZm9yIChpID0gZGV2aWNlcy0+ZGV2OyBpOyBpID0gaS0+bmV4dCkgewoJCWlmIChpLT5o YW5kbGVfb3V0cHV0ICYmIGtleSA9PSBpLT53YXRjaF9rZXkpIHsKCQkJLyogV2Ugd3JpdGUgdGhl IHJlc3VsdCBzdHJhaWdodCBpbnRvIHRoZSB1c2VkX2xlbiBmaWVsZAoJCQkgKiBmb3IgdGhlbS4g Ki8KCQkJKmxlbnAgPSBpLT5oYW5kbGVfb3V0cHV0KGZkLCBpb3YsIG51bSwgaSk7CgkJCXJldHVy bjsKCQl9Cgl9CgoJLyogVGhpcyBjYW4gaGFwcGVuOiB0aGUga2VybmVsIHNlbmRzIGFueSBTRU5E X0RNQSB3aGljaCBkb2Vzbid0IG1hdGNoCgkgKiBhbm90aGVyIEd1ZXN0IHRvIHVzLiAgSXQgY291 bGQgYmUgdGhhdCBhbm90aGVyIEd1ZXN0IGp1c3QgbGVmdCBhCgkgKiBuZXR3b3JrLCBmb3IgZXhh bXBsZS4gIEJ1dCBpdCdzIHVudXN1YWwuICovCgl3YXJueCgiUGVuZGluZyBkbWEgJXAsIGtleSAl cCIsICh2b2lkICopZG1hLCAodm9pZCAqKWtleSk7Cn0KCi8qIFRoaXMgaXMgY2FsbGVkIHdoZW4g dGhlIHdha2VyIHdha2VzIHVzIHVwOiBjaGVjayBmb3IgaW5jb21pbmcgZmlsZQogKiBkZXNjcmlw dG9ycy4gKi8Kc3RhdGljIHZvaWQgaGFuZGxlX2lucHV0KGludCBmZCwgc3RydWN0IGRldmljZV9s aXN0ICpkZXZpY2VzKQp7CgkvKiBzZWxlY3QoKSB3YW50cyBhIHplcm9lZCB0aW1ldmFsIHRvIG1l YW4gImRvbid0IHdhaXQiLiAqLwoJc3RydWN0IHRpbWV2YWwgcG9sbCA9IHsgLnR2X3NlYyA9IDAs IC50dl91c2VjID0gMCB9OwoKCWZvciAoOzspIHsKCQlzdHJ1Y3QgZGV2aWNlICppOwoJCWZkX3Nl dCBmZHMgPSBkZXZpY2VzLT5pbmZkczsKCgkJLyogSWYgbm90aGluZyBpcyByZWFkeSwgd2UncmUg ZG9uZS4gKi8KCQlpZiAoc2VsZWN0KGRldmljZXMtPm1heF9pbmZkKzEsICZmZHMsIE5VTEwsIE5V TEwsICZwb2xsKSA9PSAwKQoJCQlicmVhazsKCgkJLyogT3RoZXJ3aXNlLCBjYWxsIHRoZSBkZXZp Y2Uocykgd2hpY2ggaGF2ZSByZWFkYWJsZQoJCSAqIGZpbGUgZGVzY3JpcHRvcnMgYW5kIGEgbWV0 aG9kIG9mIGhhbmRsaW5nIHRoZW0uICAqLwoJCWZvciAoaSA9IGRldmljZXMtPmRldjsgaTsgaSA9 IGktPm5leHQpIHsKCQkJaWYgKGktPmhhbmRsZV9pbnB1dCAmJiBGRF9JU1NFVChpLT5mZCwgJmZk cykpIHsKCQkJCS8qIElmIGhhbmRsZV9pbnB1dCgpIHJldHVybnMgZmFsc2UsIGl0IG1lYW5zIHdl CgkJCQkgKiBzaG91bGQgbm8gbG9uZ2VyIHNlcnZpY2UgaXQuCgkJCQkgKiBoYW5kbGVfY29uc29s ZV9pbnB1dCgpIGRvZXMgdGhpcy4gKi8KCQkJCWlmICghaS0+aGFuZGxlX2lucHV0KGZkLCBpKSkg ewoJCQkJCS8qIENsZWFyIGl0IGZyb20gdGhlIHNldCBvZiBpbnB1dCBmaWxlCgkJCQkJICogZGVz Y3JpcHRvcnMga2VwdCBhdCB0aGUgaGVhZCBvZiB0aGUKCQkJCQkgKiBkZXZpY2UgbGlzdC4gKi8K CQkJCQlGRF9DTFIoaS0+ZmQsICZkZXZpY2VzLT5pbmZkcyk7CgkJCQkJLyogVGVsbCB3YWtlciB0 byBpZ25vcmUgaXQgdG9vLi4uICovCgkJCQkJd3JpdGUod2FrZXJfZmQsICZpLT5mZCwgc2l6ZW9m KGktPmZkKSk7CgkJCQl9CgkJCX0KCQl9Cgl9Cn0KCi8qTDoxOTAKICogRGV2aWNlIFNldHVwCiAq CiAqIEFsbCBkZXZpY2VzIG5lZWQgYSBkZXNjcmlwdG9yIHNvIHRoZSBHdWVzdCBrbm93cyBpdCBl eGlzdHMsIGFuZCBhICJzdHJ1Y3QKICogZGV2aWNlIiBzbyB0aGUgTGF1bmNoZXIgY2FuIGtlZXAg dHJhY2sgb2YgaXQuICBXZSBoYXZlIGNvbW1vbiBoZWxwZXIKICogcm91dGluZXMgdG8gYWxsb2Nh dGUgdGhlbS4KICoKICogVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhIG5ldyAic3RydWN0IGxndWVz dF9kZXZpY2VfZGVzYyIgZnJvbSBkZXNjcmlwdG9yCiAqIHRhYmxlIGluIHRoZSBkZXZpY2VzIGFy cmF5IGp1c3QgYWJvdmUgdGhlIEd1ZXN0J3Mgbm9ybWFsIG1lbW9yeS4gKi8Kc3RhdGljIHN0cnVj dCBsZ3Vlc3RfZGV2aWNlX2Rlc2MgKgpuZXdfZGV2X2Rlc2Moc3RydWN0IGxndWVzdF9kZXZpY2Vf ZGVzYyAqZGVzY3MsCgkgICAgIHUxNiB0eXBlLCB1MTYgZmVhdHVyZXMsIHUxNiBudW1fcGFnZXMp CnsKCXVuc2lnbmVkIGludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBMR1VFU1RfTUFYX0RFVklDRVM7 IGkrKykgewoJCWlmICghZGVzY3NbaV0udHlwZSkgewoJCQlkZXNjc1tpXS50eXBlID0gdHlwZTsK CQkJZGVzY3NbaV0uZmVhdHVyZXMgPSBmZWF0dXJlczsKCQkJZGVzY3NbaV0ubnVtX3BhZ2VzID0g bnVtX3BhZ2VzOwoJCQkvKiBJZiB0aGV5IHNhaWQgdGhlIGRldmljZSBuZWVkcyBtZW1vcnksIHdl IGFsbG9jYXRlCgkJCSAqIHRoYXQgbm93LCBidW1waW5nIHVwIHRoZSB0b3Agb2YgR3Vlc3QgbWVt b3J5LiAqLwoJCQlpZiAobnVtX3BhZ2VzKSB7CgkJCQltYXBfemVyb2VkX3BhZ2VzKHRvcCwgbnVt X3BhZ2VzKTsKCQkJCWRlc2NzW2ldLnBmbiA9IHRvcC9nZXRwYWdlc2l6ZSgpOwoJCQkJdG9wICs9 IG51bV9wYWdlcypnZXRwYWdlc2l6ZSgpOwoJCQl9CgkJCXJldHVybiAmZGVzY3NbaV07CgkJfQoJ fQoJZXJyeCgxLCAidG9vIG1hbnkgZGV2aWNlcyIpOwp9CgovKiBUaGlzIG1vbnN0ZXIgcm91dGlu ZSBkb2VzIGFsbCB0aGUgY3JlYXRpb24gYW5kIHNldHVwIG9mIGEgbmV3IGRldmljZSwKICogaW5j bHVkaW5nIGNhbGluZyBuZXdfZGV2X2Rlc2MoKSB0byBhbGxvY2F0ZSB0aGUgZGVzY3JpcHRvciBh bmQgZGV2aWNlCiAqIG1lbW9yeS4gKi8Kc3RhdGljIHN0cnVjdCBkZXZpY2UgKm5ld19kZXZpY2Uo c3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VzLAoJCQkJIHUxNiB0eXBlLCB1MTYgbnVtX3BhZ2Vz LCB1MTYgZmVhdHVyZXMsCgkJCQkgaW50IGZkLAoJCQkJIGJvb2wgKCpoYW5kbGVfaW5wdXQpKGlu dCwgc3RydWN0IGRldmljZSAqKSwKCQkJCSB1bnNpZ25lZCBsb25nIHdhdGNoX29mZiwKCQkJCSB1 MzIgKCpoYW5kbGVfb3V0cHV0KShpbnQsCgkJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAq LAoJCQkJCQkgICAgICB1bnNpZ25lZCwKCQkJCQkJICAgICAgc3RydWN0IGRldmljZSAqKSkKewoJ c3RydWN0IGRldmljZSAqZGV2ID0gbWFsbG9jKHNpemVvZigqZGV2KSk7CgoJLyogQXBwZW5kIHRv IGRldmljZSBsaXN0LiAgUHJlcGVuZGluZyB0byBhIHNpbmdsZS1saW5rZWQgbGlzdCBpcwoJICog ZWFzaWVyLCBidXQgdGhlIHVzZXIgZXhwZWN0cyB0aGUgZGV2aWNlcyB0byBiZSBhcnJhbmdlZCBv biB0aGUgYnVzCgkgKiBpbiBjb21tYW5kLWxpbmUgb3JkZXIuICBUaGUgZmlyc3QgbmV0d29yayBk ZXZpY2Ugb24gdGhlIGNvbW1hbmQgbGluZQoJICogaXMgZXRoMCwgdGhlIGZpcnN0IGJsb2NrIGRl dmljZSAvZGV2L2xnYmEsIGV0Yy4gKi8KCSpkZXZpY2VzLT5sYXN0ZGV2ID0gZGV2OwoJZGV2LT5u ZXh0ID0gTlVMTDsKCWRldmljZXMtPmxhc3RkZXYgPSAmZGV2LT5uZXh0OwoKCS8qIE5vdyB3ZSBw b3B1bGF0ZSB0aGUgZmllbGRzIG9uZSBhdCBhIHRpbWUuICovCglkZXYtPmZkID0gZmQ7CgkvKiBJ ZiB3ZSBoYXZlIGFuIGlucHV0IGhhbmRsZXIgZm9yIHRoaXMgZmlsZSBkZXNjcmlwdG9yLCB0aGVu IHdlIGFkZCBpdAoJICogdG8gdGhlIGRldmljZV9saXN0J3MgZmRzZXQgYW5kIG1heGZkLiAqLwoJ aWYgKGhhbmRsZV9pbnB1dCkKCQlzZXRfZmQoZGV2LT5mZCwgZGV2aWNlcyk7CglkZXYtPmRlc2Mg PSBuZXdfZGV2X2Rlc2MoZGV2aWNlcy0+ZGVzY3MsIHR5cGUsIGZlYXR1cmVzLCBudW1fcGFnZXMp OwoJZGV2LT5tZW0gPSAodm9pZCAqKShkZXYtPmRlc2MtPnBmbiAqIGdldHBhZ2VzaXplKCkpOwoJ ZGV2LT5oYW5kbGVfaW5wdXQgPSBoYW5kbGVfaW5wdXQ7CglkZXYtPndhdGNoX2tleSA9ICh1bnNp Z25lZCBsb25nKWRldi0+bWVtICsgd2F0Y2hfb2ZmOwoJZGV2LT5oYW5kbGVfb3V0cHV0ID0gaGFu ZGxlX291dHB1dDsKCXJldHVybiBkZXY7Cn0KCi8qIE91ciBmaXJzdCBzZXR1cCByb3V0aW5lIGlz IHRoZSBjb25zb2xlLiAgSXQncyBhIGZhaXJseSBzaW1wbGUgZGV2aWNlLCBidXQKICogVU5JWCB0 dHkgaGFuZGxpbmcgbWFrZXMgaXQgdWdsaWVyIHRoYW4gaXQgY291bGQgYmUuICovCnN0YXRpYyB2 b2lkIHNldHVwX2NvbnNvbGUoc3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VzKQp7CglzdHJ1Y3Qg ZGV2aWNlICpkZXY7CgoJLyogSWYgd2UgY2FuIHNhdmUgdGhlIGluaXRpYWwgc3RhbmRhcmQgaW5w dXQgc2V0dGluZ3MuLi4gKi8KCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmb3JpZ190ZXJt KSA9PSAwKSB7CgkJc3RydWN0IHRlcm1pb3MgdGVybSA9IG9yaWdfdGVybTsKCQkvKiBUaGVuIHdl IHR1cm4gb2ZmIGVjaG8sIGxpbmUgYnVmZmVyaW5nIGFuZCBeQyBldGMuICBXZSB3YW50IGEKCQkg KiByYXcgaW5wdXQgc3RyZWFtIHRvIHRoZSBHdWVzdC4gKi8KCQl0ZXJtLmNfbGZsYWcgJj0gfihJ U0lHfElDQU5PTnxFQ0hPKTsKCQl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBTk9XLCAmdGVy bSk7CgkJLyogSWYgd2UgZXhpdCBncmFjZWZ1bGx5LCB0aGUgb3JpZ2luYWwgc2V0dGluZ3Mgd2ls bCBiZQoJCSAqIHJlc3RvcmVkIHNvIHRoZSB1c2VyIGNhbiBzZWUgd2hhdCB0aGV5J3JlIHR5cGlu Zy4gKi8KCQlhdGV4aXQocmVzdG9yZV90ZXJtKTsKCX0KCgkvKiBXZSBkb24ndCBjdXJyZW50bHkg cmVxdWlyZSBhbnkgbWVtb3J5IGZvciB0aGUgY29uc29sZSwgc28gd2UgYXNrIGZvcgoJICogMCBw YWdlcy4gKi8KCWRldiA9IG5ld19kZXZpY2UoZGV2aWNlcywgTEdVRVNUX0RFVklDRV9UX0NPTlNP TEUsIDAsIDAsCgkJCSBTVERJTl9GSUxFTk8sIGhhbmRsZV9jb25zb2xlX2lucHV0LAoJCQkgTEdV RVNUX0NPTlNPTEVfRE1BX0tFWSwgaGFuZGxlX2NvbnNvbGVfb3V0cHV0KTsKCS8qIFdlIHN0b3Jl IHRoZSBjb25zb2xlIHN0YXRlIGluIGRldi0+cHJpdiwgYW5kIGluaXRpYWxpemUgaXQuICovCglk ZXYtPnByaXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25zb2xlX2Fib3J0KSk7CgkoKHN0cnVj dCBjb25zb2xlX2Fib3J0ICopZGV2LT5wcml2KS0+Y291bnQgPSAwOwoJdmVyYm9zZSgiZGV2aWNl ICVwOiBjb25zb2xlXG4iLAoJCSh2b2lkICopKGRldi0+ZGVzYy0+cGZuICogZ2V0cGFnZXNpemUo KSkpOwp9CgovKiBTZXR0aW5nIHVwIGEgYmxvY2sgZmlsZSBpcyBhbHNvIGZhaXJseSBzdHJhaWdo dGZvcndhcmQuICovCnN0YXRpYyB2b2lkIHNldHVwX2Jsb2NrX2ZpbGUoY29uc3QgY2hhciAqZmls ZW5hbWUsIHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2aWNlcykKewoJaW50IGZkOwoJc3RydWN0IGRl dmljZSAqZGV2OwoJb2ZmNjRfdCAqZGV2aWNlX2xlbjsKCXN0cnVjdCBsZ3Vlc3RfYmxvY2tfcGFn ZSAqcDsKCgkvKiBXZSBvcGVuIHdpdGggT19MQVJHRUZJTEUgYmVjYXVzZSBvdGhlcndpc2Ugd2Ug Z2V0IHN0dWNrIGF0IDJHLiAgV2UKCSAqIG9wZW4gd2l0aCBPX0RJUkVDVCBiZWNhdXNlIG90aGVy d2lzZSBvdXIgYmVuY2htYXJrcyBnbyBtdWNoIHRvbwoJICogZmFzdC4gKi8KCWZkID0gb3Blbl9v cl9kaWUoZmlsZW5hbWUsIE9fUkRXUnxPX0xBUkdFRklMRXxPX0RJUkVDVCk7CgoJLyogV2Ugd2Fu dCBvbmUgcGFnZSwgYW5kIGhhdmUgbm8gaW5wdXQgaGFuZGxlciAodGhlIGJsb2NrIGZpbGUgbmV2 ZXIKCSAqIGhhcyBhbnl0aGluZyBpbnRlcmVzdGluZyB0byBzYXkgdG8gdXMpLiAgT3VyIHRpbWlu ZyB3aWxsIGJlIHF1aXRlCgkgKiByYW5kb20sIHNvIGl0IHNob3VsZCBiZSBhIHJlYXNvbmFibGUg cmFuZG9tbmVzcyBzb3VyY2UuICovCglkZXYgPSBuZXdfZGV2aWNlKGRldmljZXMsIExHVUVTVF9E RVZJQ0VfVF9CTE9DSywgMSwKCQkJIExHVUVTVF9ERVZJQ0VfRl9SQU5ET01ORVNTLAoJCQkgZmQs IE5VTEwsIDAsIGhhbmRsZV9ibG9ja19vdXRwdXQpOwoKCS8qIFdlIHN0b3JlIHRoZSBkZXZpY2Ug c2l6ZSBpbiB0aGUgcHJpdmF0ZSBhcmVhICovCglkZXZpY2VfbGVuID0gZGV2LT5wcml2ID0gbWFs bG9jKHNpemVvZigqZGV2aWNlX2xlbikpOwoJLyogVGhpcyBpcyB0aGUgc2FmZSB3YXkgb2YgZXN0 YWJsaXNoaW5nIHRoZSBzaXplIG9mIG91ciBkZXZpY2U6IGl0CgkgKiBtaWdodCBiZSBhIG5vcm1h bCBmaWxlIG9yIGFuIGFjdHVhbCBibG9jayBkZXZpY2UgbGlrZSAvZGV2L2hkYi4gKi8KCSpkZXZp Y2VfbGVuID0gbHNlZWs2NChmZCwgMCwgU0VFS19FTkQpOwoKCS8qIFRoZSBkZXZpY2UgbWVtb3J5 IGlzIGEgInN0cnVjdCBsZ3Vlc3RfYmxvY2tfcGFnZSIuICBJdCdzIHplcm9lZAoJICogYWxyZWFk eSwgd2UganVzdCBuZWVkIHRvIHB1dCBpbiB0aGUgZGV2aWNlIHNpemUuICBCbG9jayBkZXZpY2Vz CgkgKiB0aGluayBpbiBzZWN0b3JzIChpZS4gNTEyIGJ5dGUgY2h1bmtzKSwgc28gd2UgdHJhbnNs YXRlIGhlcmUuICovCglwID0gZGV2LT5tZW07CglwLT5udW1fc2VjdG9ycyA9ICpkZXZpY2VfbGVu LzUxMjsKCXZlcmJvc2UoImRldmljZSAlcDogYmxvY2sgJWkgc2VjdG9yc1xuIiwKCQkodm9pZCAq KShkZXYtPmRlc2MtPnBmbiAqIGdldHBhZ2VzaXplKCkpLCBwLT5udW1fc2VjdG9ycyk7Cn0KCi8q CiAqIE5ldHdvcmsgRGV2aWNlcy4KICoKICogU2V0dGluZyB1cCBuZXR3b3JrIGRldmljZXMgaXMg cXVpdGUgYSBwYWluLCBiZWNhdXNlIHdlIGhhdmUgdGhyZWUgdHlwZXMuCiAqIEZpcnN0LCB3ZSBo YXZlIHRoZSBpbnRlci1HdWVzdCBuZXR3b3JrLiAgVGhpcyBpcyBhIGZpbGUgd2hpY2ggaXMgbWFw cGVkIGludG8KICogdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEd1ZXN0cyB3aG8gYXJlIG9uIHRo ZSBuZXR3b3JrLiAgQmVjYXVzZSBpdCBpcyBhCiAqIHNoYXJlZCBtYXBwaW5nLCB0aGUgc2FtZSBw YWdlIHVuZGVybGllcyBhbGwgdGhlIGRldmljZXMsIGFuZCB0aGV5IGNhbiBzZW5kCiAqIERNQSB0 byBlYWNoIG90aGVyLgogKgogKiBSZW1lbWJlciBmcm9tIG91ciBuZXR3b3JrIGRyaXZlciwgdGhl IEd1ZXN0IGlzIHRvbGQgd2hhdCBzbG90IGluIHRoZSBwYWdlIGl0CiAqIGlzIHRvIHVzZS4gIFdl IHVzZSBleGNsdXNpdmUgZm5jdGwgbG9ja3MgdG8gcmVzZXJ2ZSBhIHNsb3QuICBJZiBhbm90aGVy CiAqIEd1ZXN0IGlzIHVzaW5nIGEgc2xvdCwgdGhlIGxvY2sgd2lsbCBmYWlsIGFuZCB3ZSB0cnkg YW5vdGhlci4gIEJlY2F1c2UgZm5jdGwKICogbG9ja3MgYXJlIGNsZWFuZWQgdXAgYXV0b21hdGlj YWxseSB3aGVuIHdlIGRpZSwgdGhpcyBjbGV2ZXJseSBtZWFucyB0aGF0IG91cgogKiByZXNlcnZh dGlvbiBvbiB0aGUgc2xvdCB3aWxsIHZhbmlzaCBpZiB3ZSBjcmFzaC4gKi8Kc3RhdGljIHVuc2ln bmVkIGludCBmaW5kX3Nsb3QoaW50IG5ldGZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKewoJc3Ry dWN0IGZsb2NrIGZsOwoKCWZsLmxfdHlwZSA9IEZfV1JMQ0s7CglmbC5sX3doZW5jZSA9IFNFRUtf U0VUOwoJZmwubF9sZW4gPSAxOwoJLyogVHJ5IGEgMSBieXRlIGxvY2sgaW4gZWFjaCBwb3NzaWJs ZSBwb3NpdGlvbiBudW1iZXIgKi8KCWZvciAoZmwubF9zdGFydCA9IDA7CgkgICAgIGZsLmxfc3Rh cnQgPCBnZXRwYWdlc2l6ZSgpL3NpemVvZihzdHJ1Y3QgbGd1ZXN0X25ldCk7CgkgICAgIGZsLmxf c3RhcnQrKykgewoJCS8qIElmIHdlIHN1Y2NlZWQsIHJldHVybiB0aGUgc2xvdCBudW1iZXIuICov CgkJaWYgKGZjbnRsKG5ldGZkLCBGX1NFVExLLCAmZmwpID09IDApCgkJCXJldHVybiBmbC5sX3N0 YXJ0OwoJfQoJZXJyeCgxLCAiTm8gZnJlZSBzbG90cyBpbiBuZXR3b3JrIGZpbGUgJXMiLCBmaWxl bmFtZSk7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbmV0d29yayBmaWxlICovCnN0 YXRpYyB2b2lkIHNldHVwX25ldF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAoJCQkgICBzdHJ1 Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCnsKCWludCBuZXRmZDsKCXN0cnVjdCBkZXZpY2UgKmRl djsKCgkvKiBXZSBkb24ndCB1c2Ugb3Blbl9vcl9kaWUoKSBoZXJlOiBmb3IgZnJpZW5kbGluZXNz IHdlIGNyZWF0ZSB0aGUgZmlsZQoJICogaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAqLwoJ bmV0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1IsIDApOwoJaWYgKG5ldGZkIDwgMCkgewoJCWlm IChlcnJubyA9PSBFTk9FTlQpIHsKCQkJbmV0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1J8T19D UkVBVCwgMDYwMCk7CgkJCWlmIChuZXRmZCA+PSAwKSB7CgkJCQkvKiBJZiB3ZSBzdWNjZWVkZWQs IGluaXRpYWxpemUgdGhlIGZpbGUgd2l0aCBhCgkJCQkgKiBibGFuayBwYWdlLiAqLwoJCQkJY2hh ciBwYWdlW2dldHBhZ2VzaXplKCldOwoJCQkJbWVtc2V0KHBhZ2UsIDAsIHNpemVvZihwYWdlKSk7 CgkJCQl3cml0ZShuZXRmZCwgcGFnZSwgc2l6ZW9mKHBhZ2UpKTsKCQkJfQoJCX0KCQlpZiAobmV0 ZmQgPCAwKQoJCQllcnIoMSwgImNhbm5vdCBvcGVuIG5ldCBmaWxlICclcyciLCBmaWxlbmFtZSk7 Cgl9CgoJLyogV2UgbmVlZCAxIHBhZ2UsIGFuZCB0aGUgZmVhdHVyZXMgaW5kaWNhdGUgdGhlIHNs b3QgdG8gdXNlIGFuZCB0aGF0CgkgKiBubyBjaGVja3N1bSBpcyBuZWVkZWQuICBXZSBuZXZlciB0 b3VjaCB0aGlzIGRldmljZSBhZ2FpbjsgaXQncwoJICogYmV0d2VlbiB0aGUgR3Vlc3RzIG9uIHRo ZSBuZXR3b3JrLCBzbyB3ZSBkb24ndCByZWdpc3RlciBpbnB1dCBvcgoJICogb3V0cHV0IGhhbmRs ZXJzLiAqLwoJZGV2ID0gbmV3X2RldmljZShkZXZpY2VzLCBMR1VFU1RfREVWSUNFX1RfTkVULCAx LAoJCQkgZmluZF9zbG90KG5ldGZkLCBmaWxlbmFtZSl8TEdVRVNUX05FVF9GX05PQ1NVTSwKCQkJ IC0xLCBOVUxMLCAwLCBOVUxMKTsKCgkvKiBNYXAgdGhlIHNoYXJlZCBmaWxlLiAqLwoJaWYgKG1t YXAoZGV2LT5tZW0sIGdldHBhZ2VzaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLAoJCQkgTUFQ X0ZJWEVEfE1BUF9TSEFSRUQsIG5ldGZkLCAwKSAhPSBkZXYtPm1lbSkKCQkJZXJyKDEsICJjb3Vs ZCBub3QgbW1hcCAnJXMnIiwgZmlsZW5hbWUpOwoJdmVyYm9zZSgiZGV2aWNlICVwOiBzaGFyZWQg bmV0ICVzLCBwZWVyICVpXG4iLAoJCSh2b2lkICopKGRldi0+ZGVzYy0+cGZuICogZ2V0cGFnZXNp emUoKSksIGZpbGVuYW1lLAoJCWRldi0+ZGVzYy0+ZmVhdHVyZXMgJiB+TEdVRVNUX05FVF9GX05P Q1NVTSk7Cn0KLyo6Ki8KCnN0YXRpYyB1MzIgc3RyMmlwKGNvbnN0IGNoYXIgKmlwYWRkcikKewoJ dW5zaWduZWQgaW50IGJ5dGVbNF07CgoJc3NjYW5mKGlwYWRkciwgIiV1LiV1LiV1LiV1IiwgJmJ5 dGVbMF0sICZieXRlWzFdLCAmYnl0ZVsyXSwgJmJ5dGVbM10pOwoJcmV0dXJuIChieXRlWzBdIDw8 IDI0KSB8IChieXRlWzFdIDw8IDE2KSB8IChieXRlWzJdIDw8IDgpIHwgYnl0ZVszXTsKfQoKLyog VGhpcyBjb2RlIGlzICJhZGFwdGVkIiBmcm9tIGxpYmJyaWRnZTogaXQgYXR0YWNoZXMgdGhlIEhv c3QgZW5kIG9mIHRoZQogKiBuZXR3b3JrIGRldmljZSB0byB0aGUgYnJpZGdlIGRldmljZSBzcGVj aWZpZWQgYnkgdGhlIGNvbW1hbmQgbGluZS4KICoKICogVGhpcyBpcyB5ZXQgYW5vdGhlciBKYW1l cyBNb3JyaXMgY29udHJpYnV0aW9uIChJJ20gYW4gSVAtbGV2ZWwgZ3V5LCBzbyBJCiAqIGRpc2xp a2UgYnJpZGdpbmcpLCBhbmQgSSBqdXN0IHRyeSBub3QgdG8gYnJlYWsgaXQuICovCnN0YXRpYyB2 b2lkIGFkZF90b19icmlkZ2UoaW50IGZkLCBjb25zdCBjaGFyICppZl9uYW1lLCBjb25zdCBjaGFy ICpicl9uYW1lKQp7CglpbnQgaWZpZHg7CglzdHJ1Y3QgaWZyZXEgaWZyOwoKCWlmICghKmJyX25h bWUpCgkJZXJyeCgxLCAibXVzdCBzcGVjaWZ5IGJyaWRnZSBuYW1lIik7CgoJaWZpZHggPSBpZl9u YW1ldG9pbmRleChpZl9uYW1lKTsKCWlmICghaWZpZHgpCgkJZXJyeCgxLCAiaW50ZXJmYWNlICVz IGRvZXMgbm90IGV4aXN0ISIsIGlmX25hbWUpOwoKCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBicl9u YW1lLCBJRk5BTVNJWik7CglpZnIuaWZyX2lmaW5kZXggPSBpZmlkeDsKCWlmIChpb2N0bChmZCwg U0lPQ0JSQURESUYsICZpZnIpIDwgMCkKCQllcnIoMSwgImNhbid0IGFkZCAlcyB0byBicmlkZ2Ug JXMiLCBpZl9uYW1lLCBicl9uYW1lKTsKfQoKLyogVGhpcyBzZXRzIHVwIHRoZSBIb3N0IGVuZCBv ZiB0aGUgbmV0d29yayBkZXZpY2Ugd2l0aCBhbiBJUCBhZGRyZXNzLCBicmluZ3MKICogaXQgdXAg c28gcGFja2V0cyB3aWxsIGZsb3csIHRoZSBjb3BpZXMgdGhlIE1BQyBhZGRyZXNzIGludG8gdGhl IGh3YWRkcgogKiBwb2ludGVyIChpbiBwcmFjdGljZSwgdGhlIEhvc3QncyBzbG90IGluIHRoZSBu ZXR3b3JrIGRldmljZSdzIG1lbW9yeSkuICovCnN0YXRpYyB2b2lkIGNvbmZpZ3VyZV9kZXZpY2Uo aW50IGZkLCBjb25zdCBjaGFyICpkZXZuYW1lLCB1MzIgaXBhZGRyLAoJCQkgICAgIHVuc2lnbmVk IGNoYXIgaHdhZGRyWzZdKQp7CglzdHJ1Y3QgaWZyZXEgaWZyOwoJc3RydWN0IHNvY2thZGRyX2lu ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmci5pZnJfYWRkcjsKCgkvKiBEb24ndCBy ZWFkIHRoZXNlIGluY2FudGF0aW9ucy4gIEp1c3QgY3V0ICYgcGFzdGUgdGhlbSBsaWtlIEkgZGlk ISAqLwoJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKCXN0cmNweShpZnIuaWZyX25hbWUs IGRldm5hbWUpOwoJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCXNpbi0+c2luX2FkZHIuc19h ZGRyID0gaHRvbmwoaXBhZGRyKTsKCWlmIChpb2N0bChmZCwgU0lPQ1NJRkFERFIsICZpZnIpICE9 IDApCgkJZXJyKDEsICJTZXR0aW5nICVzIGludGVyZmFjZSBhZGRyZXNzIiwgZGV2bmFtZSk7Cglp ZnIuaWZyX2ZsYWdzID0gSUZGX1VQOwoJaWYgKGlvY3RsKGZkLCBTSU9DU0lGRkxBR1MsICZpZnIp ICE9IDApCgkJZXJyKDEsICJCcmluZ2luZyBpbnRlcmZhY2UgJXMgdXAiLCBkZXZuYW1lKTsKCgkv KiBTSU9DIHN0YW5kcyBmb3IgU29ja2V0IEkvTyBDb250cm9sLiAgRyBtZWFucyBHZXQgKHZzIFMg Zm9yIFNldAoJICogYWJvdmUpLiAgSUYgbWVhbnMgSW50ZXJmYWNlLCBhbmQgSFdBRERSIGlzIGhh cmR3YXJlIGFkZHJlc3MuCgkgKiBTaW1wbGUhICovCglpZiAoaW9jdGwoZmQsIFNJT0NHSUZIV0FE RFIsICZpZnIpICE9IDApCgkJZXJyKDEsICJnZXR0aW5nIGh3IGFkZHJlc3MgZm9yICVzIiwgZGV2 bmFtZSk7CgltZW1jcHkoaHdhZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKfQoKLypM OjE5NSBUaGUgb3RoZXIga2luZCBvZiBuZXR3b3JrIGlzIGEgSG9zdDwtPkd1ZXN0IG5ldHdvcmsu ICBUaGlzIGNhbiBlaXRoZXIKICogdXNlIGJyaWRpbmcgb3Igcm91dGluZywgYnV0IHRoZSBwcmlu Y2lwbGUgaXMgdGhlIHNhbWU6IGl0IHVzZXMgdGhlICJ0dW4iCiAqIGRldmljZSB0byBpbmplY3Qg cGFja2V0cyBpbnRvIHRoZSBIb3N0IGFzIGlmIHRoZXkgY2FtZSBpbiBmcm9tIGEgbm9ybWFsCiAq IG5ldHdvcmsgY2FyZC4gIFdlIGp1c3Qgc2h1bnQgcGFja2V0cyBiZXR3ZWVuIHRoZSBHdWVzdCBh bmQgdGhlIHR1bgogKiBkZXZpY2UuICovCnN0YXRpYyB2b2lkIHNldHVwX3R1bl9uZXQoY29uc3Qg Y2hhciAqYXJnLCBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCnsKCXN0cnVjdCBkZXZpY2Ug KmRldjsKCXN0cnVjdCBpZnJlcSBpZnI7CglpbnQgbmV0ZmQsIGlwZmQ7Cgl1MzIgaXA7Cgljb25z dCBjaGFyICpicl9uYW1lID0gTlVMTDsKCgkvKiBXZSBvcGVuIHRoZSAvZGV2L25ldC90dW4gZGV2 aWNlIGFuZCB0ZWxsIGl0IHdlIHdhbnQgYSB0YXAgZGV2aWNlLiAgQQoJICogdGFwIGRldmljZSBp cyBsaWtlIGEgdHVuIGRldmljZSwgb25seSBzb21laG93IGRpZmZlcmVudC4gIFRvIHRlbGwKCSAq IHRoZSB0cnV0aCwgSSBjb21wbGV0ZWx5IGJsdW5kZXJlZCBteSB3YXkgdGhyb3VnaCB0aGlzIGNv ZGUsIGJ1dCBpdAoJICogd29ya3Mgbm93ISAqLwoJbmV0ZmQgPSBvcGVuX29yX2RpZSgiL2Rldi9u ZXQvdHVuIiwgT19SRFdSKTsKCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CglpZnIuaWZy X2ZsYWdzID0gSUZGX1RBUCB8IElGRl9OT19QSTsKCXN0cmNweShpZnIuaWZyX25hbWUsICJ0YXAl ZCIpOwoJaWYgKGlvY3RsKG5ldGZkLCBUVU5TRVRJRkYsICZpZnIpICE9IDApCgkJZXJyKDEsICJj b25maWd1cmluZyAvZGV2L25ldC90dW4iKTsKCS8qIFdlIGRvbid0IG5lZWQgY2hlY2tzdW1zIGNh bGN1bGF0ZWQgZm9yIHBhY2tldHMgY29taW5nIGluIHRoaXMKCSAqIGRldmljZTogdHJ1c3QgdXMh ICovCglpb2N0bChuZXRmZCwgVFVOU0VUTk9DU1VNLCAxKTsKCgkvKiBXZSBjcmVhdGUgdGhlIG5l dCBkZXZpY2Ugd2l0aCAxIHBhZ2UsIHVzaW5nIHRoZSBmZWF0dXJlcyBmaWVsZCBvZgoJICogdGhl IGRlc2NyaXB0b3IgdG8gdGVsbCB0aGUgR3Vlc3QgaXQgaXMgaW4gc2xvdCAxIChORVRfUEVFUk5V TSksIGFuZAoJICogdGhhdCB0aGUgZGV2aWNlIGhhcyBmYWlybHkgcmFuZG9tIHRpbWluZy4gIFdl IGRvICpub3QqIHNwZWNpZnkKCSAqIExHVUVTVF9ORVRfRl9OT0NTVU06IHRoZXNlIHBhY2tldHMg Y2FuIHJlYWNoIHRoZSByZWFsIHdvcmxkLgoJICoKCSAqIFdlIHdpbGwgcHV0IG91ciBNQUMgYWRk cmVzcyBpcyBzbG90IDAgZm9yIHRoZSBHdWVzdCB0byBzZWUsIHNvCgkgKiBpdCB3aWxsIHNlbmQg cGFja2V0cyB0byB1cyB1c2luZyB0aGUga2V5ICJwZWVyX29mZnNldCgwKSI6ICovCglkZXYgPSBu ZXdfZGV2aWNlKGRldmljZXMsIExHVUVTVF9ERVZJQ0VfVF9ORVQsIDEsCgkJCSBORVRfUEVFUk5V TXxMR1VFU1RfREVWSUNFX0ZfUkFORE9NTkVTUywgbmV0ZmQsCgkJCSBoYW5kbGVfdHVuX2lucHV0 LCBwZWVyX29mZnNldCgwKSwgaGFuZGxlX3R1bl9vdXRwdXQpOwoKCS8qIFdlIGtlZXAgYSBmbGFn IHdoaWNoIHNheXMgd2hldGhlciB3ZSd2ZSBzZWVuIHBhY2tldHMgY29tZSBvdXQgZnJvbQoJICog dGhpcyBuZXR3b3JrIGRldmljZS4gKi8KCWRldi0+cHJpdiA9IG1hbGxvYyhzaXplb2YoYm9vbCkp OwoJKihib29sICopZGV2LT5wcml2ID0gZmFsc2U7CgoJLyogV2UgbmVlZCBhIHNvY2tldCB0byBw ZXJmb3JtIHRoZSBtYWdpYyBuZXR3b3JrIGlvY3RscyB0byBicmluZyB1cCB0aGUKCSAqIHRhcCBp bnRlcmZhY2UsIGNvbm5lY3QgdG8gdGhlIGJyaWRnZSBldGMuICBBbnkgc29ja2V0IHdpbGwgZG8h ICovCglpcGZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fSVApOwoJaWYg KGlwZmQgPCAwKQoJCWVycigxLCAib3BlbmluZyBJUCBzb2NrZXQiKTsKCgkvKiBJZiB0aGUgY29t bWFuZCBsaW5lIHdhcyAtLXR1bm5ldD1icmlkZ2U6PG5hbWU+IGRvIGJyaWRnaW5nLiAqLwoJaWYg KCFzdHJuY21wKEJSSURHRV9QRlgsIGFyZywgc3RybGVuKEJSSURHRV9QRlgpKSkgewoJCWlwID0g SU5BRERSX0FOWTsKCQlicl9uYW1lID0gYXJnICsgc3RybGVuKEJSSURHRV9QRlgpOwoJCWFkZF90 b19icmlkZ2UoaXBmZCwgaWZyLmlmcl9uYW1lLCBicl9uYW1lKTsKCX0gZWxzZSAvKiBJdCBpcyBh biBJUCBhZGRyZXNzIHRvIHNldCB1cCB0aGUgZGV2aWNlIHdpdGggKi8KCQlpcCA9IHN0cjJpcChh cmcpOwoKCS8qIFdlIGFyZSBwZWVyIDAsIGllLiBmaXJzdCBzbG90LCBzbyB3ZSBoYW5kIGRldi0+ bWVtIHRvIHRoaXMgcm91dGluZQoJICogdG8gd3JpdGUgdGhlIE1BQyBhZGRyZXNzIGF0IHRoZSBz dGFydCBvZiB0aGUgZGV2aWNlIG1lbW9yeS4gICovCgljb25maWd1cmVfZGV2aWNlKGlwZmQsIGlm ci5pZnJfbmFtZSwgaXAsIGRldi0+bWVtKTsKCgkvKiBTZXQgInByb21pc2MiIGJpdDogd2Ugd2Fu dCBldmVyeSBzaW5nbGUgcGFja2V0IGlmIHdlJ3JlIGdvaW5nIHRvCgkgKiBicmlkZ2UgdG8gb3Ro ZXIgbWFjaGluZXMgKGFuZCBvdGhlcndpc2UgaXQgZG9lc24ndCBtYXR0ZXIpLiAqLwoJKigodTgg KilkZXYtPm1lbSkgfD0gMHgxOwoKCWNsb3NlKGlwZmQpOwoKCXZlcmJvc2UoImRldmljZSAlcDog dHVuIG5ldCAldS4ldS4ldS4ldVxuIiwKCQkodm9pZCAqKShkZXYtPmRlc2MtPnBmbiAqIGdldHBh Z2VzaXplKCkpLAoJCSh1OCkoaXA+PjI0KSwgKHU4KShpcD4+MTYpLCAodTgpKGlwPj44KSwgKHU4 KWlwKTsKCWlmIChicl9uYW1lKQoJCXZlcmJvc2UoImF0dGFjaGVkIHRvIGJyaWRnZTogJXNcbiIs IGJyX25hbWUpOwp9Ci8qIFRoYXQncyB0aGUgZW5kIG9mIGRldmljZSBzZXR1cC4gKi8KCi8qTDoy MjAgRmluYWxseSB3ZSByZWFjaCB0aGUgY29yZSBvZiB0aGUgTGF1bmNoZXIsIHdoaWNoIHJ1bnMg dGhlIEd1ZXN0LCBzZXJ2ZXMKICogaXRzIGlucHV0IGFuZCBvdXRwdXQsIGFuZCBmaW5hbGx5LCBs YXlzIGl0IHRvIHJlc3QuICovCnN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkK cnVuX2d1ZXN0KGludCBsZ3Vlc3RfZmQsIHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2aWNlX2xpc3Qp CnsKCWZvciAoOzspIHsKCQl1MzIgYXJnc1tdID0geyBMSFJFUV9CUkVBSywgMCB9OwoJCXVuc2ln bmVkIGxvbmcgYXJyWzJdOwoJCWludCByZWFkdmFsOwoKCQkvKiBXZSByZWFkIGZyb20gdGhlIC9k ZXYvbGd1ZXN0IGRldmljZSB0byBydW4gdGhlIEd1ZXN0LiAqLwoJCXJlYWR2YWwgPSByZWFkKGxn dWVzdF9mZCwgYXJyLCBzaXplb2YoYXJyKSk7CgoJCS8qIFRoZSByZWFkIGNhbiBvbmx5IHJlYWxs eSByZXR1cm4gc2l6ZW9mKGFycikgKHRoZSBHdWVzdCBkaWQgYQoJCSAqIFNFTkRfRE1BIHRvIHVz KSwgb3IgYW4gZXJyb3IuICovCgoJCS8qIEZvciBhIHN1Y2Nlc3NmdWwgcmVhZCwgYXJyWzBdIGlz IHRoZSBhZGRyZXNzIG9mIHRoZSAic3RydWN0CgkJICogbGd1ZXN0X2RtYSIsIGFuZCBhcnJbMV0g aXMgdGhlIGtleSB0aGUgR3Vlc3Qgc2VudCB0by4gKi8KCQlpZiAocmVhZHZhbCA9PSBzaXplb2Yo YXJyKSkgewoJCQloYW5kbGVfb3V0cHV0KGxndWVzdF9mZCwgYXJyWzBdLCBhcnJbMV0sIGRldmlj ZV9saXN0KTsKCQkJY29udGludWU7CgkJLyogRU5PRU5UIG1lYW5zIHRoZSBHdWVzdCBkaWVkLiAg UmVhZGluZyB0ZWxscyB1cyB3aHkuICovCgkJfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpIHsK CQkJY2hhciByZWFzb25bMTAyNF0gPSB7IDAgfTsKCQkJcmVhZChsZ3Vlc3RfZmQsIHJlYXNvbiwg c2l6ZW9mKHJlYXNvbiktMSk7CgkJCWVycngoMSwgIiVzIiwgcmVhc29uKTsKCQkvKiBFQUdBSU4g bWVhbnMgdGhlIHdha2VyIHdhbnRlZCB1cyB0byBsb29rIGF0IHNvbWUgaW5wdXQuCgkJICogQW55 dGhpbmcgZWxzZSBtZWFucyBhIGJ1ZyBvciBpbmNvbXBhdGlibGUgY2hhbmdlLiAqLwoJCX0gZWxz ZSBpZiAoZXJybm8gIT0gRUFHQUlOKQoJCQllcnIoMSwgIlJ1bm5pbmcgZ3Vlc3QgZmFpbGVkIik7 CgoJCS8qIFNlcnZpY2UgaW5wdXQsIHRoZW4gdW5zZXQgdGhlIEJSRUFLIHdoaWNoIHJlbGVhc2Vz CgkJICogdGhlIFdha2VyLiAqLwoJCWhhbmRsZV9pbnB1dChsZ3Vlc3RfZmQsIGRldmljZV9saXN0 KTsKCQlpZiAod3JpdGUobGd1ZXN0X2ZkLCBhcmdzLCBzaXplb2YoYXJncykpIDwgMCkKCQkJZXJy KDEsICJSZXNldHRpbmcgYnJlYWsiKTsKCX0KfQovKgogKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhl IExhdW5jaGVyLgogKgogKiBCdXQgd2FpdCEgIFdlJ3ZlIHNlZW4gSS9PIGZyb20gdGhlIExhdW5j aGVyLCBhbmQgd2UndmUgc2VlbiBJL08gZnJvbSB0aGUKICogRHJpdmVycy4gIElmIHdlIHdlcmUg dG8gc2VlIHRoZSBIb3N0IGtlcm5lbCBJL08gY29kZSwgb3VyIHVuZGVyc3RhbmRpbmcKICogd291 bGQgYmUgY29tcGxldGUuLi4gOiovCgpzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7Cgl7 ICJ2ZXJib3NlIiwgMCwgTlVMTCwgJ3YnIH0sCgl7ICJzaGFyZW5ldCIsIDEsIE5VTEwsICdzJyB9 LAoJeyAidHVubmV0IiwgMSwgTlVMTCwgJ3QnIH0sCgl7ICJibG9jayIsIDEsIE5VTEwsICdiJyB9 LAoJeyAiaW5pdHJkIiwgMSwgTlVMTCwgJ2knIH0sCgl7IE5VTEwgfSwKfTsKc3RhdGljIHZvaWQg dXNhZ2Uodm9pZCkKewoJZXJyeCgxLCAiVXNhZ2U6IGxndWVzdCBbLS12ZXJib3NlXSAiCgkgICAg ICJbLS1zaGFyZW5ldD08ZmlsZW5hbWU+fC0tdHVubmV0PSg8aXBhZGRyPnxicmlkZ2U6PGJyaWRn ZW5hbWU+KVxuIgoJICAgICAifC0tYmxvY2s9PGZpbGVuYW1lPnwtLWluaXRyZD08ZmlsZW5hbWU+ XS4uLlxuIgoJICAgICAiPG1lbS1pbi1tYj4gdm1saW51eCBbYXJncy4uLl0iKTsKfQoKLypMOjEw MCBUaGUgTGF1bmNoZXIgY29kZSBpdHNlbGYgdGFrZXMgdXMgb3V0IGludG8gdXNlcnNwYWNlLCB0 aGF0IHNjYXJ5IHBsYWNlCiAqIHdoZXJlIHBvaW50ZXJzIHJ1biB3aWxkIGFuZCBmcmVlISAgVW5m b3J0dW5hdGVseSwgbGlrZSBtb3N0IHVzZXJzcGFjZQogKiBwcm9ncmFtcywgaXQncyBxdWl0ZSBi b3JpbmcgKHdoaWNoIGlzIHdoeSBldmVyeW9uZSBsaWtlIHRvIGhhY2sgb24gdGhlCiAqIGtlcm5l bCEpLiAgUGVyaGFwcyBpZiB5b3UgbWFrZSB1cCBhbiBMZ3Vlc3QgRHJpbmtpbmcgR2FtZSBhdCB0 aGlzIHBvaW50LCBpdAogKiB3aWxsIGdldCB5b3UgdGhyb3VnaCB0aGlzIHNlY3Rpb24uICBPciwg bWF5YmUgbm90LgogKgogKiBUaGUgTGF1bmNoZXIgYmluYXJ5IHNpdHMgdXAgaGlnaCwgdXN1YWxs eSBzdGFydGluZyBhdCBhZGRyZXNzIDB4QjgwMDAwMDAuCiAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhp cyBpcyB0aGUgInBoeXNpY2FsIiBtZW1vcnkgZm9yIHRoZSBHdWVzdC4gIEZvciBleGFtcGxlLAog KiBpZiB0aGUgR3Vlc3Qgd2VyZSB0byB3cml0ZSBhICIxIiBhdCBwaHlzaWNhbCBhZGRyZXNzIDAs IHdlIHdvdWxkIHNlZSBhICIxIgogKiBpbiB0aGUgTGF1bmNoZXIgYXQgIihpbnQgKikwIi4gIEd1 ZXN0IHBoeXNpY2FsID09IExhdW5jaGVyIHZpcnR1YWwuCiAqCiAqIFRoaXMgY2FuIGJlIHRvdWdo IHRvIGdldCB5b3VyIGhlYWQgYXJvdW5kLCBidXQgdXN1YWxseSBpdCBqdXN0IG1lYW5zIHRoYXQg d2UKICogZG9uJ3QgbmVlZCB0byBkbyBhbnkgY29udmVyc2lvbiB3aGVuIHRoZSBHdWVzdCBnaXZl cyB1cyBpdCdzICJwaHlzaWNhbCIKICogYWRkcmVzc2VzLgogKi8KaW50IG1haW4oaW50IGFyZ2Ms IGNoYXIgKmFyZ3ZbXSkKewoJLyogTWVtb3J5LCB0b3AtbGV2ZWwgcGFnZXRhYmxlLCBjb2RlIHN0 YXJ0cG9pbnQsIFBBR0VfT0ZGU0VUIGFuZCBzaXplCgkgKiBvZiB0aGUgKG9wdGlvbmFsKSBpbml0 cmQuICovCgl1bnNpZ25lZCBsb25nIG1lbSA9IDAsIHBnZGlyLCBzdGFydCwgcGFnZV9vZmZzZXQs IGluaXRyZF9zaXplID0gMDsKCS8qIEEgdGVtcG9yYXJ5IGFuZCB0aGUgL2Rldi9sZ3Vlc3QgZmls ZSBkZXNjcmlwdG9yLiAqLwoJaW50IGksIGMsIGxndWVzdF9mZDsKCS8qIFRoZSBsaXN0IG9mIEd1 ZXN0IGRldmljZXMsIGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICovCglzdHJ1Y3Qg ZGV2aWNlX2xpc3QgZGV2aWNlX2xpc3Q7CgkvKiBUaGUgYm9vdCBpbmZvcm1hdGlvbiBmb3IgdGhl IEd1ZXN0OiBhdCBndWVzdC1waHlzaWNhbCBhZGRyZXNzIDAuICovCgl2b2lkICpib290ID0gKHZv aWQgKikwOwoJLyogSWYgdGhleSBzcGVjaWZ5IGFuIGluaXRyZCBmaWxlIHRvIGxvYWQuICovCglj b25zdCBjaGFyICppbml0cmRfbmFtZSA9IE5VTEw7CgoJLyogRmlyc3Qgd2UgaW5pdGlhbGl6ZSB0 aGUgZGV2aWNlIGxpc3QuICBTaW5jZSBjb25zb2xlIGFuZCBuZXR3b3JrCgkgKiBkZXZpY2UgcmVj ZWl2ZSBpbnB1dCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLCB3ZSBrZWVwIGFuIGZkc2V0CgkgKiAo aW5mZHMpIGFuZCB0aGUgbWF4aW11bSBmZCBudW1iZXIgKG1heF9pbmZkKSB3aXRoIHRoZSBoZWFk IG9mIHRoZQoJICogbGlzdC4gIFdlIGFsc28ga2VlcCBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgZGV2 aWNlLCBmb3IgZWFzeSBhcHBlbmRpbmcKCSAqIHRvIHRoZSBsaXN0LiAqLwoJZGV2aWNlX2xpc3Qu bWF4X2luZmQgPSAtMTsKCWRldmljZV9saXN0LmRldiA9IE5VTEw7CglkZXZpY2VfbGlzdC5sYXN0 ZGV2ID0gJmRldmljZV9saXN0LmRldjsKCUZEX1pFUk8oJmRldmljZV9saXN0LmluZmRzKTsKCgkv KiBXZSBuZWVkIHRvIGtub3cgaG93IG11Y2ggbWVtb3J5IHNvIHdlIGNhbiBzZXQgdXAgdGhlIGRl dmljZQoJICogZGVzY3JpcHRvciBhbmQgbWVtb3J5IHBhZ2VzIGZvciB0aGUgZGV2aWNlcyBhcyB3 ZSBwYXJzZSB0aGUgY29tbWFuZAoJICogbGluZS4gIFNvIHdlIHF1aWNrbHkgbG9vayB0aHJvdWdo IHRoZSBhcmd1bWVudHMgdG8gZmluZCB0aGUgYW1vdW50CgkgKiBvZiBtZW1vcnkgbm93LiAqLwoJ Zm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewoJCWlmIChhcmd2W2ldWzBdICE9ICctJykgewoJ CQltZW0gPSB0b3AgPSBhdG9pKGFyZ3ZbaV0pICogMTAyNCAqIDEwMjQ7CgkJCWRldmljZV9saXN0 LmRlc2NzID0gbWFwX3plcm9lZF9wYWdlcyh0b3AsIDEpOwoJCQl0b3AgKz0gZ2V0cGFnZXNpemUo KTsKCQkJYnJlYWs7CgkJfQoJfQoKCS8qIFRoZSBvcHRpb25zIGFyZSBmYWlybHkgc3RyYWlnaHQt Zm9yd2FyZCAqLwoJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgInYiLCBvcHRz LCBOVUxMKSkgIT0gRU9GKSB7CgkJc3dpdGNoIChjKSB7CgkJY2FzZSAndic6CgkJCXZlcmJvc2Ug PSB0cnVlOwoJCQlicmVhazsKCQljYXNlICdzJzoKCQkJc2V0dXBfbmV0X2ZpbGUob3B0YXJnLCAm ZGV2aWNlX2xpc3QpOwoJCQlicmVhazsKCQljYXNlICd0JzoKCQkJc2V0dXBfdHVuX25ldChvcHRh cmcsICZkZXZpY2VfbGlzdCk7CgkJCWJyZWFrOwoJCWNhc2UgJ2InOgoJCQlzZXR1cF9ibG9ja19m aWxlKG9wdGFyZywgJmRldmljZV9saXN0KTsKCQkJYnJlYWs7CgkJY2FzZSAnaSc6CgkJCWluaXRy ZF9uYW1lID0gb3B0YXJnOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl3YXJueCgiVW5rbm93biBh cmd1bWVudCAlcyIsIGFyZ3Zbb3B0aW5kXSk7CgkJCXVzYWdlKCk7CgkJfQoJfQoJLyogQWZ0ZXIg dGhlIG90aGVyIGFyZ3VtZW50cyB3ZSBleHBlY3QgbWVtb3J5IGFuZCBrZXJuZWwgaW1hZ2UgbmFt ZSwKCSAqIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBrZXJuZWwu ICovCglpZiAob3B0aW5kICsgMiA+IGFyZ2MpCgkJdXNhZ2UoKTsKCgkvKiBXZSBhbHdheXMgaGF2 ZSBhIGNvbnNvbGUgZGV2aWNlICovCglzZXR1cF9jb25zb2xlKCZkZXZpY2VfbGlzdCk7CgoJLyog V2Ugc3RhcnQgYnkgbWFwcGluZyBhbm9ueW1vdXMgcGFnZXMgb3ZlciBhbGwgb2YgZ3Vlc3QtcGh5 c2ljYWwKCSAqIG1lbW9yeSByYW5nZS4gIFRoaXMgZmlsbHMgaXQgd2l0aCAwLCBhbmQgZW5zdXJl cyB0aGF0IHRoZSBHdWVzdAoJICogd29uJ3QgYmUga2lsbGVkIHdoZW4gaXQgdHJpZXMgdG8gYWNj ZXNzIGl0LiAqLwoJbWFwX3plcm9lZF9wYWdlcygwLCBtZW0gLyBnZXRwYWdlc2l6ZSgpKTsKCgkv KiBOb3cgd2UgbG9hZCB0aGUga2VybmVsICovCglzdGFydCA9IGxvYWRfa2VybmVsKG9wZW5fb3Jf ZGllKGFyZ3Zbb3B0aW5kKzFdLCBPX1JET05MWSksCgkJCSAgICAmcGFnZV9vZmZzZXQpOwoKCS8q IE1hcCB0aGUgaW5pdHJkIGltYWdlIGlmIHJlcXVlc3RlZCAoYXQgdG9wIG9mIHBoeXNpY2FsIG1l bW9yeSkgKi8KCWlmIChpbml0cmRfbmFtZSkgewoJCWluaXRyZF9zaXplID0gbG9hZF9pbml0cmQo aW5pdHJkX25hbWUsIG1lbSk7CgkJLyogVGhlc2UgYXJlIHRoZSBsb2NhdGlvbiBpbiB0aGUgTGlu dXggYm9vdCBoZWFkZXIgd2hlcmUgdGhlCgkJICogc3RhcnQgYW5kIHNpemUgb2YgdGhlIGluaXRy ZCBhcmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQuICovCgkJKih1bnNpZ25lZCBsb25nICopKGJvb3Qr MHgyMTgpID0gbWVtIC0gaW5pdHJkX3NpemU7CgkJKih1bnNpZ25lZCBsb25nICopKGJvb3QrMHgy MWMpID0gaW5pdHJkX3NpemU7CgkJLyogVGhlIGJvb3Rsb2FkZXIgdHlwZSAweEZGIG1lYW5zICJ1 bmtub3duIjsgdGhhdCdzIE9LLiAqLwoJCSoodW5zaWduZWQgY2hhciAqKShib290KzB4MjEwKSA9 IDB4RkY7Cgl9CgoJLyogU2V0IHVwIHRoZSBpbml0aWFsIGxpbmVhciBwYWdldGFibGVzLCBzdGFy dGluZyBiZWxvdyB0aGUgaW5pdHJkLiAqLwoJcGdkaXIgPSBzZXR1cF9wYWdldGFibGVzKG1lbSwg aW5pdHJkX3NpemUsIHBhZ2Vfb2Zmc2V0KTsKCgkvKiBUaGUgTGludXggYm9vdCBoZWFkZXIgY29u dGFpbnMgYW4gIkU4MjAiIG1lbW9yeSBtYXA6IG91cnMgaXMgYQoJICogc2ltcGxlLCBzaW5nbGUg cmVnaW9uLiAqLwoJKihjaGFyKikoYm9vdCtFODIwTlIpID0gMTsKCSooKHN0cnVjdCBlODIwZW50 cnkgKikoYm9vdCtFODIwTUFQKSkKCQk9ICgoc3RydWN0IGU4MjBlbnRyeSkgeyAwLCBtZW0sIEU4 MjBfUkFNIH0pOwoJLyogVGhlIGJvb3QgaGVhZGVyIGNvbnRhaW5zIGEgY29tbWFuZCBsaW5lIHBv aW50ZXI6IHdlIHB1dCB0aGUgY29tbWFuZAoJICogbGluZSBhZnRlciB0aGUgYm9vdCBoZWFkZXIg KGF0IGFkZHJlc3MgNDA5NikgKi8KCSoodm9pZCAqKikoYm9vdCArIDB4MjI4KSA9IGJvb3QgKyA0 MDk2OwoJY29uY2F0KGJvb3QgKyA0MDk2LCBhcmd2K29wdGluZCsyKTsKCgkvKiBUaGUgZ3Vlc3Qg dHlwZSB2YWx1ZSBvZiAiMSIgdGVsbHMgdGhlIEd1ZXN0IGl0J3MgdW5kZXIgbGd1ZXN0LiAqLwoJ KihpbnQgKikoYm9vdCArIDB4MjNjKSA9IDE7CgoJLyogV2UgdGVsbCB0aGUga2VybmVsIHRvIGlu aXRpYWxpemUgdGhlIEd1ZXN0OiB0aGlzIHJldHVybnMgdGhlIG9wZW4KCSAqIC9kZXYvbGd1ZXN0 IGZpbGUgZGVzY3JpcHRvci4gKi8KCWxndWVzdF9mZCA9IHRlbGxfa2VybmVsKHBnZGlyLCBzdGFy dCwgcGFnZV9vZmZzZXQpOwoKCS8qIFdlIGZvcmsgb2ZmIGEgY2hpbGQgcHJvY2Vzcywgd2hpY2gg d2FrZXMgdGhlIExhdW5jaGVyIHdoZW5ldmVyIG9uZQoJICogb2YgdGhlIGlucHV0IGZpbGUgZGVz Y3JpcHRvcnMgbmVlZHMgYXR0ZW50aW9uLiAgT3RoZXJ3aXNlIHdlIHdvdWxkCgkgKiBydW4gdGhl IEd1ZXN0IHVudGlsIGl0IHRyaWVzIHRvIG91dHB1dCBzb21ldGhpbmcuICovCgl3YWtlcl9mZCA9 IHNldHVwX3dha2VyKGxndWVzdF9mZCwgJmRldmljZV9saXN0KTsKCgkvKiBGaW5hbGx5LCBydW4g dGhlIEd1ZXN0LiAgVGhpcyBkb2Vzbid0IHJldHVybi4gKi8KCXJ1bl9ndWVzdChsZ3Vlc3RfZmQs ICZkZXZpY2VfbGlzdCk7Cn0KLyo6Ki8KCi8qTTo5OTkKICogTWFzdGVyeSBpcyBkb25lOiB5b3Ug bm93IGtub3cgZXZlcnl0aGluZyBJIGRvLgogKgogKiBCdXQgc3VyZWx5IHlvdSBoYXZlIHNlZW4g Y29kZSwgZmVhdHVyZXMgYW5kIGJ1Z3MgaW4geW91ciB3YW5kZXJpbmdzIHdoaWNoCiAqIHlvdSBu b3cgeWVhcm4gdG8gYXR0YWNrPyAgVGhhdCBpcyB0aGUgcmVhbCBnYW1lLCBhbmQgSSBsb29rIGZv cndhcmQgdG8geW91CiAqIHBhdGNoaW5nIGFuZCBmb3JraW5nIGxndWVzdCBpbnRvIHRoZSBZb3Vy LU5hbWUtSGVyZS12aXNvci4KICoKICogRmFyZXdlbGwsIGFuZCBnb29kIGNvZGluZyEKICogUnVz dHkgUnVzc2VsbC4KICovCg== ------=_Part_17574_423155.1190230967982--