From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Laufer Date: Tue, 28 Mar 2000 09:17:42 +0000 Subject: [Patch] sb_card.c, take 3 MIME-Version: 1 Content-Type: multipart/mixed; boundary="1199987260-1627779519-954233626=:4292" Message-Id: List-Id: To: linux-sound@vger.kernel.org This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --1199987260-1627779519-954233626=:4292 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Hello again, Overview: This patch cleans up sb_card.c in a big way and provides for handling of multiple pnp cards in one instance of the driver. Its still against 2.3.99pre3 vanilla. I've gziped the patch because it is growing rather large. Alex, I'll wait to diff against your patch until Linus releases a new kernel with it in. Ok, this time no new features, just bug fixes. Gael Queri brought to my attention these things that I missed when merging the various sb_init functions. Cards without a DMA2 should be properly handled now. The only two such beasts I know of are the ALS007 and the Diamond card. If there are others please let me know. Also the resource index for the mpu io is different on ESS and CTL cards, that is handled properly now, too. Some sb compatables reverse the location of dma and dma2 in the isapnp resources, now handled properly. Finally, some cards have a mpu irq. I'm not sure exactly which cards do, I know the CMI card does, and from what Gael said I'm pretty sure the ALS cards do. No clue about the Diamond card, though. And since I don't have such a card I could not test to make sure this code is correct. Please try this one with every sb compatable pnp card you have (all in at the same time, even), and let me know how it goes. BTW, its really late so I hope I didn't overlook something obvious. Thanks again, Paul Laufer --1199987260-1627779519-954233626=:4292 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="sb_card.99pre3.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="sb_card.99pre3.patch" LS0tIGxpbnV4LWRldmVsLXZpcmdpbi9kcml2ZXJzL3NvdW5kL3NiX2NhcmQu YwlTYXQgTWFyIDI1IDE1OjUyOjM0IDIwMDANCisrKyBsaW51eC9kcml2ZXJz L3NvdW5kL3NiX2NhcmQuYwlUdWUgTWFyIDI4IDAwOjM5OjI5IDIwMDANCkBA IC0zMSw3ICszMSwxMCBAQA0KICAqDQogICogMTMtMDMtMjAwMCBBZGRlZCBz b21lIG1vcmUgY2FyZHMsIHRoYW5rcyB0byBUb3JzdGVuIFdlcm5lci4NCiAg KiAgUmVtb3ZlZCBqb3lzdGljayBhbmQgd2F2ZXRhYmxlIGNvZGUsIHRoZXJl IGFyZSBiZXR0ZXIgcGxhY2VzIGZvciB0aGVtLg0KLSAqICBDb2RlIGNsZWFu dXAgcGx1cyBzb21lIGZpeGVzLiANCisgKiAgQ29kZSBjbGVhbnVwIHBsdXMg c29tZSBmaXhlcy4NCisgKg0KKyAqIDI3LTAzLTIwMDAgQmlnIGNvZGUgY2xl YW51cCBhbmQgcmVvcmdhbml6YXRpb24uIElTQVBuUCBtdWx0aXBsZQ0KKyAq ICBjYXJkIGRldGVjdGlvbi4gUGF1bCBMYXVmZXIgPHBlbGF1ZmVyQGNzdXBv bW9uYS5lZHU+DQogICoNCiAgKi8NCiANCkBAIC00Nyw3ICs1MCwxNCBAQA0K ICNpbmNsdWRlICJzYl9taXhlci5oIg0KICNpbmNsdWRlICJzYi5oIg0KIA0K LXN0YXRpYyBpbnQgc2JtcHUgPSAwOw0KKyNpZiBkZWZpbmVkIENPTkZJR19J U0FQTlAgfHwgZGVmaW5lZCBDT05GSUdfSVNBUE5QX01PRFVMRQ0KKyNkZWZp bmUgU0JfQ0FSRFNfTUFYIDQNCisjZWxzZQ0KKyNkZWZpbmUgU0JfQ0FSRFNf TUFYIDENCisjZW5kaWYNCisNCitzdGF0aWMgaW50IHNibXB1W1NCX0NBUkRT X01BWF0gPSB7MH07DQorc3RhdGljIGludCBzYl9jYXJkc19udW0gPSAwOw0K IA0KIGV4dGVybiB2b2lkICpzbXdfZnJlZTsNCiANCkBAIC01NSw3ICs2NSw2 IEBADQogew0KIAlpZighc2JfZHNwX2luaXQoaHdfY29uZmlnKSkNCiAJCWh3 X2NvbmZpZy0+c2xvdHNbMF0gPSAtMTsNCi0JU09VTkRfTE9DSzsNCiB9DQog DQogc3RhdGljIGludCBfX2luaXQgcHJvYmVfc2Ioc3RydWN0IGFkZHJlc3Nf aW5mbyAqaHdfY29uZmlnKQ0KQEAgLTEyNiwzMCArMTM1LDIyIEBADQogCQl9 DQogCX0NCiAjZW5kaWYNCi0NCi0JLyogVGhpcyBpcyB1c2VsZXNzIHNpbmNl IGlzIGRvbmUgYnkgc2JfZHNwX2RldGVjdCAtIGF6dW1tbyAqLw0KLQkNCi0J aWYgKGNoZWNrX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDE2KSkNCi0J ew0KLQkJcHJpbnRrKEtFUk5fRVJSICJzYl9jYXJkOiBJL08gcG9ydCAweCV4 IGlzIGFscmVhZHkgaW4gdXNlXG5cbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7 DQotCQlyZXR1cm4gMDsNCi0JfQ0KIAlyZXR1cm4gc2JfZHNwX2RldGVjdCho d19jb25maWcsIDAsIDApOw0KIH0NCiANCi1zdGF0aWMgdm9pZCBfX2V4aXQg dW5sb2FkX3NiKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykNCitz dGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3NiKHN0cnVjdCBhZGRyZXNzX2lu Zm8gKmh3X2NvbmZpZywgaW50IGNhcmQpDQogew0KIAlpZihod19jb25maWct PnNsb3RzWzBdIT0tMSkNCi0JCXNiX2RzcF91bmxvYWQoaHdfY29uZmlnLCBz Ym1wdSk7DQorCQlzYl9kc3BfdW5sb2FkKGh3X2NvbmZpZywgc2JtcHVbY2Fy ZF0pOw0KIH0NCiANCiBleHRlcm4gaW50IGVzc3R5cGU7CS8qIEVTUyBjaGlw IHR5cGUgKi8NCiANCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7 DQotc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsNCitzdGF0 aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdbU0JfQ0FSRFNfTUFYXTsNCitz dGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1W1NCX0NBUkRTX01B WF07DQogDQotc3RydWN0IHBjaV9kZXYgCSpzYl9kZXYgCT0gTlVMTCwgDQot CQkqbXB1X2Rldgk9IE5VTEw7DQorc3RydWN0IHBjaV9kZXYgCSpzYl9kZXZb U0JfQ0FSRFNfTUFYXSAJPSB7TlVMTH0sDQorCQkqbXB1X2RldltTQl9DQVJE U19NQVhdCT0ge05VTEx9Ow0KIC8qDQogICogICAgTm90ZSBETUEyIG9mIC0x IGhhcyB0aGUgcmlnaHQgbWVhbmluZyBpbiB0aGUgU0IxNiBkcml2ZXIgYXMg d2VsbA0KICAqICAgIGFzIGhlcmUuIEl0IHdpbGwgY2F1c2UgZWl0aGVyIGFu IGVycm9yIGlmIGl0IGlzIG5lZWRlZCBvciBhIGZhbGxiYWNrDQpAQCAtMTY3 LDkgKzE2OCwxMiBAQA0KICNpZiBkZWZpbmVkIENPTkZJR19JU0FQTlAgfHwg ZGVmaW5lZCBDT05GSUdfSVNBUE5QX01PRFVMRQ0KIHN0YXRpYyBpbnQgaXNh cG5wCT0gMTsNCiBzdGF0aWMgaW50IGlzYXBucGp1bXAJPSAwOw0KLXN0YXRp YyBpbnQgYWN0aXZhdGVkCT0gMTsNCitzdGF0aWMgaW50IG11bHRpcGxlCT0g MTsNCitzdGF0aWMgaW50IHJldmVyc2UJPSAwOw0KK3N0YXRpYyBpbnQgYWN0 aXZhdGVkW1NCX0NBUkRTX01BWF0gICAgPSB7MH07DQogI2Vsc2UNCiBzdGF0 aWMgaW50IGlzYXBucAk9IDA7DQorc3RhdGljIGludCBtdWx0aXBsZQk9IDA7 DQogI2VuZGlmDQogDQogTU9EVUxFX0RFU0NSSVBUSU9OKCJTb3VuZGJsYXN0 ZXIgZHJpdmVyIik7DQpAQCAtMTg3LDggKzE5MSwxMiBAQA0KICNpZiBkZWZp bmVkIENPTkZJR19JU0FQTlAgfHwgZGVmaW5lZCBDT05GSUdfSVNBUE5QX01P RFVMRQ0KIE1PRFVMRV9QQVJNKGlzYXBucCwJImkiKTsNCiBNT0RVTEVfUEFS TShpc2FwbnBqdW1wLAkiaSIpOw0KK01PRFVMRV9QQVJNKG11bHRpcGxlLAki aSIpOw0KK01PRFVMRV9QQVJNKHJldmVyc2UsCSJpIik7DQogTU9EVUxFX1BB Uk1fREVTQyhpc2FwbnAsCSJXaGVuIHNldCB0byAwLCBQbHVnICYgUGxheSBz dXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQiKTsNCiBNT0RVTEVfUEFSTV9ERVND KGlzYXBucGp1bXAsCSJKdW1wcyB0byBhIHNwZWNpZmljIHNsb3QgaW4gdGhl IGRyaXZlcidzIFBuUCB0YWJsZS4gVXNlIHRoZSBzb3VyY2UsIEx1a2UuIik7 DQorTU9EVUxFX1BBUk1fREVTQyhtdWx0aXBsZSwJIldoZW4gc2V0IHRvIDAs IHdpbGwgbm90IHNlYXJjaCBmb3IgbXVsdGlwbGUgY2FyZHMiKTsNCitNT0RV TEVfUEFSTV9ERVNDKHJldmVyc2UsCSJXaGVuIHNldCB0byAxLCB3aWxsIHJl dmVyc2UgSVNBUG5QIHNlYXJjaCBvcmRlciIpOw0KICNlbmRpZg0KIA0KIE1P RFVMRV9QQVJNX0RFU0MoaW8sCQkiU291bmRibGFzdGVyIGkvbyBiYXNlIGFk ZHJlc3MgKDB4MjIwLDB4MjQwLDB4MjYwLDB4MjgwKSIpOw0KQEAgLTIwMywy MyArMjExLDIxNSBAQA0KIA0KICNpZiBkZWZpbmVkIENPTkZJR19JU0FQTlAg fHwgZGVmaW5lZCBDT05GSUdfSVNBUE5QX01PRFVMRQ0KIA0KKy8qIFBsZWFz ZSBhZGQgbmV3IGVudHJpZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgKi8N CitzdGF0aWMgc3RydWN0IHsNCisJY2hhciAqbmFtZTsgDQorCXVuc2lnbmVk IHNob3J0IGNhcmRfdmVuZG9yLCBjYXJkX2RldmljZSwgYXVkaW9fdmVuZG9y LCBhdWRpb19mdW5jdGlvbiwgbXB1X3ZlbmRvciwgbXB1X2Z1bmN0aW9uOw0K KwlzaG9ydCBkbWEsIGRtYTIsIG1wdV9pbywgbXB1X2lycTsgLyogc2VlIHNi X2luaXQoKSAqLw0KK30gc2JfaXNhcG5wX2xpc3RbXSBfX2luaXRkYXRhID0g ew0KKwl7IlNvdW5kIEJsYXN0ZXIgMTYiLCANCisJCUlTQVBOUF9WRU5ET1Io J0MnLCdUJywnTCcpLCBJU0FQTlBfREVWSUNFKDB4MDAyNCksDQorCQlJU0FQ TlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAz MSksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQgQmxhc3Rl ciAxNiIsIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBO UF9ERVZJQ0UoMHgwMDI2KSwgDQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcs J0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAzMSksDQorCQkwLDAsDQorCQkw LDEsMSwtMX0sDQorCXsiU291bmQgQmxhc3RlciAxNiIsIA0KKwkJSVNBUE5Q X1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJQ0UoMHgwMDI3KSwg DQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNU SU9OKDB4MDAzMSksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291 bmQgQmxhc3RlciAxNiIsIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdM JyksIElTQVBOUF9ERVZJQ0UoMHgwMDI5KSwgDQorCQlJU0FQTlBfVkVORE9S KCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAzMSksDQorCQkw LDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQgQmxhc3RlciAxNiIsIA0K KwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJQ0Uo MHgwMDJiKSwgDQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNB UE5QX0ZVTkNUSU9OKDB4MDAzMSksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0s DQorCXsiU291bmQgQmxhc3RlciBWaWJyYTE2UyIsIA0KKwkJSVNBUE5QX1ZF TkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJQ0UoMHgwMDUxKSwgDQor CQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9O KDB4MDAwMSksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQg Qmxhc3RlciBWaWJyYTE2QyIsIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1Qn LCdMJyksIElTQVBOUF9ERVZJQ0UoMHgwMDcwKSwgDQorCQlJU0FQTlBfVkVO RE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAwMSksDQor CQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQgQmxhc3RlciBWaWJy YTE2Q0wiLCANCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQ TlBfREVWSUNFKDB4MDA4MCksIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1Qn LCdMJyksIElTQVBOUF9GVU5DVElPTigweDAwNDEpLA0KKwkJMCwwLA0KKwkJ MCwxLDEsLTF9LA0KKwl7IlNvdW5kIEJsYXN0ZXIgVmlicmExNlgiLCANCisJ CUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQTlBfREVWSUNFKDB4 MDBGMCksIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBO UF9GVU5DVElPTigweDAwNDMpLA0KKwkJMCwwLA0KKwkJMCwxLDEsLTF9LA0K Kwl7IlNvdW5kIEJsYXN0ZXIgQVdFIDMyIiwgDQorCQlJU0FQTlBfVkVORE9S KCdDJywnVCcsJ0wnKSwgSVNBUE5QX0RFVklDRSgweDAwMzkpLCANCisJCUlT QVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgw MDMxKSwNCisJCTAsMCwNCisJCTAsMSwxLC0xfSwNCisJeyJTb3VuZCBCbGFz dGVyIEFXRSAzMiIsDQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwg SVNBUE5QX0RFVklDRSgweDAwNDIpLCANCisJCUlTQVBOUF9WRU5ET1IoJ0Mn LCdUJywnTCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDMxKSwNCisJCTAsMCwN CisJCTAsMSwxLC0xfSwNCisJeyJTb3VuZCBCbGFzdGVyIEFXRSAzMiIsDQor CQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0RFVklDRSgw eDAwNDMpLCANCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQ TlBfRlVOQ1RJT04oMHgwMDMxKSwNCisJCTAsMCwNCisJCTAsMSwxLC0xfSwN CisJeyJTb3VuZCBCbGFzdGVyIEFXRSAzMiIsDQorCQlJU0FQTlBfVkVORE9S KCdDJywnVCcsJ0wnKSwgSVNBUE5QX0RFVklDRSgweDAwNDQpLA0KKwkJSVNB UE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAw MzEpLA0KKwkJMCwwLA0KKwkJMCwxLDEsLTF9LA0KKwl7IlNvdW5kIEJsYXN0 ZXIgQVdFIDMyIiwNCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJ U0FQTlBfREVWSUNFKDB4MDA0OCksIA0KKwkJSVNBUE5QX1ZFTkRPUignQycs J1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAwMzEpLA0KKwkJMCwwLA0K KwkJMCwxLDEsLTF9LA0KKwl7IlNvdW5kIEJsYXN0ZXIgQVdFIDMyIiwNCisJ CUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQTlBfREVWSUNFKDB4 MDA1NCksIA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBO UF9GVU5DVElPTigweDAwMzEpLA0KKwkJMCwwLA0KKwkJMCwxLDEsLTF9LA0K Kwl7IlNvdW5kIEJsYXN0ZXIgQVdFIDMyIiwNCisJCUlTQVBOUF9WRU5ET1Io J0MnLCdUJywnTCcpLCBJU0FQTlBfREVWSUNFKDB4MDA5QyksIA0KKwkJSVNB UE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAw NDEpLA0KKwkJMCwwLA0KKwkJMCwxLDEsLTF9LA0KKwl7IlNvdW5kIEJsYXN0 ZXIgQVdFIDY0IiwNCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJ U0FQTlBfREVWSUNFKDB4MDA5RCksIA0KKwkJSVNBUE5QX1ZFTkRPUignQycs J1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAwNDIpLA0KKwkJMCwwLA0K KwkJMCwxLDEsLTF9LA0KKwl7IlNvdW5kIEJsYXN0ZXIgQVdFIDY0IEdvbGQi LA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJ Q0UoMHgwMDlFKSwgDQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwg SVNBUE5QX0ZVTkNUSU9OKDB4MDA0NCksDQorCQkwLDAsDQorCQkwLDEsMSwt MX0sDQorCXsiU291bmQgQmxhc3RlciBBV0UgNjQiLA0KKwkJSVNBUE5QX1ZF TkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJQ0UoMHgwMEMxKSwgDQor CQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9O KDB4MDA0MiksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQg Qmxhc3RlciBBV0UgNjQiLA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdM JyksIElTQVBOUF9ERVZJQ0UoMHgwMEMzKSwgDQorCQlJU0FQTlBfVkVORE9S KCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDA0NSksDQorCQkw LDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQgQmxhc3RlciBBV0UgNjQi LA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJ Q0UoMHgwMEM1KSwgDQorCQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwg SVNBUE5QX0ZVTkNUSU9OKDB4MDA0NSksDQorCQkwLDAsDQorCQkwLDEsMSwt MX0sDQorCXsiU291bmQgQmxhc3RlciBBV0UgNjQiLA0KKwkJSVNBUE5QX1ZF TkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9ERVZJQ0UoMHgwMEM3KSwgDQor CQlJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9O KDB4MDA0NSksDQorCQkwLDAsDQorCQkwLDEsMSwtMX0sDQorCXsiU291bmQg Qmxhc3RlciBBV0UgNjQiLA0KKwkJSVNBUE5QX1ZFTkRPUignQycsJ1QnLCdM JyksIElTQVBOUF9ERVZJQ0UoMHgwMEU0KSwgDQorCQlJU0FQTlBfVkVORE9S KCdDJywnVCcsJ0wnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDA0NSksDQorCQkw LDAsDQorCQkwLDEsMSwtMX0sDQorCXsiRVNTIDE4NjgiLA0KKwkJSVNBUE5Q X1ZFTkRPUignRScsJ1MnLCdTJyksIElTQVBOUF9ERVZJQ0UoMHgxODY4KSwg DQorCQlJU0FQTlBfVkVORE9SKCdFJywnUycsJ1MnKSwgSVNBUE5QX0ZVTkNU SU9OKDB4MTg2OCksDQorCQkwLDAsDQorCQkwLDEsMiwtMX0sDQorCXsiRVNT IDE4NjgiLA0KKwkJSVNBUE5QX1ZFTkRPUignRScsJ1MnLCdTJyksIElTQVBO UF9ERVZJQ0UoMHgxODY4KSwgDQorCQlJU0FQTlBfVkVORE9SKCdFJywnUycs J1MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4ODYxMSksDQorCQkwLDAsDQorCQkw LDEsMiwtMX0sDQorCXsiRVNTIDE4NjkgUG5QIEF1ZGlvRHJpdmUiLCANCisJ CUlTQVBOUF9WRU5ET1IoJ0UnLCdTJywnUycpLCBJU0FQTlBfREVWSUNFKDB4 MDAwMyksIA0KKwkJSVNBUE5QX1ZFTkRPUignRScsJ1MnLCdTJyksIElTQVBO UF9GVU5DVElPTigweDE4NjkpLA0KKwkJMCwwLA0KKwkJMCwxLDIsLTF9LA0K Kwl7IkVTUyAxODY5IiwNCisJCUlTQVBOUF9WRU5ET1IoJ0UnLCdTJywnUycp LCBJU0FQTlBfREVWSUNFKDB4MTg2OSksIA0KKwkJSVNBUE5QX1ZFTkRPUign RScsJ1MnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDE4NjkpLA0KKwkJMCww LA0KKwkJMCwxLDIsLTF9LA0KKwl7IkVTUyAxODc4IiwNCisJCUlTQVBOUF9W RU5ET1IoJ0UnLCdTJywnUycpLCBJU0FQTlBfREVWSUNFKDB4MTg3OCksIA0K KwkJSVNBUE5QX1ZFTkRPUignRScsJ1MnLCdTJyksIElTQVBOUF9GVU5DVElP TigweDE4NzgpLA0KKwkJMCwwLA0KKwkJMCwxLDIsLTF9LA0KKwl7IkVTUyAx ODc5IiwNCisJCUlTQVBOUF9WRU5ET1IoJ0UnLCdTJywnUycpLCBJU0FQTlBf REVWSUNFKDB4MTg3OSksIA0KKwkJSVNBUE5QX1ZFTkRPUignRScsJ1MnLCdT JyksIElTQVBOUF9GVU5DVElPTigweDE4NzkpLA0KKwkJMCwwLA0KKwkJMCwx LDIsLTF9LA0KKwl7IkNNSSA4MzMwIFNvdW5kUFJPIiwNCisJCUlTQVBOUF9W RU5ET1IoJ0MnLCdNJywnSScpLCBJU0FQTlBfREVWSUNFKDB4MDAwMSksIA0K KwkJSVNBUE5QX1ZFTkRPUignQCcsJ1gnLCdAJyksIElTQVBOUF9GVU5DVElP TigweDAwMDEpLA0KKwkJSVNBUE5QX1ZFTkRPUignQCcsJ0gnLCdAJyksIElT QVBOUF9GVU5DVElPTigweDAwMDEpLA0KKwkJMCwxLDAsMH0sDQorCXsiRGlh bW9uZCBEVDAxOTdIIiwNCisJCUlTQVBOUF9WRU5ET1IoJ1InLCdXJywnQicp LCBJU0FQTlBfREVWSUNFKDB4MTY4OCksIA0KKwkJSVNBUE5QX1ZFTkRPUign QCcsJ0AnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLA0KKwkJSVNB UE5QX1ZFTkRPUignQCcsJ1gnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAw MDEpLA0KKwkJMCwtMSwwLC0xfSwNCisJeyJBTFMwMDciLA0KKwkJSVNBUE5Q X1ZFTkRPUignQScsJ0wnLCdTJyksIElTQVBOUF9ERVZJQ0UoMHgwMDA3KSwN CisJCUlTQVBOUF9WRU5ET1IoJ0AnLCdAJywnQCcpLCBJU0FQTlBfRlVOQ1RJ T04oMHgwMDAxKSwNCisJCUlTQVBOUF9WRU5ET1IoJ0AnLCdYJywnQCcpLCBJ U0FQTlBfRlVOQ1RJT04oMHgwMDAxKSwNCisJCTAsLTEsMCwwfSwNCisJeyJB TFMxMDAiLA0KKwkgICAgICAgCUlTQVBOUF9WRU5ET1IoJ0EnLCdMJywnUycp LCBJU0FQTlBfREVWSUNFKDB4MDAwMSksIA0KKwkJSVNBUE5QX1ZFTkRPUign QCcsJ0AnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLA0KKwkJSVNB UE5QX1ZFTkRPUignQCcsJ1gnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAw MDEpLA0KKwkJMSwwLDAsMH0sDQorCXsiQUxTMTEwIiwNCisJCUlTQVBOUF9W RU5ET1IoJ0EnLCdMJywnUycpLCBJU0FQTlBfREVWSUNFKDB4MDExMCksDQor CQlJU0FQTlBfVkVORE9SKCdAJywnQCcsJ0AnKSwgSVNBUE5QX0ZVTkNUSU9O KDB4MTAwMSksDQorCQlJU0FQTlBfVkVORE9SKCdAJywnWCcsJ0AnKSwgSVNB UE5QX0ZVTkNUSU9OKDB4MTAwMSksDQorCQkxLDAsMCwwfSwNCisJeyJBTFMx MjAiLA0KKwkJSVNBUE5QX1ZFTkRPUignQScsJ0wnLCdTJyksIElTQVBOUF9E RVZJQ0UoMHgwMTIwKSwNCisJCUlTQVBOUF9WRU5ET1IoJ0AnLCdAJywnQCcp LCBJU0FQTlBfRlVOQ1RJT04oMHgyMDAxKSwNCisJCUlTQVBOUF9WRU5ET1Io J0AnLCdYJywnQCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgyMDAxKSwNCisJCTEs MCwwLDB9LA0KKwl7IkFMUzIwMCIsDQorCQlJU0FQTlBfVkVORE9SKCdBJywn TCcsJ1MnKSwgSVNBUE5QX0RFVklDRSgweDAyMDApLA0KKwkJSVNBUE5QX1ZF TkRPUignQCcsJ0AnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMjApLA0K KwkJSVNBUE5QX1ZFTkRPUignQCcsJ1gnLCdAJyksIElTQVBOUF9GVU5DVElP TigweDAwMjApLA0KKwkJMSwwLDAsMH0sDQorCXsiUlRMMzAwMCIsDQorCQlJ U0FQTlBfVkVORE9SKCdSJywnVCcsJ0wnKSwgSVNBUE5QX0RFVklDRSgweDMw MDApLA0KKwkJSVNBUE5QX1ZFTkRPUignQCcsJ0AnLCdAJyksIElTQVBOUF9G VU5DVElPTigweDIwMDEpLA0KKwkJSVNBUE5QX1ZFTkRPUignQCcsJ1gnLCdA JyksIElTQVBOUF9GVU5DVElPTigweDIwMDEpLA0KKwkJMSwwLDAsMH0sDQor CXswfQ0KK307DQorDQogLyogVGhhdCdzIHVzZWZ1bC4gKi8NCiANCiAjZGVm aW5lIHNob3dfYmFzZShkZXZuYW1lLCByZXNuYW1lLCByZXNwdHIpIHByaW50 ayhLRVJOX0lORk8gInNiOiAlcyAlcyBiYXNlIGxvY2F0ZWQgYXQgJSNseFxu IiwgZGV2bmFtZSwgcmVzbmFtZSwgKHJlc3B0ciktPnN0YXJ0KQ0KIA0KLXN0 YXRpYyBzdHJ1Y3QgcGNpX2RldiAqYWN0aXZhdGVfZGV2KGNoYXIgKmRldm5h bWUsIGNoYXIgKnJlc25hbWUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpDQorc3Rh dGljIHN0cnVjdCBwY2lfZGV2ICphY3RpdmF0ZV9kZXYoY2hhciAqZGV2bmFt ZSwgY2hhciAqcmVzbmFtZSwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGNh cmQpDQogew0KIAlpbnQgZXJyOw0KIA0KIAkvKiBEZXZpY2UgYWxyZWFkeSBh Y3RpdmU/IExldCdzIHVzZSBpdCAqLw0KLQ0KLQlpZihkZXYtPmFjdGl2ZSkN Ci0Jew0KLQkJYWN0aXZhdGVkID0gMDsNCisJaWYoZGV2LT5hY3RpdmUpIHsN CisJCWFjdGl2YXRlZFtjYXJkXSA9IDE7DQogCQlyZXR1cm4oZGV2KTsNCiAJ fQ0KLQlpZigoZXJyID0gZGV2LT5hY3RpdmF0ZShkZXYpKSA8IDApDQotCXsN CisJDQorCWlmKChlcnIgPSBkZXYtPmFjdGl2YXRlKGRldikpIDwgMCkgew0K IAkJcHJpbnRrKEtFUk5fRVJSICJzYjogJXMgJXMgY29uZmlnIGZhaWxlZCAo b3V0IG9mIHJlc291cmNlcz8pWyVkXVxuIiwgZGV2bmFtZSwgcmVzbmFtZSwg ZXJyKTsNCiANCiAJCWRldi0+ZGVhY3RpdmF0ZShkZXYpOw0KQEAgLTIyOSwz MjAgKzQyOSwxMDggQEANCiAJcmV0dXJuKGRldik7DQogfQ0KIA0KLS8qIENh cmQncyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCi0gKi8N Ci0NCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNiX2luaXRfZ2VuZXJpYyhz dHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2RldiAqY2FyZCwgc3Ry dWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgYWRkcmVzc19p bmZvICptcHVfY29uZmlnKQ0KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc2Jf aW5pdChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgYWRkcmVzc19pbmZv ICpod19jb25maWcsIHN0cnVjdCBhZGRyZXNzX2luZm8gKm1wdV9jb25maWcs IGludCBzbG90LCBpbnQgY2FyZCkNCiB7DQotCWlmKChzYl9kZXYgPSBpc2Fw bnBfZmluZF9kZXYoYnVzLCBjYXJkLT52ZW5kb3IsIGNhcmQtPmRldmljZSwg TlVMTCkpKQ0KLQl7DQotCQlzYl9kZXYtPnByZXBhcmUoc2JfZGV2KTsNCisJ LyogQ29uZmlndXJlIEF1ZGlvIGRldmljZSAqLw0KIA0KLQkJaWYoKHNiX2Rl diA9IGFjdGl2YXRlX2RldigiU291bmRibGFzdGVyIiwgInNiIiwgc2JfZGV2 KSkpDQotCQl7DQotCQkJaHdfY29uZmlnLT5pb19iYXNlIAk9IHNiX2Rldi0+ cmVzb3VyY2VbMF0uc3RhcnQ7DQotCQkJaHdfY29uZmlnLT5pcnEgCQk9IHNi X2Rldi0+aXJxX3Jlc291cmNlWzBdLnN0YXJ0Ow0KLQkJCWh3X2NvbmZpZy0+ ZG1hIAkJPSBzYl9kZXYtPmRtYV9yZXNvdXJjZVswXS5zdGFydDsNCi0JCQlo d19jb25maWctPmRtYTIgCT0gc2JfZGV2LT5kbWFfcmVzb3VyY2VbMV0uc3Rh cnQ7DQotCQkJbXB1X2NvbmZpZy0+aW9fYmFzZQk9IHNiX2Rldi0+cmVzb3Vy Y2VbMV0uc3RhcnQ7DQotCQl9DQotCX0NCi0JcmV0dXJuKHNiX2Rldik7DQot fQ0KLQ0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc2JfaW5pdF9lc3Moc3Ry dWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9kZXYgKmNhcmQsIHN0cnVj dCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IGFkZHJlc3NfaW5m byAqbXB1X2NvbmZpZykNCi17DQotCWlmKChzYl9kZXYgPSBpc2FwbnBfZmlu ZF9kZXYoYnVzLCBjYXJkLT52ZW5kb3IsIGNhcmQtPmRldmljZSwgTlVMTCkp KQ0KKwlpZigoc2JfZGV2W2NhcmRdID0gaXNhcG5wX2ZpbmRfZGV2KGJ1cywg c2JfaXNhcG5wX2xpc3Rbc2xvdF0uYXVkaW9fdmVuZG9yLCBzYl9pc2FwbnBf bGlzdFtzbG90XS5hdWRpb19mdW5jdGlvbiwgTlVMTCkpKQ0KIAl7DQotCQlz Yl9kZXYtPnByZXBhcmUoc2JfZGV2KTsNCisJCXNiX2RldltjYXJkXS0+cHJl cGFyZShzYl9kZXZbY2FyZF0pOw0KIA0KLQkJaWYoKHNiX2RldiA9IGFjdGl2 YXRlX2RldigiRVNTIiwgInNiIiwgc2JfZGV2KSkpDQorCQlpZigoc2JfZGV2 W2NhcmRdID0gYWN0aXZhdGVfZGV2KHNiX2lzYXBucF9saXN0W3Nsb3RdLm5h bWUsICJzYiIsIHNiX2RldltjYXJkXSwgY2FyZCkpKQ0KIAkJew0KLQkJCWh3 X2NvbmZpZy0+aW9fYmFzZSAJPSBzYl9kZXYtPnJlc291cmNlWzBdLnN0YXJ0 Ow0KLQkJCWh3X2NvbmZpZy0+aXJxIAkJPSBzYl9kZXYtPmlycV9yZXNvdXJj ZVswXS5zdGFydDsNCi0JCQlod19jb25maWctPmRtYSAJCT0gc2JfZGV2LT5k bWFfcmVzb3VyY2VbMF0uc3RhcnQ7DQotCQkJaHdfY29uZmlnLT5kbWEyCQk9 IHNiX2Rldi0+ZG1hX3Jlc291cmNlWzFdLnN0YXJ0Ow0KLQkJCW1wdV9jb25m aWctPmlvX2Jhc2UJPSBzYl9kZXYtPnJlc291cmNlWzJdLnN0YXJ0Ow0KLQkJ fQ0KLQl9DQotCXJldHVybihzYl9kZXYpOw0KLX0NCi0NCi1zdGF0aWMgc3Ry dWN0IHBjaV9kZXYgKnNiX2luaXRfY21pKHN0cnVjdCBwY2lfYnVzICpidXMs IHN0cnVjdCBwY2lfZGV2ICpjYXJkLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpo d19jb25maWcsIHN0cnVjdCBhZGRyZXNzX2luZm8gKm1wdV9jb25maWcpDQot ew0KLQkvKiANCi0JICogIFRoZSBDTUk4MzMwL0MzRCBpcyBhIHZlcnkgJ3N0 dXBpZCcgY2hpcC4uLiB3aGVyZSBkaWQgdGhleSBnZXQgYWwgdGhvc2UgQEBA ID8NCi0JICogIEl0J3MgSVNBUG5QIHNlY3Rpb24gaXMgYmFkbHkgZGVzaWdu ZWQgYW5kIGhhcyBtYW55IGZsYXdzLCBpJ2xsIGRvIG15IGJlc3QNCi0JICog IHRvIHdvcmthcm91bmQgdGhlbS4gSSBzdHJvbmdseSBzdWdnZXN0IHlvdSB0 byBidXkgYSByZWFsIHNvdW5kY2FyZC4NCi0JICogIFRoZSBDTUk4MzMwIG9u IG15IG1vdGhlcmJvYXJkIGhhcyBhbHNvIHRoZSBiYWQgaGFiaXQgdG8gYWN0 aXZhdGUgDQotCSAqICB0aGUgcmVhciBjaGFubmVsIG9mIG15IGFtcGxpZmll ciBpbnN0ZWFkIG9mIHRoZSBmcm9udCBvbmUuDQotCSAqLw0KLQ0KLQkvKiAg QFhAMDAwMTpTb3VuZGJsYXN0ZXIuDQotCSAqLw0KLQ0KLQlpZigoc2JfZGV2 ID0gaXNhcG5wX2ZpbmRfZGV2KGJ1cywNCi0JCUlTQVBOUF9WRU5ET1IoJ0An LCdYJywnQCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAxKSwgTlVMTCkpKQ0K LQl7DQotCQlzYl9kZXYtPnByZXBhcmUoc2JfZGV2KTsNCi0JCQ0KLQkJaWYo KHNiX2RldiA9IGFjdGl2YXRlX2RldigiQ01JODMzMCIsICJzYiIsIHNiX2Rl dikpKQ0KLQkJew0KLQkJCWh3X2NvbmZpZy0+aW9fYmFzZSAJPSBzYl9kZXYt PnJlc291cmNlWzBdLnN0YXJ0Ow0KLQkJCWh3X2NvbmZpZy0+aXJxIAkJPSBz Yl9kZXYtPmlycV9yZXNvdXJjZVswXS5zdGFydDsNCi0JCQlod19jb25maWct PmRtYSAJCT0gc2JfZGV2LT5kbWFfcmVzb3VyY2VbMF0uc3RhcnQ7DQotCQkJ aHdfY29uZmlnLT5kbWEyIAk9IHNiX2Rldi0+ZG1hX3Jlc291cmNlWzFdLnN0 YXJ0Ow0KLQ0KLQkJCXNob3dfYmFzZSgiQ01JODMzMCIsICJzYiIsICZzYl9k ZXYtPnJlc291cmNlWzBdKTsNCi0JCX0NCisJCQlod19jb25maWctPmlvX2Jh c2UgCT0gc2JfZGV2W2NhcmRdLT5yZXNvdXJjZVswXS5zdGFydDsNCisJCQlo d19jb25maWctPmlycSAJCT0gc2JfZGV2W2NhcmRdLT5pcnFfcmVzb3VyY2Vb MF0uc3RhcnQ7DQorCQkJaHdfY29uZmlnLT5kbWEgCQk9IHNiX2RldltjYXJk XS0+ZG1hX3Jlc291cmNlW3NiX2lzYXBucF9saXN0W3Nsb3RdLmRtYV0uc3Rh cnQ7DQorCQkJaWYoc2JfaXNhcG5wX2xpc3Rbc2xvdF0uZG1hMiAhPSAtMSkN CisJCQkJaHdfY29uZmlnLT5kbWEyID0gc2JfZGV2W2NhcmRdLT5kbWFfcmVz b3VyY2Vbc2JfaXNhcG5wX2xpc3Rbc2xvdF0uZG1hMl0uc3RhcnQ7DQorCQkJ ZWxzZQ0KKwkJCQlod19jb25maWctPmRtYTIgPSAtMTsNCisJCX0gZWxzZQ0K KwkJCXJldHVybihOVUxMKTsNCisJfSBlbHNlDQorCQlyZXR1cm4oTlVMTCk7 DQogDQotCQlpZighc2JfZGV2KSByZXR1cm4oTlVMTCk7DQorCS8qIENhcmRz IHdpdGggTVBVIHBhcnQgb2YgQXVkaW8gZGV2aWNlICovDQorCQ0KKwlpZigh c2JfaXNhcG5wX2xpc3Rbc2xvdF0ubXB1X3ZlbmRvcikgew0KKwkJbXB1X2Nv bmZpZy0+aW9fYmFzZQk9IHNiX2RldltjYXJkXS0+cmVzb3VyY2Vbc2JfaXNh cG5wX2xpc3Rbc2xvdF0ubXB1X2lvXS5zdGFydDsNCisJCXJldHVybihzYl9k ZXZbY2FyZF0pOw0KIAl9DQotCWVsc2UNCi0JCXByaW50ayhLRVJOX0VSUiAi c2I6IENNSTgzMzAgcGFuaWM6IHNiIGJhc2Ugbm90IGZvdW5kXG4iKTsNCiAN Ci0JLyogIEBIQDAwMDE6bXB1DQotCSAqLw0KKwkvKiBDYXJkcyB3aXRoIHNl cGFyYXRlIE1QVSBkZXZpY2UgKi8NCiANCi0JaWYoKG1wdV9kZXYgPSBpc2Fw bnBfZmluZF9kZXYoYnVzLA0KLQkJSVNBUE5QX1ZFTkRPUignQCcsJ0gnLCdA JyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLCBOVUxMKSkpDQorCWlmKCht cHVfZGV2W2NhcmRdID0gaXNhcG5wX2ZpbmRfZGV2KGJ1cywgc2JfaXNhcG5w X2xpc3Rbc2xvdF0ubXB1X3ZlbmRvciwgc2JfaXNhcG5wX2xpc3Rbc2xvdF0u bXB1X2Z1bmN0aW9uLCBOVUxMKSkpDQogCXsNCi0JCW1wdV9kZXYtPnByZXBh cmUobXB1X2Rldik7DQotDQotCQkvKiAgVGhpcyBkaXNhYmxlcyB0aGUgaW50 ZXJydXB0IG9uIHRoaXMgcmVzb3VyY2UuIERvIHdlIG5lZWQgaXQgPw0KLQkJ ICovDQotDQotCQltcHVfZGV2LT5pcnFfcmVzb3VyY2VbMF0uZmxhZ3MgPSAw Ow0KKwkJbXB1X2RldltjYXJkXS0+cHJlcGFyZShtcHVfZGV2W2NhcmRdKTsN CiANCi0JCWlmKChtcHVfZGV2ID0gYWN0aXZhdGVfZGV2KCJDTUk4MzMwIiwg Im1wdSIsIG1wdV9kZXYpKSkNCi0JCXsNCi0JCQlzaG93X2Jhc2UoIkNNSTgz MzAiLCAibXB1IiwgJm1wdV9kZXYtPnJlc291cmNlWzBdKTsNCi0JCQltcHVf Y29uZmlnLT5pb19iYXNlID0gbXB1X2Rldi0+cmVzb3VyY2VbMF0uc3RhcnQ7 DQorCQlpZigobXB1X2RldltjYXJkXSA9IGFjdGl2YXRlX2RldihzYl9pc2Fw bnBfbGlzdFtzbG90XS5uYW1lLCAibXB1IiwgbXB1X2RldltjYXJkXSwgY2Fy ZCkpKSB7DQorCQkJbXB1X2NvbmZpZy0+aW9fYmFzZSA9IG1wdV9kZXZbY2Fy ZF0tPnJlc291cmNlW3NiX2lzYXBucF9saXN0W3Nsb3RdLm1wdV9pb10uc3Rh cnQ7DQorCQkJaWYoc2JfaXNhcG5wX2xpc3Rbc2xvdF0ubXB1X2lycSAhPSAt MSkNCisJCQkJbXB1X2NvbmZpZy0+aXJxID0gc2JfZGV2W2NhcmRdLT5pcnFf cmVzb3VyY2Vbc2JfaXNhcG5wX2xpc3Rbc2xvdF0ubXB1X2lycV0uc3RhcnQ7 DQogCQl9DQogCX0NCiAJZWxzZQ0KLQkJcHJpbnRrKEtFUk5fRVJSICJzYjog Q01JODMzMCBwYW5pYzogbXB1IG5vdCBmb3VuZFxuIik7DQotDQotCXByaW50 ayhLRVJOX0lORk8gInNiOiBDTUk4MzMwIG1haWwgcmVwb3J0cyB0byBBbGVz c2FuZHJvIFp1bW1vIDxhenVtbW9AaXRhLmZsYXNobmV0Lml0PlxuIik7DQot DQotCXJldHVybihzYl9kZXYpOw0KKwkJcHJpbnRrKEtFUk5fRVJSICJzYjog JXMgcGFuaWM6IG1wdSBub3QgZm91bmRcbiIsIHNiX2lzYXBucF9saXN0W3Ns b3RdLm5hbWUpOw0KKwkNCisJcmV0dXJuKHNiX2RldltjYXJkXSk7DQogfQ0K IA0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc2JfaW5pdF9kaWFtb25kKHN0 cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCBwY2lfZGV2ICpjYXJkLCBzdHJ1 Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBhZGRyZXNzX2lu Zm8gKm1wdV9jb25maWcpDQorc3RhdGljIGludCBfX2luaXQgc2JfaXNhcG5w X2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3Qg YWRkcmVzc19pbmZvICptcHVfY29uZmlnLCBzdHJ1Y3QgcGNpX2J1cyAqYnVz LCBpbnQgc2xvdCwgaW50IGNhcmQpDQogew0KLQkvKiANCi0JICogRGlhbW9u ZHMgRFQwMTk3SA0KLQkgKiB2ZXJ5IHNpbWlsYXIgdG8gdGhlIENNSTgzMzAg YWJvdmUNCi0JICovDQotDQotCS8qICBAQEAwMDAxOlNvdW5kYmxhc3Rlci4N Ci0JICovDQotDQotCWlmKChzYl9kZXYgPSBpc2FwbnBfZmluZF9kZXYoYnVz LA0KLQkJCQlJU0FQTlBfVkVORE9SKCdAJywnQCcsJ0AnKSwgSVNBUE5QX0ZV TkNUSU9OKDB4MDAwMSksIE5VTEwpKSkNCi0Jew0KLQkJc2JfZGV2LT5wcmVw YXJlKHNiX2Rldik7DQotCQkNCi0JCWlmKChzYl9kZXYgPSBhY3RpdmF0ZV9k ZXYoIkRUMDE5N0giLCAic2IiLCBzYl9kZXYpKSkNCi0JCXsNCi0JCQlod19j b25maWctPmlvX2Jhc2UgCT0gc2JfZGV2LT5yZXNvdXJjZVswXS5zdGFydDsN Ci0JCQlod19jb25maWctPmlycSAJCT0gc2JfZGV2LT5pcnFfcmVzb3VyY2Vb MF0uc3RhcnQ7DQotCQkJaHdfY29uZmlnLT5kbWEgCQk9IHNiX2Rldi0+ZG1h X3Jlc291cmNlWzBdLnN0YXJ0Ow0KLQkJCWh3X2NvbmZpZy0+ZG1hMiAJPSAt MTsNCi0NCi0JCQlzaG93X2Jhc2UoIkRUMDE5N0giLCAic2IiLCAmc2JfZGV2 LT5yZXNvdXJjZVswXSk7DQotCQl9DQotDQotCQlpZighc2JfZGV2KSByZXR1 cm4oTlVMTCk7DQotCX0NCi0JZWxzZQ0KLQkJcHJpbnRrKEtFUk5fRVJSICJz YjogRFQwMTk3SCBwYW5pYzogc2IgYmFzZSBub3QgZm91bmRcbiIpOw0KLQ0K LQkvKiAgQFhAMDAwMTptcHUNCi0JICovDQotDQotCWlmKChtcHVfZGV2ID0g aXNhcG5wX2ZpbmRfZGV2KGJ1cywNCi0JCQkJSVNBUE5QX1ZFTkRPUignQCcs J1gnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLCBOVUxMKSkpDQot CXsNCi0JCW1wdV9kZXYtPnByZXBhcmUobXB1X2Rldik7DQotDQotCQlpZigo bXB1X2RldiA9IGFjdGl2YXRlX2RldigiRFQwMTk3SCIsICJtcHUiLCBtcHVf ZGV2KSkpDQotCQl7DQotCQkJc2hvd19iYXNlKCJEVDAxOTdIIiwgIm1wdSIs ICZtcHVfZGV2LT5yZXNvdXJjZVswXSk7DQotCQkJbXB1X2NvbmZpZy0+aW9f YmFzZSA9IG1wdV9kZXYtPnJlc291cmNlWzBdLnN0YXJ0Ow0KLQkJfQ0KLQl9 DQotCWVsc2UNCi0JCXByaW50ayhLRVJOX0VSUiAic2I6IERUMDE5N0ggcGFu aWM6IG1wdSBub3QgZm91bmRcbiIpOw0KLQ0KLQlwcmludGsoS0VSTl9JTkZP ICJzYjogRFQwMTk3SCBtYWlsIHJlcG9ydHMgdG8gVG9yc3RlbiBXZXJuZXIg PHR3ZXJuZXJAaW50ZXJjb21tLmRlPlxuIik7DQotDQotCXJldHVybihzYl9k ZXYpOw0KLX0NCisJY2hhciAqYnVzbmFtZSA9IGJ1cy0+bmFtZVswXSA/IGJ1 cy0+bmFtZSA6IHNiX2lzYXBucF9saXN0W3Nsb3RdLm5hbWU7DQogDQotc3Rh dGljIHN0cnVjdCBwY2lfZGV2ICpzYl9pbml0X2FscyhzdHJ1Y3QgcGNpX2J1 cyAqYnVzLCBzdHJ1Y3QgcGNpX2RldiAqY2FyZCwgc3RydWN0IGFkZHJlc3Nf aW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICptcHVfY29u ZmlnKQ0KLXsNCi0JLyogDQotCSAqIEFMUzEwMA0KLQkgKiB2ZXJ5IHNpbWls YXIgdG8gYm90aCBvbmVzIGFib3ZlIGFib3ZlDQotCSAqLw0KKwlwcmludGso S0VSTl9JTkZPICJzYjogJXMgZGV0ZWN0ZWRcbiIsIGJ1c25hbWUpOyANCiAN Ci0JLyogIEBAQDAwMDE6U291bmRibGFzdGVyLg0KLQkgKi8NCisJLyogSW5p dGlhbGl6ZSB0aGlzIGJhYnkuICovDQogDQotCWlmKChzYl9kZXYgPSBpc2Fw bnBfZmluZF9kZXYoYnVzLA0KLQkJCQlJU0FQTlBfVkVORE9SKCdAJywnQCcs J0AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAwMSksIE5VTEwpKSkNCi0Jew0K LQkJc2JfZGV2LT5wcmVwYXJlKHNiX2Rldik7DQorCWlmKHNiX2luaXQoYnVz LCBod19jb25maWcsIG1wdV9jb25maWcsIHNsb3QsIGNhcmQpKSB7DQorCQkv KiBXZSBnb3QgaXQuICovDQogCQkNCi0JCWlmKChzYl9kZXYgPSBhY3RpdmF0 ZV9kZXYoIkFMUzEwMCIsICJzYiIsIHNiX2RldikpKQ0KLQkJew0KLQkJCWh3 X2NvbmZpZy0+aW9fYmFzZSAJPSBzYl9kZXYtPnJlc291cmNlWzBdLnN0YXJ0 Ow0KLQkJCWh3X2NvbmZpZy0+aXJxIAkJPSBzYl9kZXYtPmlycV9yZXNvdXJj ZVswXS5zdGFydDsNCi0JCQlod19jb25maWctPmRtYSAJCT0gc2JfZGV2LT5k bWFfcmVzb3VyY2VbMV0uc3RhcnQ7DQotCQkJaHdfY29uZmlnLT5kbWEyIAk9 IHNiX2Rldi0+ZG1hX3Jlc291cmNlWzBdLnN0YXJ0Ow0KLQ0KLQkJCXNob3df YmFzZSgiQUxTMTAwIiwgInNiIiwgJnNiX2Rldi0+cmVzb3VyY2VbMF0pOw0K LQkJfQ0KLQ0KLQkJaWYoIXNiX2RldikgcmV0dXJuKE5VTEwpOw0KLQl9DQot CWVsc2UNCi0JCXByaW50ayhLRVJOX0VSUiAic2I6IEFMUzEwMCBwYW5pYzog c2IgYmFzZSBub3QgZm91bmRcbiIpOw0KLQ0KLQkvKiAgQFhAMDAwMTptcHUN Ci0JICovDQotDQotCWlmKChtcHVfZGV2ID0gaXNhcG5wX2ZpbmRfZGV2KGJ1 cywNCi0JCQkJSVNBUE5QX1ZFTkRPUignQCcsJ1gnLCdAJyksIElTQVBOUF9G VU5DVElPTigweDAwMDEpLCBOVUxMKSkpDQotCXsNCi0JCW1wdV9kZXYtPnBy ZXBhcmUobXB1X2Rldik7DQotDQotCQlpZigobXB1X2RldiA9IGFjdGl2YXRl X2RldigiQUxTMTAwIiwgIm1wdSIsIG1wdV9kZXYpKSkNCi0JCXsNCi0JCQlz aG93X2Jhc2UoIkFMUzEwMCIsICJtcHUiLCAmbXB1X2Rldi0+cmVzb3VyY2Vb MF0pOw0KLQkJCW1wdV9jb25maWctPmlvX2Jhc2UgPSBtcHVfZGV2LT5yZXNv dXJjZVswXS5zdGFydDsNCi0JCX0NCi0JfQ0KLQllbHNlDQotCQlwcmludGso S0VSTl9FUlIgInNiOiBBTFMxMDAgcGFuaWM6IG1wdSBub3QgZm91bmRcbiIp Ow0KLQ0KLQlwcmludGsoS0VSTl9JTkZPICJzYjogQUxTMTAwIG1haWwgcmVw b3J0cyB0byBUb3JzdGVuIFdlcm5lciA8dHdlcm5lckBpbnRlcmNvbW0uZGU+ XG4iKTsNCi0NCi0JcmV0dXJuKHNiX2Rldik7DQotfQ0KLQ0KLSNkZWZpbmUg U0JGX0RFVgkweDAxIC8qIFBsZWFzZSBub3RpY2UgdGhhdCBjYXJkcyB3aXRo b3V0IHRoaXMgZmxhZyBhcmUgb24gdGhlIHRvcCBpbiB0aGUgbGlzdCAqLw0K LQ0KLQ0KLXN0YXRpYyBzdHJ1Y3QgeyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3Is IGZ1bmN0aW9uLCBmbGFnczsgc3RydWN0IHBjaV9kZXYgKiAoKmluaXRmdW5j KShzdHJ1Y3QgcGNpX2J1cyAqLCBzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3Qg YWRkcmVzc19pbmZvICosIHN0cnVjdCBhZGRyZXNzX2luZm8gKik7IGNoYXIg Km5hbWU7IH0NCi1zYl9pc2FwbnBfbGlzdFtdIF9faW5pdGRhdGEgPSB7DQot CXtJU0FQTlBfVkVORE9SKCdDJywnTScsJ0knKSwgSVNBUE5QX0ZVTkNUSU9O KDB4MDAwMSksIDAsCSZzYl9pbml0X2NtaSwJCSJDTUkgODMzMCBTb3VuZFBS TyIgfSwNCi0Je0lTQVBOUF9WRU5ET1IoJ1InLCdXJywnQicpLCBJU0FQTlBf RlVOQ1RJT04oMHgxNjg4KSwgMCwJJnNiX2luaXRfZGlhbW9uZCwJIkRpYW1v bmQgRFQwMTk3SCIgfSwNCi0Je0lTQVBOUF9WRU5ET1IoJ0EnLCdMJywnUycp LCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAxKSwgMCwJJnNiX2luaXRfYWxzLAkJ IkFMUyAxMDAiIH0sDQotCXtJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wnKSwg SVNBUE5QX0ZVTkNUSU9OKDB4MDAwMSksIFNCRl9ERVYsCSZzYl9pbml0X2dl bmVyaWMsCSJTb3VuZCBCbGFzdGVyIDE2IiB9LA0KLQl7SVNBUE5QX1ZFTkRP UignQycsJ1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAwMzEpLCBTQkZf REVWLAkmc2JfaW5pdF9nZW5lcmljLAkiU291bmQgQmxhc3RlciAxNiIgfSwN Ci0Je0lTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQTlBfRlVOQ1RJ T04oMHgwMDQxKSwgU0JGX0RFViwJJnNiX2luaXRfZ2VuZXJpYywJIlNvdW5k IEJsYXN0ZXIgMTYiIH0sDQotCXtJU0FQTlBfVkVORE9SKCdDJywnVCcsJ0wn KSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDA0MiksIFNCRl9ERVYsCSZzYl9pbml0 X2dlbmVyaWMsCSJTb3VuZCBCbGFzdGVyIDE2IiB9LA0KLQl7SVNBUE5QX1ZF TkRPUignQycsJ1QnLCdMJyksIElTQVBOUF9GVU5DVElPTigweDAwNDMpLCBT QkZfREVWLAkmc2JfaW5pdF9nZW5lcmljLAkiU291bmQgQmxhc3RlciAxNiIg fSwNCi0Je0lTQVBOUF9WRU5ET1IoJ0MnLCdUJywnTCcpLCBJU0FQTlBfRlVO Q1RJT04oMHgwMDQ1KSwgU0JGX0RFViwJJnNiX2luaXRfZ2VuZXJpYywJIlNv dW5kIEJsYXN0ZXIgMTYiIH0sDQotCXtJU0FQTlBfVkVORE9SKCdFJywnUycs J1MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDk2OCksIFNCRl9ERVYsCSZzYl9p bml0X2VzcywJCSJFU1MgMTY4OCIgfSwNCi0Je0lTQVBOUF9WRU5ET1IoJ0Un LCdTJywnUycpLCBJU0FQTlBfRlVOQ1RJT04oMHgxODY4KSwgU0JGX0RFViwJ JnNiX2luaXRfZXNzLAkJIkVTUyAxODY4IiB9LA0KLQl7SVNBUE5QX1ZFTkRP UignRScsJ1MnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDg2MTEpLCBTQkZf REVWLAkmc2JfaW5pdF9lc3MsCQkiRVNTIDE4NjgiIH0sDQotCXtJU0FQTlBf VkVORE9SKCdFJywnUycsJ1MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTg2OSks IFNCRl9ERVYsCSZzYl9pbml0X2VzcywJCSJFU1MgMTg2OSIgfSwNCi0Je0lT QVBOUF9WRU5ET1IoJ0UnLCdTJywnUycpLCBJU0FQTlBfRlVOQ1RJT04oMHgx ODc4KSwgU0JGX0RFViwJJnNiX2luaXRfZXNzLAkJIkVTUyAxODc4IiB9LA0K LQl7SVNBUE5QX1ZFTkRPUignRScsJ1MnLCdTJyksIElTQVBOUF9GVU5DVElP TigweDE4NzkpLCBTQkZfREVWLAkmc2JfaW5pdF9lc3MsCQkiRVNTIDE4Nzki IH0sDQotCXswfQ0KLX07DQotDQotc3RhdGljIGludCBfX2luaXQgc2JfaXNh cG5wX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1 Y3QgYWRkcmVzc19pbmZvICptcHVfY29uZmlnLCBzdHJ1Y3QgcGNpX2J1cyAq YnVzLCBzdHJ1Y3QgcGNpX2RldiAqY2FyZCwgaW50IHNsb3QpDQotew0KLQlz dHJ1Y3QgcGNpX2RldiAqaWRldiA9IE5VTEw7DQotDQotCS8qIFlvdSBtaXNz ZWQgdGhlIGluaXQgZnVuYz8gVGhhdCdzIGJhZC4gKi8NCi0JaWYoc2JfaXNh cG5wX2xpc3Rbc2xvdF0uaW5pdGZ1bmMpDQotCXsNCi0JCWNoYXIgKmJ1c25h bWUgPSBidXMtPm5hbWVbMF0gPyBidXMtPm5hbWUgOiBzYl9pc2FwbnBfbGlz dFtzbG90XS5uYW1lOw0KLQ0KLQkJcHJpbnRrKEtFUk5fSU5GTyAic2I6ICVz IGRldGVjdGVkXG4iLCBidXNuYW1lKTsgDQotDQotCQkvKiBJbml0aWFsaXpl IHRoaXMgYmFieS4gKi8NCi0NCi0JCWlmKChpZGV2ID0gc2JfaXNhcG5wX2xp c3Rbc2xvdF0uaW5pdGZ1bmMoYnVzLCBjYXJkLCBod19jb25maWcsIG1wdV9j b25maWcpKSkNCi0JCXsNCi0JCQkvKiBXZSBnb3QgaXQuICovDQotDQotCQkJ cHJpbnRrKEtFUk5fTk9USUNFICJzYjogSVNBUG5QIHJlcG9ydHMgJyVzJyBh dCBpL28gJSN4LCBpcnEgJWQsIGRtYSAlZCwgJWRcbiIsDQotCQkJICAgICAg IGJ1c25hbWUsDQotCQkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdf Y29uZmlnLT5pcnEsIGh3X2NvbmZpZy0+ZG1hLA0KLQkJCSAgICAgICBod19j b25maWctPmRtYTIpOw0KLQkJCXJldHVybiAxOw0KLQkJfQ0KLQkJZWxzZQ0K LQkJCXByaW50ayhLRVJOX0lORk8gInNiOiBGYWlsZWQgdG8gaW5pdGlhbGl6 ZSAlc1xuIiwgYnVzbmFtZSk7DQorCQlwcmludGsoS0VSTl9OT1RJQ0UgInNi OiBJU0FQblAgcmVwb3J0cyAnJXMnIGF0IGkvbyAlI3gsIGlycSAlZCwgZG1h ICVkLCAlZFxuIiwNCisJCSAgICAgICBidXNuYW1lLA0KKwkJICAgICAgIGh3 X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZy0+ ZG1hLA0KKwkJICAgICAgIGh3X2NvbmZpZy0+ZG1hMik7DQorCQlyZXR1cm4g MTsNCiAJfQ0KIAllbHNlDQotCQlwcmludGsoS0VSTl9FUlIgInNiOiBCYWQg ZW50cnkgaW4gc2JfY2FyZC5jIFBuUCB0YWJsZVxuIik7DQorCQlwcmludGso S0VSTl9JTkZPICJzYjogRmFpbGVkIHRvIGluaXRpYWxpemUgJXNcbiIsIGJ1 c25hbWUpOw0KIA0KIAlyZXR1cm4gMDsNCiB9DQogDQotLyogQWN0dWFsbHkg dGhpcyByb3V0aW5lIHdpbGwgZGV0ZWN0IGFuZCBjb25maWd1cmUgb25seSB0 aGUgZmlyc3QgY2FyZCB3aXRoIHN1Y2Nlc3NmdWwNCi0gICBpbml0aWFsaXph dGlvbi4gaXNhcG5wanVtcCBjb3VsZCBiZSB1c2VkIHRvIGp1bXAgdG8gYSBz cGVjaWZpYyBlbnRyeS4NCi0gICBQbGVhc2UgYWx3YXlzIGFkZCBlbnRyaWVz IGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5Lg0KLSAgIFNob3VsZCB0aGlzIGJl IGZpeGVkPyAtIGF6dW1tbw0KLSovDQotDQotaW50IF9faW5pdCBzYl9pc2Fw bnBfcHJvYmUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1 Y3QgYWRkcmVzc19pbmZvICptcHVfY29uZmlnKSANCitpbnQgX19pbml0IHNi X2lzYXBucF9wcm9iZShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcs IHN0cnVjdCBhZGRyZXNzX2luZm8gKm1wdV9jb25maWcsIGludCBjYXJkKSAN CiB7DQorCXN0YXRpYyBpbnQgZmlyc3QgPSAxOw0KIAlpbnQgaTsNCiANCiAJ LyogQ291bnQgZW50cmllcyBpbiBzYl9pc2FwbnBfbGlzdCAqLw0KLQlmb3Ig KGkgPSAwOyBzYl9pc2FwbnBfbGlzdFtpXS52ZW5kb3IgIT0gMDsgaSsrKTsN CisJZm9yIChpID0gMDsgc2JfaXNhcG5wX2xpc3RbaV0uY2FyZF92ZW5kb3Ig IT0gMDsgaSsrKTsNCisJaS0tOw0KIA0KIAkvKiBDaGVjayBhbmQgYWRqdXN0 IGlzYXBucGp1bXAgKi8NCi0JaWYoIGlzYXBucGp1bXAgPCAwIHx8IGlzYXBu cGp1bXAgPiAoIGkgLSAxICkgKQ0KLQl7DQotCQlwcmludGsoS0VSTl9FUlIg InNiOiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiBBZGp1 c3RlZCB0byAwLlxuIiwgaS0xKTsNCi0JCWlzYXBucGp1bXAgPSAwOw0KKwlp ZiggaXNhcG5wanVtcCA8IDAgfHwgaXNhcG5wanVtcCA+IGkpIHsNCisJCWlz YXBucGp1bXAgPSByZXZlcnNlID8gaSA6IDA7DQorCQlwcmludGsoS0VSTl9F UlIgInNiOiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiBB ZGp1c3RlZCB0byAlZC5cbiIsIGksIGlzYXBucGp1bXApOw0KIAl9DQotCQ0K LQlmb3IgKGkgPSBpc2FwbnBqdW1wOyBzYl9pc2FwbnBfbGlzdFtpXS52ZW5k b3IgIT0gMDsgaSsrKSB7DQogDQotCQlpZighKHNiX2lzYXBucF9saXN0W2ld LmZsYWdzICYgU0JGX0RFVikpDQotCQl7DQotCQkJc3RydWN0IHBjaV9idXMg KmJ1cyA9IE5VTEw7DQotCQkJCQ0KLQkJCXdoaWxlICgoYnVzID0gaXNhcG5w X2ZpbmRfY2FyZCgNCi0JCQkJCXNiX2lzYXBucF9saXN0W2ldLnZlbmRvciwN Ci0JCQkJCXNiX2lzYXBucF9saXN0W2ldLmZ1bmN0aW9uLA0KLQkJCQkJYnVz KSkpIHsNCisJaWYoIWZpcnN0IHx8ICFyZXZlcnNlKQ0KKwkJaSA9IGlzYXBu cGp1bXA7DQorCWZpcnN0ID0gMDsNCisJd2hpbGUoc2JfaXNhcG5wX2xpc3Rb aV0uY2FyZF92ZW5kb3IgIT0gMCkgew0KKwkJc3RhdGljIHN0cnVjdCBwY2lf YnVzICpidXMgPSBOVUxMOw0KKw0KKwkJd2hpbGUgKChidXMgPSBpc2FwbnBf ZmluZF9jYXJkKA0KKwkJCQlzYl9pc2FwbnBfbGlzdFtpXS5jYXJkX3ZlbmRv ciwNCisJCQkJc2JfaXNhcG5wX2xpc3RbaV0uY2FyZF9kZXZpY2UsDQorCQkJ CWJ1cykpKSB7DQogCQ0KLQkJCQlpZihzYl9pc2FwbnBfaW5pdChod19jb25m aWcsIG1wdV9jb25maWcsIGJ1cywgTlVMTCwgaSkpDQotCQkJCQlyZXR1cm4g MDsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyogIE5vIGNhcmRzIGZvdW5k LiBJJ2xsIHRyeSBub3cgdG8gc2VhcmNoIGluc2lkZSBldmVyeSBjYXJkIGZv ciBhIGxvZ2ljYWwgZGV2aWNlDQotCSAqICB0aGF0IG1hdGNoZXMgYW55IGVu dHJ5IG1hcmtlZCB3aXRoIFNCRl9ERVYgaW4gdGhlIHRhYmxlLg0KLQkgKi8N Ci0NCi0JZm9yIChpID0gaXNhcG5wanVtcDsgc2JfaXNhcG5wX2xpc3RbaV0u dmVuZG9yICE9IDA7IGkrKykgew0KLQ0KLQkJaWYoc2JfaXNhcG5wX2xpc3Rb aV0uZmxhZ3MgJiBTQkZfREVWKQ0KLQkJew0KLQkJCXN0cnVjdCBwY2lfZGV2 ICpjYXJkID0gTlVMTDsNCi0NCi0JCQl3aGlsZSAoKGNhcmQgPSBpc2FwbnBf ZmluZF9kZXYoTlVMTCwNCi0JCQkJCXNiX2lzYXBucF9saXN0W2ldLnZlbmRv ciwNCi0JCQkJCXNiX2lzYXBucF9saXN0W2ldLmZ1bmN0aW9uLA0KLQkJCQkJ Y2FyZCkpKSB7DQotDQotCQkJCWlmKHNiX2lzYXBucF9pbml0KGh3X2NvbmZp ZywgbXB1X2NvbmZpZywgY2FyZC0+YnVzLCBjYXJkLCBpKSkNCi0JCQkJCXJl dHVybiAwOw0KKwkJCWlmKHNiX2lzYXBucF9pbml0KGh3X2NvbmZpZywgbXB1 X2NvbmZpZywgYnVzLCBpLCBjYXJkKSkgew0KKwkJCQlpc2FwbnBqdW1wID0g aTsgLyogc3RhcnQgbmV4dCBzZWFyY2ggZnJvbSBoZXJlICovDQorCQkJCXJl dHVybiAwOw0KIAkJCX0NCiAJCX0NCisJCWkgKz0gcmV2ZXJzZSA/IC0xIDog MTsJCQ0KIAl9DQogDQogCXJldHVybiAtRU5PREVWOw0KQEAgLTU1MSw2MiAr NTM5LDc3IEBADQogDQogc3RhdGljIGludCBfX2luaXQgaW5pdF9zYih2b2lk KQ0KIHsNCi0JcHJpbnRrKEtFUk5fSU5GTyAiU291bmRibGFzdGVyIGF1ZGlv IGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5 My0xOTk2XG4iKTsNCisJaW50IGNhcmQsIG1heCA9IG11bHRpcGxlID8gU0Jf Q0FSRFNfTUFYIDogMTsNCiANCi0JLyogUGxlYXNlIHJlbWVtYmVyIHRoYXQg ZXZlbiB3aXRoIENPTkZJR19JU0FQTlAgZGVmaW5lZCBvbmUgc2hvdWxkIHN0 aWxsIGJlDQotCQlhYmxlIHRvIGRpc2FibGUgUE5QIHN1cHBvcnQgZm9yIHRo aXMgc2luZ2xlIGRyaXZlciENCi0JKi8NCi0NCi0jaWYgZGVmaW5lZCBDT05G SUdfSVNBUE5QIHx8IGRlZmluZWQgQ09ORklHX0lTQVBOUF9NT0RVTEUJCQkN Ci0JaWYoaXNhcG5wICYmIChzYl9pc2FwbnBfcHJvYmUoJmNmZywgJmNmZ19t cHUpIDwgMCkgKSB7DQotCQlwcmludGsoS0VSTl9OT1RJQ0UgInNiX2NhcmQ6 IE5vIElTQVBuUCBjYXJkcyBmb3VuZCwgdHJ5aW5nIHN0YW5kYXJkIG9uZXMu Li5cbiIpOw0KLQkJaXNhcG5wID0gMDsNCi0JfQ0KKwlwcmludGsoS0VSTl9J TkZPICJTb3VuZGJsYXN0ZXIgYXVkaW8gZHJpdmVyIENvcHlyaWdodCAoQykg YnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOw0KKwkNCisJZm9y KGNhcmQgPSAwOyBjYXJkIDwgbWF4OyBjYXJkKyssIHNiX2NhcmRzX251bSsr KSB7DQorI2lmIGRlZmluZWQgQ09ORklHX0lTQVBOUCB8fCBkZWZpbmVkIENP TkZJR19JU0FQTlBfTU9EVUxFDQorCQkvKiBQbGVhc2UgcmVtZW1iZXIgdGhh dCBldmVuIHdpdGggQ09ORklHX0lTQVBOUCBkZWZpbmVkIG9uZSBzaG91bGQg c3RpbGwgYmUNCisJCSAgIGFibGUgdG8gZGlzYWJsZSBQTlAgc3VwcG9ydCBm b3IgdGhpcyBzaW5nbGUgZHJpdmVyISAqLw0KKwkJaWYoaXNhcG5wICYmIChz Yl9pc2FwbnBfcHJvYmUoJmNmZ1tjYXJkXSwgJmNmZ19tcHVbY2FyZF0sIGNh cmQpIDwgMCkgKSB7DQorCQkJaWYoc2JfY2FyZHNfbnVtID09IDApIHsNCisJ CQkJcHJpbnRrKEtFUk5fTk9USUNFICJzYl9jYXJkOiBObyBJU0FQblAgY2Fy ZHMgZm91bmQsIHRyeWluZyBzdGFuZGFyZCBvbmVzLi4uXG4iKTsNCisJCQkJ aXNhcG5wID0gMDsNCisJCQl9IGVsc2UNCisJCQkJYnJlYWs7DQorCQl9DQog I2VuZGlmDQogDQotCWlmKCBpc2FwbnAgPT0gMCApIHsNCi0JCWNmZy5pb19i YXNlCT0gaW87DQotCQljZmcuaXJxCQk9IGlycTsNCi0JCWNmZy5kbWEJCT0g ZG1hOw0KLQkJY2ZnLmRtYTIJPSBkbWExNjsNCi0JfQ0KKwkJaWYoIGlzYXBu cCA9PSAwICYmIHNiX2NhcmRzX251bSA9PSAwKSB7DQorCQkJY2ZnW2NhcmRd LmlvX2Jhc2UJPSBpbzsNCisJCQljZmdbY2FyZF0uaXJxCQk9IGlycTsNCisJ CQljZmdbY2FyZF0uZG1hCQk9IGRtYTsNCisJCQljZmdbY2FyZF0uZG1hMgk9 IGRtYTE2Ow0KKwkJfQ0KIA0KLQljZmcuY2FyZF9zdWJ0eXBlID0gdHlwZTsN CisJCWNmZ1tjYXJkXS5jYXJkX3N1YnR5cGUgPSB0eXBlOw0KIA0KLQlpZiAo IXByb2JlX3NiKCZjZmcpKQ0KLQkJcmV0dXJuIC1FTk9ERVY7DQotCWF0dGFj aF9zYl9jYXJkKCZjZmcpOw0KKwkJaWYgKCFwcm9iZV9zYigmY2ZnW2NhcmRd KSkNCisJCQlyZXR1cm4gLUVOT0RFVjsNCisJCWF0dGFjaF9zYl9jYXJkKCZj ZmdbY2FyZF0pOw0KIA0KLQlpZihjZmcuc2xvdHNbMF09PS0xKQ0KLQkJcmV0 dXJuIC1FTk9ERVY7DQorCQlpZihjZmdbY2FyZF0uc2xvdHNbMF09PS0xKQ0K KwkJCXJldHVybiAtRU5PREVWOw0KIAkJDQotCWlmIChpc2FwbnAgPT0gMCkg DQotCQljZmdfbXB1LmlvX2Jhc2UgPSBtcHVfaW87DQotCWlmIChwcm9iZV9z Ym1wdSgmY2ZnX21wdSkpDQotCQlzYm1wdSA9IDE7DQotCWlmIChzYm1wdSkN Ci0JCWF0dGFjaF9zYm1wdSgmY2ZnX21wdSk7DQorCQlpZiAoaXNhcG5wID09 IDApIA0KKwkJCWNmZ19tcHVbY2FyZF0uaW9fYmFzZSA9IG1wdV9pbzsNCisJ CWlmIChwcm9iZV9zYm1wdSgmY2ZnX21wdVtjYXJkXSkpDQorCQkJc2JtcHVb Y2FyZF0gPSAxOw0KKwkJaWYgKHNibXB1W2NhcmRdKQ0KKwkJCWF0dGFjaF9z Ym1wdSgmY2ZnX21wdVtjYXJkXSk7DQorCX0NCisNCisJU09VTkRfTE9DSzsN CisNCisJaWYoaXNhcG5wKQ0KKwkJcHJpbnRrKEtFUk5fTk9USUNFICJzYl9j YXJkOiAlZCBTb3VuZGJsYXN0ZXIgUG5QIGNhcmQocykgZm91bmQuXG4iLCBz Yl9jYXJkc19udW0pOw0KKw0KIAlyZXR1cm4gMDsNCiB9DQogDQogc3RhdGlj IHZvaWQgX19leGl0IGNsZWFudXBfc2Iodm9pZCkNCiB7DQorCWludCBpOw0K KwkNCiAJaWYgKHNtd19mcmVlKSB7DQogCQl2ZnJlZShzbXdfZnJlZSk7DQog CQlzbXdfZnJlZSA9IE5VTEw7DQogCX0NCi0JdW5sb2FkX3NiKCZjZmcpOw0K LQlpZiAoc2JtcHUpDQotCQl1bmxvYWRfc2JtcHUoJmNmZ19tcHUpOw0KLQlT T1VORF9MT0NLX0VORDsNCiANCi0jaWYgZGVmaW5lZCBDT05GSUdfSVNBUE5Q IHx8IGRlZmluZWQgQ09ORklHX0lTQVBOUF9NT0RVTEUJCQkNCi0JaWYoYWN0 aXZhdGVkKQ0KLQl7DQotCQlpZihzYl9kZXYpIAlzYl9kZXYtPmRlYWN0aXZh dGUoc2JfZGV2KTsNCi0JCWlmKG1wdV9kZXYpIAltcHVfZGV2LT5kZWFjdGl2 YXRlKG1wdV9kZXYpOw0KLQl9DQorCWZvcihpID0gMDsgaSA8IHNiX2NhcmRz X251bTsgaSsrKSB7DQorCQl1bmxvYWRfc2IoJmNmZ1tpXSwgaSk7DQorCQlp ZiAoc2JtcHVbaV0pDQorCQkJdW5sb2FkX3NibXB1KCZjZmdfbXB1W2ldKTsN CisNCisjaWYgZGVmaW5lZCBDT05GSUdfSVNBUE5QIHx8IGRlZmluZWQgQ09O RklHX0lTQVBOUF9NT0RVTEUNCisJCWlmKCFhY3RpdmF0ZWRbaV0pIHsNCisJ CQlpZihzYl9kZXZbaV0pIAlzYl9kZXZbaV0tPmRlYWN0aXZhdGUoc2JfZGV2 W2ldKTsNCisJCQlpZihtcHVfZGV2W2ldKSAJbXB1X2RldltpXS0+ZGVhY3Rp dmF0ZShtcHVfZGV2W2ldKTsNCisJCX0NCiAjZW5kaWYNCisJfQ0KKwlTT1VO RF9MT0NLX0VORDsJDQogfQ0KIA0KIG1vZHVsZV9pbml0KGluaXRfc2IpOw0K --1199987260-1627779519-954233626=:4292--