From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [[PATCH] 8/9] DMA-UART-Driver-for-AST2500 From: "sudheer.v" Message-Id: <1539749466-3912-9-git-send-email-open.sudheer@gmail.com> Date: Wed, 17 Oct 2018 09:41:05 +0530 To: Vinod Koul , Rob Herring , Mark Rutland , Greg Kroah-Hartman , Joel Stanley , Andrew Jeffery , Russell King , Dan Williams , Jiri Slaby , Thomas Gleixner , Marc Zyngier , Benjamin Herrenschmidt , Christian Borntraeger , Michael Moese , Hendrik Brueckner , Kate Stewart , Philippe Ombredanne , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org Cc: "sudheer.v" , Sudheer V , ShivahShankar Shakarnarayan rao List-ID: U2lnbmVkLW9mZi1ieTogc3VkaGVlci52IDxvcGVuLnN1ZGhlZXJAZ21haWwuY29tPgotLS0KIGRy aXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfYXNwZWVkX3VhcnRfZG1hLmMgfCAxNTk0ICsrKysr KysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQsIDE1OTQgaW5zZXJ0aW9ucygrKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfYXNwZWVkX3Vh cnRfZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2FzcGVl ZF91YXJ0X2RtYS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9hc3BlZWRfdWFydF9k bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAxOWE4Ci0tLSAvZGV2 L251bGwKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9hc3BlZWRfdWFydF9kbWEu YwpAQCAtMCwwICsxLDE1OTQgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w CisvKgorICogICBkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2FzcGVlZF91YXJ0X2RtYS5j CisgKiAgICAxLiAyMDE4LzA3LzAxIFNoaXZhaCBTaGFua2FyIGNyZWF0ZWQKKyAqICAgIDIuIDIw MTgvMDgvMjUgc3VkaGVlci52ZWxpc2V0aTxvcGVuLnN1ZGhlZXJAZ21haWwuY29tPiBtb2RpZmll ZAorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21v ZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgv aW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlPGxpbnV4L3NsYWIu aD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNl Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4K KyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2Nv cmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxf ODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+ CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRl IDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICI4MjUwLmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1h cHBpbmcuaD4KKyNkZWZpbmUgU0RNQV9SWF9CVUZGX1NJWkUgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMHgxMDAwMCAvLzY1NTM2CisjZGVmaW5lIERNQV9CVUZGX1NJWkUgICAgICAgICAg ICAgICAgICAgICAgICAgICAweDEwMDAgIC8vNDA5NgorCisKKworCisjdW5kZWYgVUFSVF9YTUlU X1NJWkUKKyNkZWZpbmUgVUFSVF9YTUlUX1NJWkUJMHgxMDAwCisjZGVmaW5lIFVBUlRfUlhfU0la RQkweDEwMDAwCisKKyNpZmRlZiBVQVJUX0RNQV9ERUJVRworCSNkZWZpbmUgVUFSVF9EQkcoZm10 LCBhcmdzLi4uKSBwcl9kZWJ1ZygiJXMoKSAiIGZtdCwgX19mdW5jX18sICMjIGFyZ3MpCisjZWxz ZQorCSNkZWZpbmUgVUFSVF9EQkcoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBDT05G SUdfVUFSVF9UWF9ETUFfREVCVUcKKwkjZGVmaW5lIFVBUlRfVFhfREJHKGZtdCwgYXJncy4uLikg cHJfZGVidWcoIiVzKCkiZm10LCBfX2Z1bmNfXywgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBV QVJUX1RYX0RCRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyoKKyAqIENvbmZpZ3VyYXRpb246 CisgKiAgIHNoYXJlX2lycXMgLSB3aGV0aGVyIHdlIHBhc3MgSVJRRl9TSEFSRUQgdG8gcmVxdWVz dF9pcnEoKS4gIFRoaXMgb3B0aW9uCisgKiAgICAgICAgICAgICAgICBpcyB1bnNhZmUgd2hlbiB1 c2VkIG9uIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBp bnQgc2hhcmVfaXJxcyA9IFNFUklBTDgyNTBfU0hBUkVfSVJRUzsKKworc3RhdGljIHVuc2lnbmVk IGludCBucl91YXJ0cyA9IENPTkZJR19BU1RfUlVOVElNRV9ETUFfVUFSVFM7CisKKy8qCisgKiBE ZWJ1Z2dpbmcuCisgKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHX0FVVE9DT05GKGZtdC4uLikJVUFS VF9EQkcoZm10KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfQVVUT0NPTkYoZm10Li4uKQlkbyB7IH0g d2hpbGUgKDApCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUgREVCVUdfSU5UUihmbXQuLi4pCVVB UlRfREJHKGZtdCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0lOVFIoZm10Li4uKQlkbyB7IH0gd2hp bGUgKDApCisjZW5kaWYKKworI2RlZmluZSBQQVNTX0xJTUlUCTI1NgorCisjaW5jbHVkZSA8YXNt L3NlcmlhbC5oPgorCisKKyNkZWZpbmUgVUFSVF9ETUFfTlIJCUNPTkZJR19BU1RfTlJfRE1BX1VB UlRTCisKK3N0cnVjdCBhc3RfdWFydF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CisJ c3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKwl1bnNpZ25lZCBzaG9ydAkJY2FwYWJpbGl0 aWVzOwkvKiBwb3J0IGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIHNob3J0CQlidWdzOwkJLyog cG9ydCBidWdzICovCisJdW5zaWduZWQgaW50CQl0eF9sb2Fkc3o7CS8qIHRyYW5zbWl0IGZpZm8g bG9hZCBzaXplICovCisJdW5zaWduZWQgY2hhcgkJYWNyOworCXVuc2lnbmVkIGNoYXIJCWllcjsK Kwl1bnNpZ25lZCBjaGFyCQlsY3I7CisJdW5zaWduZWQgY2hhcgkJbWNyOworCXVuc2lnbmVkIGNo YXIJCW1jcl9tYXNrOwkvKiBtYXNrIG9mIHVzZXIgYml0cyAqLworCXVuc2lnbmVkIGNoYXIJCW1j cl9mb3JjZTsJLyogbWFzayBvZiBmb3JjZWQgYml0cyAqLworCXVuc2lnbmVkIGludAkJY2hhbm5l bF9ubzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJcnhfc2dsOworCXN0cnVjdCBkbWFfY2hhbgkJKnJ4 X2RtYV9jaGFuOworCXN0cnVjdCBjaXJjX2J1ZgkJcnhfZG1hX2J1ZjsKKwlkbWFfYWRkcl90CQlk bWFfcnhfYWRkcjsKKwl1OAkJCXJ4X2luX3Byb2dyZXNzOworCXN0cnVjdCBkbWFfYXN5bmNfdHhf ZGVzY3JpcHRvcgkJKnJ4X2RtYV9kZXNjOworCWRtYV9jb29raWVfdAkJcnhfY29va2llOworCXVu c2lnbmVkIGludAkJcnhfYnl0ZXNfcmVxdWVzdGVkOworCXVuc2lnbmVkIGludAkJcnhfYnl0ZXNf dHJhbnNmZXJyZWQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXJ4X3Rhc2tsZXQ7CisJc3RydWN0 IHNjYXR0ZXJsaXN0CXR4X3NnbDsKKwlzdHJ1Y3QgZG1hX2NoYW4JCSp0eF9kbWFfY2hhbjsKKwlz dHJ1Y3QgY2lyY19idWYJCXR4X2RtYV9idWY7CisJZG1hX2FkZHJfdAkJZG1hX3R4X2FkZHI7CisJ dTgJCQl0eF9pbl9wcm9ncmVzczsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJCSp0 eF9kbWFfZGVzYzsKKwlkbWFfY29va2llX3QJCXR4X2Nvb2tpZTsKKwl1bnNpZ25lZCBpbnQJCXR4 X2J5dGVzX3JlcXVlc3RlZDsKKwl1bnNpZ25lZCBpbnQJCXR4X2J5dGVzX3RyYW5zZmVycmVkOwor CXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0eF90YXNrbGV0OworCXNwaW5sb2NrX3QgbG9jazsKKwlp bnQJCQl0eF9kb25lOworCWludAkJCXR4X2NvdW50OworCS8qCisJICogU29tZSBiaXRzIGluIHJl Z2lzdGVycyBhcmUgY2xlYXJlZCBvbiBhIHJlYWQsIHNvIHRoZXkgbXVzdAorCSAqIGJlIHNhdmVk IHdoZW5ldmVyIHRoZSByZWdpc3RlciBpcyByZWFkIGJ1dCB0aGUgYml0cyB3aWxsIG5vdAorCSAq IGJlIGltbWVkaWF0ZWx5IHByb2Nlc3NlZC4KKwkgKi8KKyNkZWZpbmUgTFNSX1NBVkVfRkxBR1Mg VUFSVF9MU1JfQlJLX0VSUk9SX0JJVFMKKwl1bnNpZ25lZCBjaGFyCQlsc3Jfc2F2ZWRfZmxhZ3M7 CisjZGVmaW5lIE1TUl9TQVZFX0ZMQUdTIFVBUlRfTVNSX0FOWV9ERUxUQQorCXVuc2lnbmVkIGNo YXIJCW1zcl9zYXZlZF9mbGFnczsKKworCS8qCisJICogV2UgcHJvdmlkZSBhIHBlci1wb3J0IHBt IGhvb2suCisJICovCisJdm9pZAkJCSgqcG0pKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJ ICAgICAgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkKTsKK307CisKK3N0YXRp YyBzdHJ1Y3QgYXN0X3VhcnRfcG9ydCBhc3RfdWFydF9wb3J0c1tVQVJUX0RNQV9OUl07CisKK3N0 YXRpYyBpbnQgYXN0X2RtYV9jaGFubmVsX3NldHVwKHN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCk7 CitzdGF0aWMgaW5saW5lIHN0cnVjdCBhc3RfdWFydF9wb3J0ICoKK3RvX2FzdF9kbWFfdWFydF9w b3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVhcnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih1YXJ0 LCBzdHJ1Y3QgYXN0X3VhcnRfcG9ydCwgcG9ydCk7Cit9CisKK3N0cnVjdCBpcnFfaW5mbyB7CisJ c3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXA7Cit9OworCitzdGF0 aWMgdm9pZCBhc3RfZG1hX2NoYW5uZWxfdGVhcmRvd24oc3RydWN0IGFzdF91YXJ0X3BvcnQgKnMp Oworc3RhdGljIHN0cnVjdCBpcnFfaW5mbyBhc3RfdWFydF9pcnFbMV07CitzdGF0aWMgREVGSU5F X01VVEVYKGFzdF91YXJ0X211dGV4KTsKKworLyoKKyAqIEhlcmUgd2UgZGVmaW5lIHRoZSBkZWZh dWx0IHhtaXQgZmlmbyBzaXplIHVzZWQgZm9yIGVhY2ggdHlwZSBvZiBVQVJULgorICovCitzdGF0 aWMgY29uc3Qgc3RydWN0IHNlcmlhbDgyNTBfY29uZmlnIHVhcnRfY29uZmlnW10gPSB7CisJW1BP UlRfVU5LTk9XTl0gPSB7CisJCS5uYW1lCQk9ICJ1bmtub3duIiwKKwkJLmZpZm9fc2l6ZQk9IDEs CisJCS50eF9sb2Fkc3oJPSAxLAorCX0sCisJW1BPUlRfODI1MF0gPSB7CisJCS5uYW1lCQk9ICI4 MjUwIiwKKwkJLmZpZm9fc2l6ZQk9IDEsCisJCS50eF9sb2Fkc3oJPSAxLAorCX0sCisJW1BPUlRf MTY0NTBdID0geworCQkubmFtZQkJPSAiMTY0NTAiLAorCQkuZmlmb19zaXplCT0gMSwKKwkJLnR4 X2xvYWRzegk9IDEsCisJfSwKKwlbUE9SVF8xNjU1MF0gPSB7CisJCS5uYW1lCQk9ICIxNjU1MCIs CisJCS5maWZvX3NpemUJPSAxLAorCQkudHhfbG9hZHN6CT0gMSwKKwl9LAorCVtQT1JUXzE2NTUw QV0gPSB7CisJCS5uYW1lCQk9ICIxNjU1MEEiLAorCQkuZmlmb19zaXplCT0gMTYsCisJCS50eF9s b2Fkc3oJPSAxNiwKKwkJLmZjcgkJPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1Jf VFJJR18xMAorCQkJCQkJCXwgVUFSVF9GQ1JfRE1BX1NFTEVDVCwKKwkJLmZsYWdzCQk9IFVBUlRf Q0FQX0ZJRk8sCisJfSwKK307CisKKy8qIHNhbmUgaGFyZHdhcmUgbmVlZHMgbm8gbWFwcGluZyAq LworI2RlZmluZSBtYXBfODI1MF9pbl9yZWcodXAsIG9mZnNldCkgKG9mZnNldCkKKyNkZWZpbmUg bWFwXzgyNTBfb3V0X3JlZyh1cCwgb2Zmc2V0KSAob2Zmc2V0KQorCitzdGF0aWMgdm9pZCBhc3Rf dWFydF91bnJlZ2lzdGVyX3BvcnQoaW50IGxpbmUpOworc3RhdGljIGludCBhc3RfdWFydF9yZWdp c3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJCXVuc2lnbmVkIGludCBjaGFu bmVsX25vKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBhc3Rfc2VyaWFsX2luKHN0cnVjdCBhc3Rf dWFydF9wb3J0ICp1cCwgaW50IG9mZnNldCkKK3sKKwlvZmZzZXQgPSBtYXBfODI1MF9pbl9yZWco dXAsIG9mZnNldCkgPDwgdXAtPnBvcnQucmVnc2hpZnQ7CisKKwkJcmV0dXJuIHJlYWRiKHVwLT5w b3J0Lm1lbWJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZAorYXN0X3NlcmlhbF9vdXQo c3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJLyog U2F2ZSB0aGUgb2Zmc2V0IGJlZm9yZSBpdCdzIHJlbWFwcGVkICovCisJb2Zmc2V0ID0gbWFwXzgy NTBfb3V0X3JlZyh1cCwgb2Zmc2V0KSA8PCB1cC0+cG9ydC5yZWdzaGlmdDsKKworCQl3cml0ZWIo dmFsdWUsIHVwLT5wb3J0Lm1lbWJhc2UgKyBvZmZzZXQpOworfQorCisKKy8qCisgKiBXZSB1c2Vk IHRvIHN1cHBvcnQgdXNpbmcgcGF1c2UgSS9PIGZvciBjZXJ0YWluIG1hY2hpbmVzLiAgV2UKKyAq IGhhdmVuJ3Qgc3VwcG9ydGVkIHRoaXMgZm9yIGEgd2hpbGUsIGJ1dCBqdXN0IGluIGNhc2UgaXQn cyBiYWRseQorICogbmVlZGVkIGZvciBjZXJ0YWluIG9sZCAzODYgbWFjaGluZXMsIEkndmUgbGVm dCB0aGVzZSAjZGVmaW5lJ3MKKyAqIGluLi4uLgorICovCisjZGVmaW5lIHNlcmlhbF9pbnAodXAs IG9mZnNldCkJCWFzdF9zZXJpYWxfaW4odXAsIG9mZnNldCkKKyNkZWZpbmUgc2VyaWFsX291dHAo dXAsIG9mZnNldCwgdmFsdWUpCWFzdF9zZXJpYWxfb3V0KHVwLCBvZmZzZXQsIHZhbHVlKQorCisv KiBVYXJ0IGRpdmlzb3IgbGF0Y2ggcmVhZCAqLworc3RhdGljIGlubGluZSBpbnQgX3NlcmlhbF9k bF9yZWFkKHN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCkKK3sKKwlyZXR1cm4gc2VyaWFsX2lucCh1 cCwgVUFSVF9ETEwpIHwgc2VyaWFsX2lucCh1cCwgVUFSVF9ETE0pIDw8IDg7Cit9CisKKy8qIFVh cnQgZGl2aXNvciBsYXRjaCB3cml0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIF9zZXJpYWxfZGxf d3JpdGUoc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwLCBpbnQgdmFsdWUpCit7CisJc2VyaWFsX291 dHAodXAsIFVBUlRfRExMLCB2YWx1ZSAmIDB4ZmYpOworCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0RM TSwgdmFsdWUgPj4gOCAmIDB4ZmYpOworfQorCisjZGVmaW5lIHNlcmlhbF9kbF9yZWFkKHVwKSBf c2VyaWFsX2RsX3JlYWQodXApCisjZGVmaW5lIHNlcmlhbF9kbF93cml0ZSh1cCwgdmFsdWUpIF9z ZXJpYWxfZGxfd3JpdGUodXAsIHZhbHVlKQorCitzdGF0aWMgdm9pZCBhc3RfdWFydF90eF9kbWFf Y29tcGxldGUodm9pZCAqYXJncyk7CisKK3N0YXRpYyBpbnQgYXN0X3VhcnRfc3RhcnRfdHhfZG1h KHN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCwKKwkJdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlz dHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmdXAtPnBvcnQuc3RhdGUtPnhtaXQ7CisJZG1hX2FkZHJf dCB0eF9waHlzX2FkZHI7CisKKwlVQVJUX0RCRygiRW50ZXJlZCAlcyBjb3VudCBpcyAlZFxuIiwg X19mdW5jX18sIGNvdW50KTsKKwlVQVJUX0RCRygidXAtPnR4X2Nvb2tpZSA9ICVkXG4iLCB1cC0+ dHhfY29va2llKTsKKwlpZiAodXAtPnR4X2Nvb2tpZSA9PSAwKSB7CisJCWRtYV9zeW5jX3Npbmds ZV9mb3JfZGV2aWNlKHVwLT5wb3J0LmRldiwgdXAtPmRtYV90eF9hZGRyLAorCQkJCQkJVUFSVF9Y TUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCXR4X3BoeXNfYWRkciA9IHVwLT5kbWFfdHhfYWRk ciArIHhtaXQtPnRhaWw7CisJVUFSVF9EQkcoIlRyYW5zbWl0IGFkZHJlc3MgaXMgJXggYWN0dWFs IGlzICV4XG4iLCB0eF9waHlzX2FkZHIsCisJCQkJCQkJdXAtPmRtYV90eF9hZGRyKTsKKwl1cC0+ dHhfZG1hX2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUodXAtPnR4X2RtYV9jaGFu LAorCQl0eF9waHlzX2FkZHIsIGNvdW50LCBETUFfTUVNX1RPX0RFViwgRE1BX1BSRVBfSU5URVJS VVBUKTsKKwlpZiAoIXVwLT50eF9kbWFfZGVzYykgeworCQlkZXZfZXJyKHVwLT5wb3J0LmRldiwg Ik5vdCBhYmxlIHRvIGdldCBkZXNjIGZvciBUeFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwor CXVwLT50eF9kbWFfZGVzYy0+Y2FsbGJhY2sgPSBhc3RfdWFydF90eF9kbWFfY29tcGxldGU7CisJ dXAtPnR4X2RtYV9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHVwOworCXVwLT50eF9pbl9wcm9ncmVz cyA9IDE7CisJdXAtPnR4X2J5dGVzX3JlcXVlc3RlZCA9IGNvdW50OworCXVwLT50eF9ieXRlc190 cmFuc2ZlcnJlZCA9IDA7CisJdXAtPnR4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQodXAtPnR4 X2RtYV9kZXNjKTsKKwl9CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcodXAtPnR4X2RtYV9jaGFu KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIGFzdF91YXJ0X3N0YXJ0X25leHRfdHgoc3Ry dWN0IGFzdF91YXJ0X3BvcnQgKnVwKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJc3RydWN0 IGNpcmNfYnVmICp4bWl0ID0gJnVwLT5wb3J0LnN0YXRlLT54bWl0OworCisJY291bnQgPSBDSVJD X0NOVF9UT19FTkQoeG1pdC0+aGVhZCwgeG1pdC0+dGFpbCwgVUFSVF9YTUlUX1NJWkUpOworCWlm IChjb3VudCkKKwkJYXN0X3VhcnRfc3RhcnRfdHhfZG1hKHVwLCBjb3VudCk7Cit9CitzdGF0aWMg dm9pZCBhc3RfdWFydF90eF9zZG1hX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7 CisJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwID0gKChzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqKWRh dGEpOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZ1cC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCVVBUlRfREJHKCJJbiAlcyBieXRlcyB0byBzZW5k IGlzICVkXG4iLCBfX2Z1bmNfXywgQ0lSQ19DTlQoeG1pdC0+aGVhZCwKKwlzcGluX2xvY2tfaXJx c2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCQkJCQkgICAgeG1pdC0+dGFpbCwgVUFSVF9Y TUlUX1NJWkUpKTsKKwlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhdXAtPnR4X2luX3By b2dyZXNzKSB7CisJCVVBUlRfREJHKCJDYWxsaW5nIGFzdF91YXJ0X3N0YXJ0X25leHRfdHhcbiIp OworCQlhc3RfdWFydF9zdGFydF9uZXh0X3R4KHVwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhc3RfdWFydF90 eF9kbWFfY29tcGxldGUodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAg PSBhcmdzOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZ1cC0+cG9ydC5zdGF0ZS0+eG1pdDsK KwlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5z aWduZWQgaW50IGNvdW50OworCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBk bWFlbmdpbmVfdHhfc3RhdHVzKHVwLT50eF9kbWFfY2hhbiwgdXAtPnR4X2Nvb2tpZSwgJnN0YXRl KTsKKwlVQVJUX0RCRygiJXM6c3RhdGUucmVzaWR1ZT0lZFxuIiwgX19mdW5jX18sIHN0YXRlLnJl c2lkdWUpOworCVVBUlRfREJHKCJ1cC0+dHhfYnl0ZXNfcmVxdWVzdGVkPSVkIHVwLT50eF9ieXRl c190cmFuc2ZlcnJlZD0lZFxuIiwKKwkJCSAgICB1cC0+dHhfYnl0ZXNfcmVxdWVzdGVkLCB1cC0+ dHhfYnl0ZXNfdHJhbnNmZXJyZWQpOworCWlmIChzdGF0dXMgPT0gRE1BX0NPTVBMRVRFKSB7CisJ CXVwLT50eF9jb29raWUgPSAwOworCQljb3VudCA9IHVwLT50eF9ieXRlc19yZXF1ZXN0ZWQgLSB1 cC0+dHhfYnl0ZXNfdHJhbnNmZXJyZWQ7CisJCVVBUlRfREJHKCJETUFfQ09NUExFVEU6Ynl0ZXMg dGlsbCBlbmQgb2YgQnVmZmVyPSVkXG4iLCBjb3VudCk7CisJfSBlbHNleworCQljb3VudCA9IHVw LT50eF9ieXRlc19yZXF1ZXN0ZWQgLSBzdGF0ZS5yZXNpZHVlOworCQl1cC0+dHhfYnl0ZXNfdHJh bnNmZXJyZWQgKz0gY291bnQ7CisJCVVBUlRfREJHKCJETUFfbm90X0NPTVBMRVRFOiBjb3VudD0l ZFxuIiwgY291bnQpOworCX0KKwlVQVJUX0RCRygidXAtPnR4X2J5dGVzX3JlcXVlc3RlZD0lZCB1 cC0+dHhfYnl0ZXNfdHJhbnNmZXJyZWQ9JWRcbiIsCisJCQkgICAgdXAtPnR4X2J5dGVzX3JlcXVl c3RlZCwgdXAtPnR4X2J5dGVzX3RyYW5zZmVycmVkKTsKKwlVQVJUX0RCRygieG1pdC0+aGVhZD0l ZCBhbmQgeG1pdC0+dGFpbD0lZFxuIiwgeG1pdC0+aGVhZCwgeG1pdC0+dGFpbCk7CisJYXN5bmNf dHhfYWNrKHVwLT50eF9kbWFfZGVzYyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0Lmxv Y2ssIGZsYWdzKTsKKwl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyBjb3VudCkgJiAoVUFSVF9Y TUlUX1NJWkUgLSAxKTsKKwl1cC0+dHhfaW5fcHJvZ3Jlc3MgPSAwOworCVVBUlRfREJHKCJ1cGRh dGVkIHhtaXQtPmhlYWQ9JWQgYW5kIHhtaXQtPnRhaWw9JWRcbiIsCisJCQkJCSAgICB4bWl0LT5o ZWFkLCB4bWl0LT50YWlsKTsKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBX QUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKCZ1cC0+cG9ydCk7CisJYXN0X3VhcnRf c3RhcnRfbmV4dF90eCh1cCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9j aywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhc3RfdWFydF9yeF9zZG1hX3Rhc2tsZXRfZnVu Yyh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYXN0X3VhcnRfcnhfZG1hX2NvbXBs ZXRlKHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwID0gYXJnczsKKwlz dHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCXN0cnVjdCBjaXJjX2J1ZiAqcnhfcmluZyA9ICZ1 cC0+cnhfZG1hX2J1ZjsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHRlbXAg PSAwOworCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CisKKwlVQVJUX0RCRygibGluZSBbJWRdLGhl YWQgPSAlZCwgbGVuIDogJWRcbiIsCisJCQkJdXAtPnBvcnQubGluZSwgdXAtPnJ4X2RtYV9idWYu aGVhZCwgY291bnQpOworCXN0YXR1cyA9IGRtYWVuZ2luZV90eF9zdGF0dXModXAtPnJ4X2RtYV9j aGFuLCB1cC0+cnhfY29va2llLCAmc3RhdGUpOworCVVBUlRfREJHKCJGcmVlc3BhY2UgaW4gYnVm ZmVyPSVkXG4iLCBzdGF0ZS5yZXNpZHVlKTsKKwlVQVJUX0RCRygidXAtPnJ4X2J5dGVzX3JlcXVl c3RlZD0lZCB1cC0+cnhfYnl0ZXNfdHJhbnNmZXJyZWQ9JWRcbiIsCisJCQkgICAgdXAtPnJ4X2J5 dGVzX3JlcXVlc3RlZCwgdXAtPnJ4X2J5dGVzX3RyYW5zZmVycmVkKTsKKwlpZiAoc3RhdHVzID09 IERNQV9DT01QTEVURSkgeworCQl1cC0+cnhfY29va2llID0gMDsKKwkJY291bnQgPSB1cC0+cnhf Ynl0ZXNfcmVxdWVzdGVkIC0gdXAtPnJ4X2J5dGVzX3RyYW5zZmVycmVkOworCQl1cC0+cnhfaW5f cHJvZ3Jlc3MgPSAwOworCQlVQVJUX0RCRygiRE1BX0NPTVBMRVRFOmJ5dGVzIHRpbGwgZW5kIG9m IEJ1ZmZlcj0lZFxuIiwgY291bnQpOworCX0gZWxzZXsKKwkJdGVtcCA9IHVwLT5yeF9ieXRlc19y ZXF1ZXN0ZWQgLSBzdGF0ZS5yZXNpZHVlOworCQljb3VudCA9IHRlbXAgLSB1cC0+cnhfYnl0ZXNf dHJhbnNmZXJyZWQ7CisJCXVwLT5yeF9ieXRlc190cmFuc2ZlcnJlZCA9IHRlbXA7CisJCVVBUlRf REJHKCJETUFfbm90X0NPTVBMRVRFOmZpbGwgaW5kZXggPSVkXG4iLCB0ZW1wLCBjb3VudCk7CisJ CVVBUlRfREJHKCJieXRlcyB0byBiZSByeGVkIGluIGN1cnJlbnQgbGFwPSVkXG4iLCBjb3VudCk7 CisJCVVBUlRfREJHKCJyeF9ieXRlc190cmFuc2ZyZWQ9JWRcbiIsIHVwLT5yeF9ieXRlc190cmFu c2ZlcnJlZCk7CisJfQorCisJVUFSVF9EQkcoInJ4X3JpbmctPmhlYWQ9JWQgcnhfcmluZy0+dGFp bD0lZFxuIiwKKwkJCQkgICAgcnhfcmluZy0+aGVhZCwgcnhfcmluZy0+dGFpbCk7CisJcnhfcmlu Zy0+aGVhZCA9IChyeF9yaW5nLT5oZWFkICsgY291bnQpICYgKFVBUlRfUlhfU0laRSAtIDEpOwor CVVBUlRfREJHKCJ1cGRhdGVkIHJ4X3JpbmctPmhlYWQ9JWQgcnhfcmluZy0+dGFpbD0lZFxuIiwK KwkJCQkJcnhfcmluZy0+aGVhZCwgcnhfcmluZy0+dGFpbCk7CisJYXN0X3VhcnRfcnhfc2RtYV90 YXNrbGV0X2Z1bmMoKHVuc2lnbmVkIGxvbmcpdXApOworfQorCitzdGF0aWMgaW50IGFzdF91YXJ0 X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAsCisJCQkJCXVuc2lnbmVkIGxv bmcgY291bnQpCit7CisJc3RydWN0IGNpcmNfYnVmICpyeF9yaW5nID0gJnVwLT5yeF9kbWFfYnVm OworCWRtYV9hZGRyX3QgcnhfcGh5c19hZGRyOworCisJVUFSVF9EQkcoIiVzOnVwLT5yeF9kbWFf Y2hhbj0gJWRcbiIsIF9fZnVuY19fLCB1cC0+cnhfZG1hX2NoYW4pOworCVVBUlRfREJHKCJ1cC0+ cnhfY29va2llID0gJWRcbiIsIHVwLT5yeF9jb29raWUpOworCWlmICh1cC0+cnhfY29va2llID09 IDApIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodXAtPnBvcnQuZGV2LCB1cC0+ZG1h X3J4X2FkZHIsCisJCQkJCVVBUlRfUlhfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJcnhfcGh5 c19hZGRyID0gdXAtPmRtYV9yeF9hZGRyICsgcnhfcmluZy0+dGFpbDsKKwkJdXAtPnJ4X2RtYV9k ZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHVwLT5yeF9kbWFfY2hhbiwKKwkJcnhf cGh5c19hZGRyLCBVQVJUX1JYX1NJWkUsIERNQV9ERVZfVE9fTUVNLCBETUFfUFJFUF9JTlRFUlJV UFQpOworCQlpZiAoIXVwLT5yeF9kbWFfZGVzYykgeworCQkJZGV2X2Vycih1cC0+cG9ydC5kZXYs ICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgUnhcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0K KwkJdXAtPnJ4X2RtYV9kZXNjLT5jYWxsYmFjayA9IGFzdF91YXJ0X3J4X2RtYV9jb21wbGV0ZTsK KwkJdXAtPnJ4X2RtYV9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHVwOworCQl1cC0+cnhfaW5fcHJv Z3Jlc3MgPSAxOworCQl1cC0+cnhfYnl0ZXNfcmVxdWVzdGVkID0gVUFSVF9SWF9TSVpFOworCQl1 cC0+cnhfYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOworCQl1cC0+cnhfY29va2llID0gZG1hZW5naW5l X3N1Ym1pdCh1cC0+cnhfZG1hX2Rlc2MpOworCX0KKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyh1 cC0+cnhfZG1hX2NoYW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3RfdWFydF9y eF9zZG1hX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFzdF91 YXJ0X3BvcnQgKnVwID0gKChzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqKWRhdGEpOworCXN0cnVjdCB0 dHlfcG9ydCAqcG9ydCA9ICZ1cC0+cG9ydC5zdGF0ZS0+cG9ydDsKKwlzdHJ1Y3QgY2lyY19idWYg KnJ4X3JpbmcgPSAmdXAtPnJ4X2RtYV9idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQg Y291bnQ7CisJaW50IGNvcHkgPSAwOworCisJVUFSVF9EQkcoImxpbmUgWyVkXSwgcnhfcmluZy0+ aGVhZCA9ICVkLCByeF9yaW5nLT50YWlsID0gJWRcbiIsCisJCQkgICAgdXAtPnBvcnQubGluZSwg cnhfcmluZy0+aGVhZCwgcnhfcmluZy0+dGFpbCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5w b3J0LmxvY2ssIGZsYWdzKTsKKwlpZiAocnhfcmluZy0+aGVhZCA+IHJ4X3JpbmctPnRhaWwpIHsK KwkJY291bnQgPSByeF9yaW5nLT5oZWFkIC0gcnhfcmluZy0+dGFpbDsKKwkJVUFSVF9EQkcoIl5e Xl4gY291bnQ9JWQgcnhfcmluZy0+aGVhZD0lZCByeF9yaW5nLT50YWlsPSVkXG4iLAorCQkJCQlj b3VudCwgcnhfcmluZy0+aGVhZCwgcnhfcmluZy0+dGFpbCk7CisJCWNvcHkgPSB0dHlfaW5zZXJ0 X2ZsaXBfc3RyaW5nKHBvcnQsCisJCQkJCXJ4X3JpbmctPmJ1ZiArIHJ4X3JpbmctPnRhaWwsIGNv dW50KTsKKwl9IGVsc2UgaWYgKHJ4X3JpbmctPmhlYWQgPCByeF9yaW5nLT50YWlsKSB7CisJCWNv dW50ID0gU0RNQV9SWF9CVUZGX1NJWkUgLSByeF9yaW5nLT50YWlsOworCQlVQVJUX0RCRygicm9s bG92cjpjb3VudD0lZCByeF9yaW5nLT5oZWFkPSVkIHJ4X3JpbmctPnRhaWw9JWRcbiIsCisJCQkJ ICAgIGNvdW50LCByeF9yaW5nLT5oZWFkLCByeF9yaW5nLT50YWlsKTsKKwkJY29weSA9IHR0eV9p bnNlcnRfZmxpcF9zdHJpbmcocG9ydCwKKwkJCQkJcnhfcmluZy0+YnVmICsgcnhfcmluZy0+dGFp bCwgY291bnQpOworCX0gZWxzZSB7CisJCWNvdW50ID0gMDsKKwl9CisJaWYgKGNvcHkgIT0gY291 bnQpCisJCVVBUlRfREJHKCIhISEhISEhISBFUlJPUiAxMTFcbiIpOworCWlmIChjb3VudCkgewor CQlVQVJUX0RCRygiY291bnQgPSAlZFxuIiwgY291bnQpOworCQlyeF9yaW5nLT50YWlsICs9IGNv dW50OworCQlyeF9yaW5nLT50YWlsICY9IChTRE1BX1JYX0JVRkZfU0laRSAtIDEpOworCQl1cC0+ cG9ydC5pY291bnQucnggKz0gY291bnQ7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOwor CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJCWFzdF91 YXJ0X3N0YXJ0X3J4X2RtYSh1cCwgY291bnQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBv cnQubG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5s b2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGSUZPIHN1cHBvcnQuCisgKi8KK3N0YXRpYyBpbmxp bmUgdm9pZCBzZXJpYWw4MjUwX2NsZWFyX2ZpZm9zKHN0cnVjdCBhc3RfdWFydF9wb3J0ICpwKQor eworCXNlcmlhbF9vdXRwKHAsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7CisJc2Vy aWFsX291dHAocCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKKwkJICAgICAgIFVB UlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKTsKKwlzZXJpYWxfb3V0cChw LCBVQVJUX0ZDUiwgMCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHJz X2luaXQoKSB0byBpbml0aWFsaXplIGEgc3BlY2lmaWMgc2VyaWFsCisgKiBwb3J0LgorICovCitz dGF0aWMgdm9pZCBhdXRvY29uZmlnKHN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCkKK3sKKwl1bnNp Z25lZCBsb25nIGZsYWdzOworCisJVUFSVF9EQkcoImxpbmUgWyVkXVxuIiwgdXAtPnBvcnQubGlu ZSk7CisJaWYgKCF1cC0+cG9ydC5pb2Jhc2UgJiYgIXVwLT5wb3J0Lm1hcGJhc2UgJiYgIXVwLT5w b3J0Lm1lbWJhc2UpCisJCXJldHVybjsKKworCURFQlVHX0FVVE9DT05GKCJ0dHlETUElZDogYXV0 b2NvbmYgKDB4JTA0eCwgMHglcCk6ICIsCisJCQl1cC0+cG9ydC5saW5lLCB1cC0+cG9ydC5pb2Jh c2UsIHVwLT5wb3J0Lm1lbWJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0Lmxv Y2ssIGZsYWdzKTsKKworCXVwLT5jYXBhYmlsaXRpZXMgPSAwOworCXVwLT5idWdzID0gMDsKKwor CXVwLT5wb3J0LnR5cGUgPSBQT1JUXzE2NTUwQTsKKwl1cC0+Y2FwYWJpbGl0aWVzIHw9IFVBUlRf Q0FQX0ZJRk87CisKKwl1cC0+cG9ydC5maWZvc2l6ZSA9IHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5 cGVdLmZpZm9fc2l6ZTsKKwl1cC0+Y2FwYWJpbGl0aWVzID0gdWFydF9jb25maWdbdXAtPnBvcnQu dHlwZV0uZmxhZ3M7CisJdXAtPnR4X2xvYWRzeiA9IHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5cGVd LnR4X2xvYWRzejsKKworCWlmICh1cC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikKKwkJZ290 byBvdXQ7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBVQVJULgorCSAqLworCXNlcmlhbDgyNTBfY2xl YXJfZmlmb3ModXApOworCWFzdF9zZXJpYWxfaW4odXAsIFVBUlRfUlgpOworCXNlcmlhbF9vdXRw KHVwLCBVQVJUX0lFUiwgMCk7CisKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAt PnBvcnQubG9jaywgZmxhZ3MpOworCURFQlVHX0FVVE9DT05GKCJ0eXBlPSVzXG4iLCB1YXJ0X2Nv bmZpZ1t1cC0+cG9ydC50eXBlXS5uYW1lKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgX19z dG9wX3R4KHN0cnVjdCBhc3RfdWFydF9wb3J0ICpwKQoreworCWlmIChwLT5pZXIgJiBVQVJUX0lF Ul9USFJJKSB7CisJCXAtPmllciAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJYXN0X3NlcmlhbF9vdXQo cCwgVUFSVF9JRVIsIHAtPmllcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0 b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAq dXAgPSB0b19hc3RfZG1hX3VhcnRfcG9ydChwb3J0KTsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQg PSAmdXAtPnBvcnQuc3RhdGUtPnhtaXQ7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKwl1 bnNpZ25lZCBpbnQgY291bnQ7CisKKwlfX3N0b3BfdHgodXApOworCWlmICghdXAtPnR4X2luX3By b2dyZXNzKQorCQlyZXR1cm47CisJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwodXAtPnR4X2RtYV9j aGFuKTsKKwlkbWFlbmdpbmVfdHhfc3RhdHVzKHVwLT50eF9kbWFfY2hhbiwgdXAtPnR4X2Nvb2tp ZSwgJnN0YXRlKTsKKwljb3VudCA9IHVwLT50eF9ieXRlc19yZXF1ZXN0ZWQgLSBzdGF0ZS5yZXNp ZHVlOworCWFzeW5jX3R4X2Fjayh1cC0+dHhfZG1hX2Rlc2MpOworCXhtaXQtPnRhaWwgPSAoeG1p dC0+dGFpbCArIGNvdW50KSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCXVwLT50eF9pbl9wcm9n cmVzcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBhc3RfdWFy dF9wb3J0ICp1cCk7CisKK3N0YXRpYyB2b2lkIHNlcmlhbDgyNTBfc3RhcnRfdHgoc3RydWN0IHVh cnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAgPSB0b19hc3RfZG1h X3VhcnRfcG9ydChwb3J0KTsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmdXAtPnBvcnQuc3Rh dGUtPnhtaXQ7CisKKwlVQVJUX0RCRygiXG4lczpsaW5lICVkIiwgX19mdW5jX18sIHBvcnQtPmxp bmUpOworCVVBUlRfVFhfREJHKCJsaW5lIFslZF1cbiIsIHBvcnQtPmxpbmUpOworCWlmICghdWFy dF9jaXJjX2VtcHR5KHhtaXQpICYmICF1cC0+dHhfaW5fcHJvZ3Jlc3MpIHsKKwkJVUFSVF9EQkco IkNhbGxpbmcgYXN0X3VhcnRfc3RhcnRfbmV4dF90eFxuIik7CisJCWFzdF91YXJ0X3N0YXJ0X25l eHRfdHgodXApOworCX0KK30KKworc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdG9wX3J4KHN0cnVj dCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwID0gdG9fYXN0 X2RtYV91YXJ0X3BvcnQocG9ydCk7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKworCXVw LT5pZXIgJj0gflVBUlRfSUVSX1JMU0k7CisJdXAtPnBvcnQucmVhZF9zdGF0dXNfbWFzayAmPSB+ VUFSVF9MU1JfRFI7CisJYXN0X3NlcmlhbF9vdXQodXAsIFVBUlRfSUVSLCB1cC0+aWVyKTsKKwlp ZiAoIXVwLT5yeF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuOworCWRtYWVuZ2luZV90ZXJtaW5hdGVf YWxsKHVwLT5yeF9kbWFfY2hhbik7CisJZG1hZW5naW5lX3R4X3N0YXR1cyh1cC0+cnhfZG1hX2No YW4sIHVwLT5yeF9jb29raWUsICZzdGF0ZSk7CisJdXAtPnJ4X2luX3Byb2dyZXNzID0gMDsKKwl1 cC0+cnhfYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUw X2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBhc3RfdWFydF9w b3J0ICp1cCA9IHRvX2FzdF9kbWFfdWFydF9wb3J0KHBvcnQpOworCisJVUFSVF9EQkcoImxpbmUg WyVkXVxuIiwgcG9ydC0+bGluZSk7CisJdXAtPmllciB8PSBVQVJUX0lFUl9NU0k7CisJYXN0X3Nl cmlhbF9vdXQodXAsIFVBUlRfSUVSLCB1cC0+aWVyKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNt aXRfY2hhcnMoc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwKQoreworCXN0cnVjdCBjaXJjX2J1ZiAq eG1pdCA9ICZ1cC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwlpbnQgY291bnQ7CisKKwlpZiAodXAtPnBv cnQueF9jaGFyKSB7CisJCXNlcmlhbF9vdXRwKHVwLCBVQVJUX1RYLCB1cC0+cG9ydC54X2NoYXIp OworCQl1cC0+cG9ydC5pY291bnQudHgrKzsKKwkJdXAtPnBvcnQueF9jaGFyID0gMDsKKwkJcmV0 dXJuOworCX0KKwlpZiAodWFydF90eF9zdG9wcGVkKCZ1cC0+cG9ydCkpIHsKKwkJc2VyaWFsODI1 MF9zdG9wX3R4KCZ1cC0+cG9ydCk7CisJCXJldHVybjsKKwl9CisJaWYgKHVhcnRfY2lyY19lbXB0 eSh4bWl0KSkgeworCQlfX3N0b3BfdHgodXApOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSB1 cC0+dHhfbG9hZHN6OworCWRvIHsKKwkJYXN0X3NlcmlhbF9vdXQodXAsIFVBUlRfVFgsIHhtaXQt PmJ1Zlt4bWl0LT50YWlsXSk7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVB UlRfWE1JVF9TSVpFIC0gMSk7CisJCXVwLT5wb3J0Lmljb3VudC50eCsrOworCQlpZiAodWFydF9j aXJjX2VtcHR5KHhtaXQpKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCisJ aWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0 X3dyaXRlX3dha2V1cCgmdXAtPnBvcnQpOworCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkK KwkJX19zdG9wX3R4KHVwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19tb2RlbV9z dGF0dXMoc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMg PSBhc3Rfc2VyaWFsX2luKHVwLCBVQVJUX01TUik7CisKKwlVQVJUX0RCRygibGluZSBbJWRdXG4i LCB1cC0+cG9ydC5saW5lKTsKKwlzdGF0dXMgfD0gdXAtPm1zcl9zYXZlZF9mbGFnczsKKwl1cC0+ bXNyX3NhdmVkX2ZsYWdzID0gMDsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBICYm IHVwLT5pZXIgJiBVQVJUX0lFUl9NU0kgJiYKKwkJCQkJICAgIHVwLT5wb3J0LnN0YXRlICE9IE5V TEwpIHsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCQl1cC0+cG9ydC5pY291bnQu cm5nKys7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQorCQkJdXAtPnBvcnQuaWNvdW50 LmRzcisrOworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKKwkJCXVhcnRfaGFuZGxlX2Rj ZF9jaGFuZ2UoJnVwLT5wb3J0LAorCQkJCQkJCXN0YXR1cyAmIFVBUlRfTVNSX0RDRCk7CisJCWlm IChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQorCQkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSgmdXAt PnBvcnQsCisJCQkJCQkJc3RhdHVzICYgVUFSVF9NU1JfQ1RTKTsKKwkJd2FrZV91cF9pbnRlcnJ1 cHRpYmxlKCZ1cC0+cG9ydC5zdGF0ZS0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7CisJfQorCXJldHVy biBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIGhhbmRsZXMgdGhlIGludGVycnVwdCBmcm9tIG9u ZSBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NlcmlhbDgyNTBfaGFuZGxlX3BvcnQo c3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBm bGFncyk7CisKKwlzdGF0dXMgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CisKKwlERUJVR19J TlRSKCJzdGF0dXMgPSAleC4uLiIsIHN0YXR1cyk7CisKKwljaGVja19tb2RlbV9zdGF0dXModXAp OworCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQorCQl0cmFuc21pdF9jaGFycyh1cCk7CisK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKKy8q CisgKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgaW50ZXJydXB0IHJvdXRpbmUuCisgKi8K K3N0YXRpYyBpcnFyZXR1cm5fdCBhc3RfdWFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2 X2lkKQoreworCXN0cnVjdCBpcnFfaW5mbyAqaSA9IGRldl9pZDsKKwlpbnQgcGFzc19jb3VudGVy ID0gMCwgaGFuZGxlZCA9IDAsIGVuZCA9IDA7CisKKwlERUJVR19JTlRSKCIoJWQpICIsIGlycSk7 CisJc3Bpbl9sb2NrKCZpLT5sb2NrKTsKKwlkbyB7CisJCXN0cnVjdCBhc3RfdWFydF9wb3J0ICp1 cDsKKwkJdW5zaWduZWQgaW50IGlpcjsKKworCQl1cCA9IChzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAq KShpLT51cCk7CisJCWlpciA9IGFzdF9zZXJpYWxfaW4odXAsIFVBUlRfSUlSKTsKKwkJaWYgKCEo aWlyICYgVUFSVF9JSVJfTk9fSU5UKSkgeworCQkJc2VyaWFsODI1MF9oYW5kbGVfcG9ydCh1cCk7 CisJCQloYW5kbGVkID0gMTsKKwkJfSBlbHNlCisJCQllbmQgPSAxOworCisJCWlmIChwYXNzX2Nv dW50ZXIrKyA+IFBBU1NfTElNSVQpIHsKKwkJCS8qIElmIHdlIGhpdCB0aGlzLCB3ZSdyZSBkZWFk LiAqLworCQkJVUFSVF9EQkcoS0VSTl9FUlIKKwkJCSAgImFzdC11YXJ0LWRtYTp0b28gbXVjaCB3 b3JrIGZvciBpcnFpJWQiLCBpcnEpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChlbmQpOwor CisJc3Bpbl91bmxvY2soJmktPmxvY2spOworCisJREVCVUdfSU5UUigiZW5kLlxuIik7CisKKwly ZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzZXJp YWw4MjUwX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGFzdF91 YXJ0X3BvcnQgKnVwID0gdG9fYXN0X2RtYV91YXJ0X3BvcnQocG9ydCk7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbHNyOworCisJVUFSVF9UWF9EQkcoImxpbmUgWyVkXVxu IiwgdXAtPnBvcnQubGluZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywg ZmxhZ3MpOworCWxzciA9IGFzdF9zZXJpYWxfaW4odXAsIFVBUlRfTFNSKTsKKwl1cC0+bHNyX3Nh dmVkX2ZsYWdzIHw9IGxzciAmIExTUl9TQVZFX0ZMQUdTOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBsc3IgJiBVQVJUX0xTUl9URU1U ID8gVElPQ1NFUl9URU1UIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWw4MjUw X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBhc3RfdWFydF9w b3J0ICp1cCA9IHRvX2FzdF9kbWFfdWFydF9wb3J0KHBvcnQpOworCXVuc2lnbmVkIGludCBzdGF0 dXM7CisJdW5zaWduZWQgaW50IHJldDsKKworCXN0YXR1cyA9IGNoZWNrX21vZGVtX3N0YXR1cyh1 cCk7CisKKwlyZXQgPSAwOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCisJCXJldCB8PSBU SU9DTV9DQVI7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1JJKQorCQlyZXQgfD0gVElPQ01fUk5H OworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EU1IpCisJCXJldCB8PSBUSU9DTV9EU1I7CisJaWYg KHN0YXR1cyAmIFVBUlRfTVNSX0NUUykKKwkJcmV0IHw9IFRJT0NNX0NUUzsKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0 ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVw ID0gdG9fYXN0X2RtYV91YXJ0X3BvcnQocG9ydCk7CisJdW5zaWduZWQgY2hhciBtY3IgPSAwOwor CS8vVUFSVF9EQkcoInNlcmlhbDgyNTBfc2V0X21jdHJsICV4XG4iLG1jdHJsKTsKKwkvL1RPRE8g Li4uLiBJc3N1ZSBmb3IgZml4IC4uLi4uLgorCW1jdHJsID0gMDsKKworCWlmIChtY3RybCAmIFRJ T0NNX1JUUykKKwkJbWNyIHw9IFVBUlRfTUNSX1JUUzsKKwlpZiAobWN0cmwgJiBUSU9DTV9EVFIp CisJCW1jciB8PSBVQVJUX01DUl9EVFI7CisJaWYgKG1jdHJsICYgVElPQ01fT1VUMSkKKwkJbWNy IHw9IFVBUlRfTUNSX09VVDE7CisJaWYgKG1jdHJsICYgVElPQ01fT1VUMikKKwkJbWNyIHw9IFVB UlRfTUNSX09VVDI7CisJaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKKwkJbWNyIHw9IFVBUlRfTUNS X0xPT1A7CisKKwltY3IgPSAobWNyICYgdXAtPm1jcl9tYXNrKSB8IHVwLT5tY3JfZm9yY2UgfCB1 cC0+bWNyOworCisJYXN0X3NlcmlhbF9vdXQodXAsIFVBUlRfTUNSLCBtY3IpOworfQorCitzdGF0 aWMgdm9pZCBzZXJpYWw4MjUwX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQg YnJlYWtfc3RhdGUpCit7CisJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwID0gdG9fYXN0X2RtYV91 YXJ0X3BvcnQocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJaWYgKGJyZWFrX3N0YXRlID09IC0xKQorCQl1 cC0+bGNyIHw9IFVBUlRfTENSX1NCQzsKKwllbHNlCisJCXVwLT5sY3IgJj0gflVBUlRfTENSX1NC QzsKKwlhc3Rfc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIHVwLT5sY3IpOworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzZXJp YWw4MjUwX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYXN0X3Vh cnRfcG9ydCAqdXAgPSB0b19hc3RfZG1hX3VhcnRfcG9ydChwb3J0KTsKKwkvL1RYIERNQQorCXN0 cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZ1cC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbHNyLCBpaXI7CisJaW50IHJldHZhbDsKKwlzdHJ1 Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfc2NvbmZpZzsKKwlpbnQgaXJxX2ZsYWdzID0gdXAtPnBv cnQuZmxhZ3MgJiBVUEZfU0hBUkVfSVJRID8gSVJRRl9TSEFSRUQgOiAwOworCisJdXAtPmNhcGFi aWxpdGllcyA9IHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5cGVdLmZsYWdzOworCXVwLT5tY3IgPSAw OworCS8qCisJICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtLgorCSAq ICh0aGV5IHdpbGwgYmUgcmVlbmFibGVkIGluIHNldF90ZXJtaW9zKCkpCisJICovCisJc2VyaWFs ODI1MF9jbGVhcl9maWZvcyh1cCk7CisJVUFSVF9EQkcoIjE6IGxpbmUgWyVkXVxuIiwgcG9ydC0+ bGluZSk7CisKKwkvKgorCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgorCSAqLwor CSh2b2lkKSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CisJKHZvaWQpIHNlcmlhbF9pbnAodXAs IFVBUlRfUlgpOworCSh2b2lkKSBzZXJpYWxfaW5wKHVwLCBVQVJUX0lJUik7CisJKHZvaWQpIHNl cmlhbF9pbnAodXAsIFVBUlRfTVNSKTsKKworCWFzdF91YXJ0X2lycVswXS51cCA9IHVwOworCXJl dHZhbCA9IHJlcXVlc3RfaXJxKHVwLT5wb3J0LmlycSwgYXN0X3VhcnRfaW50ZXJydXB0LAorCQkJ CSBpcnFfZmxhZ3MsICJhc3QtdWFydC1kbWEiLCBhc3RfdWFydF9pcnEpOworCWlmIChyZXR2YWwp CisJCXJldHVybiByZXR2YWw7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgVUFSVAor CSAqLworCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOworCisJc3Bp bl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKwl1cC0+cG9ydC5tY3RybCB8 PSBUSU9DTV9PVVQyOworCisJc2VyaWFsODI1MF9zZXRfbWN0cmwoJnVwLT5wb3J0LCB1cC0+cG9y dC5tY3RybCk7CisKKwkvKgorCSAqIERvIGEgcXVpY2sgdGVzdCB0byBzZWUgaWYgd2UgcmVjZWl2 ZSBhbgorCSAqIGludGVycnVwdCB3aGVuIHdlIGVuYWJsZSB0aGUgVFggaXJxLgorCSAqLworCXNl cmlhbF9vdXRwKHVwLCBVQVJUX0lFUiwgVUFSVF9JRVJfVEhSSSk7CisJbHNyID0gYXN0X3Nlcmlh bF9pbih1cCwgVUFSVF9MU1IpOworCWlpciA9IGFzdF9zZXJpYWxfaW4odXAsIFVBUlRfSUlSKTsK KwlzZXJpYWxfb3V0cCh1cCwgVUFSVF9JRVIsIDApOworCisJaWYgKGxzciAmIFVBUlRfTFNSX1RF TVQgJiYgaWlyICYgVUFSVF9JSVJfTk9fSU5UKSB7CisJCWlmICghKHVwLT5idWdzICYgVUFSVF9C VUdfVFhFTikpIHsKKwkJCXVwLT5idWdzIHw9IFVBUlRfQlVHX1RYRU47CisJCQlVQVJUX0RCRygi dHR5RE1BJWQgLSBlbmFibGluZyBiYWQgdHggc3RhdHVzXG4iLAorCQkJCSBwb3J0LT5saW5lKTsK KwkJfQorCX0gZWxzZSB7CisJCXVwLT5idWdzICY9IH5VQVJUX0JVR19UWEVOOworCX0KKworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCS8qCisJICog Q2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMgYWdhaW4gZm9yIGx1Y2ssIGFuZCBjbGVhciB0 aGUKKwkgKiBzYXZlZCBmbGFncyB0byBhdm9pZCBnZXR0aW5nIGZhbHNlIHZhbHVlcyBmcm9tIHBv bGxpbmcKKwkgKiByb3V0aW5lcyBvciB0aGUgcHJldmlvdXMgc2Vzc2lvbi4KKwkgKi8KKwlzZXJp YWxfaW5wKHVwLCBVQVJUX0xTUik7CisJc2VyaWFsX2lucCh1cCwgVUFSVF9SWCk7CisJc2VyaWFs X2lucCh1cCwgVUFSVF9JSVIpOworCXNlcmlhbF9pbnAodXAsIFVBUlRfTVNSKTsKKwl1cC0+bHNy X3NhdmVkX2ZsYWdzID0gMDsKKwl1cC0+bXNyX3NhdmVkX2ZsYWdzID0gMDsKKworCS8vUlggRE1B CisJdXAtPnJ4X2RtYV9idWYuaGVhZCA9IDA7CisJdXAtPnJ4X2RtYV9idWYudGFpbCA9IDA7CisJ dXAtPnBvcnQuaWNvdW50LnJ4ID0gMDsKKwlhc3RfZG1hX2NoYW5uZWxfc2V0dXAodXApOworCXVw LT5yeF9kbWFfYnVmLmJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChwb3J0LT5kZXYsIFVBUlRfUlhf U0laRSwKKwkJCQkJJnVwLT5kbWFfcnhfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cC0+cnhf ZG1hX2J1Zi5idWYpCisJCWFzdF9kbWFfY2hhbm5lbF90ZWFyZG93bih1cCk7CisjaWYgMQorCW1l bXNldCgmZG1hX3Njb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZykpOwor CWRtYV9zY29uZmlnLmRzdF9hZGRyID0gdXAtPmRtYV9yeF9hZGRyOworCWRtYV9zY29uZmlnLmRz dF9wb3J0X3dpbmRvd19zaXplID0gVUFSVF9SWF9TSVpFOworCWRtYV9zY29uZmlnLmRzdF9hZGRy X3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKwlkbWFfc2NvbmZpZy5kc3RfbWF4 YnVyc3QgPSA0OworCWRtYV9zY29uZmlnLnNsYXZlX2lkID0gdXAtPmNoYW5uZWxfbm87CisKKwlk bWFlbmdpbmVfc2xhdmVfY29uZmlnKHVwLT5yeF9kbWFfY2hhbiwgJmRtYV9zY29uZmlnKTsKKwor CS8vYXN0X3VhcnRfc3RhcnRfcnhfZG1hKHVwLCBVQVJUX1JYX1NJWkUpOworCWRtYV9zeW5jX3Np bmdsZV9mb3JfZGV2aWNlKHVwLT5wb3J0LmRldiwgdXAtPmRtYV9yeF9hZGRyLAorCQkJVUFSVF9S WF9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJdXAtPnJ4X2RtYV9kZXNjID0gZG1hZW5naW5l X3ByZXBfc2xhdmVfc2luZ2xlKHVwLT5yeF9kbWFfY2hhbiwKKwkJCXVwLT5kbWFfcnhfYWRkciwg VUFSVF9SWF9TSVpFLCBETUFfREVWX1RPX01FTSwKKwkJCURNQV9QUkVQX0lOVEVSUlVQVCk7CisJ aWYgKCF1cC0+cnhfZG1hX2Rlc2MpIHsKKwkJZGV2X2Vycih1cC0+cG9ydC5kZXYsICJOb3QgYWJs ZSB0byBnZXQgZGVzYyBmb3IgUnhcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdXAtPnJ4X2Rt YV9kZXNjLT5jYWxsYmFjayA9IGFzdF91YXJ0X3J4X2RtYV9jb21wbGV0ZTsKKwl1cC0+cnhfZG1h X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gdXA7CisJdXAtPnJ4X2luX3Byb2dyZXNzID0gMTsKKwl1 cC0+cnhfYnl0ZXNfcmVxdWVzdGVkID0gVUFSVF9SWF9TSVpFOworCXVwLT5yeF9jb29raWUgPSBk bWFlbmdpbmVfc3VibWl0KHVwLT5yeF9kbWFfZGVzYyk7CisjZW5kaWYKKworCW1lbXNldCgmZG1h X3Njb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZykpOworCisJdXAtPnR4 X2RvbmUgPSAxOworCXVwLT50eF9jb3VudCA9IDA7CisJdXAtPnR4X2RtYV9idWYuaGVhZCA9IDA7 CisJdXAtPnR4X2RtYV9idWYudGFpbCA9IDA7CisJdXAtPnR4X2RtYV9idWYuYnVmID0geG1pdC0+ YnVmOworCVVBUlRfREJHKCJoZWFkOjB4JXggdGFpbDoweCV4XG4iLCB4bWl0LT5oZWFkLCB4bWl0 LT50YWlsKTsKKwl4bWl0LT5oZWFkID0gMDsKKwl4bWl0LT50YWlsID0gMDsKKworCXVwLT5kbWFf dHhfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHBvcnQtPmRldiwKKwkJCQkgICAgICAgdXAtPnR4X2Rt YV9idWYuYnVmLAorCQkJCSAgICAgICBVQVJUX1hNSVRfU0laRSwKKwkJCQkgICAgICAgRE1BX1RP X0RFVklDRSk7CisjaWYgMQorCWRtYV9zY29uZmlnLnNyY19hZGRyID0gdXAtPmRtYV90eF9hZGRy OworCWRtYV9zY29uZmlnLnNyY19wb3J0X3dpbmRvd19zaXplID0gVUFSVF9YTUlUX1NJWkU7CisJ ZG1hX3Njb25maWcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwor CWRtYV9zY29uZmlnLnNyY19tYXhidXJzdCA9IDQ7CisJZG1hX3Njb25maWcuc2xhdmVfaWQgPSB1 cC0+Y2hhbm5lbF9ubzsKKwlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHVwLT50eF9kbWFfY2hhbiwg JmRtYV9zY29uZmlnKTsKKyNlbmRpZgorCS8vU1RPUCBhbmQgVFJJR0dFUiBpcyBkb25lIGluIFNE TUEgZHJpdmVyCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbDgyNTBfc2h1dGRv d24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAg PSB0b19hc3RfZG1hX3VhcnRfcG9ydChwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ dXAtPmllciA9IDA7CisJc2VyaWFsX291dHAodXAsIFVBUlRfSUVSLCAwKTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJdXAtPnBvcnQubWN0cmwgJj0gflRJ T0NNX09VVDI7CisKKwlzZXJpYWw4MjUwX3NldF9tY3RybCgmdXAtPnBvcnQsIHVwLT5wb3J0Lm1j dHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisK KwkvKgorCSAqIERpc2FibGUgYnJlYWsgY29uZGl0aW9uIGFuZCBGSUZPcworCSAqLworCWFzdF9z ZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgc2VyaWFsX2lucCh1cCwgVUFSVF9MQ1IpICYgflVBUlRf TENSX1NCQyk7CisJc2VyaWFsODI1MF9jbGVhcl9maWZvcyh1cCk7CisKKwkodm9pZCkgYXN0X3Nl cmlhbF9pbih1cCwgVUFSVF9SWCk7CisKKwl1cC0+cnhfaW5fcHJvZ3Jlc3MgPSAwOworCXVwLT50 eF9pbl9wcm9ncmVzcyA9IDA7CisJZG1hX3JlbGVhc2VfY2hhbm5lbCh1cC0+cnhfZG1hX2NoYW4p OworCWRtYV9yZWxlYXNlX2NoYW5uZWwodXAtPnR4X2RtYV9jaGFuKTsKKwlkbWFfZnJlZV9jb2hl cmVudChwb3J0LT5kZXYsIFVBUlRfUlhfU0laRSwKKwkJCQkJdXAtPnJ4X2RtYV9idWYuYnVmLCB1 cC0+ZG1hX3J4X2FkZHIpOworCWRtYV91bm1hcF9zaW5nbGUocG9ydC0+ZGV2LCB1cC0+ZG1hX3R4 X2FkZHIsCisJCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwl1cC0+cnhfZG1h X2NoYW4gPSBOVUxMOworCXVwLT50eF9kbWFfY2hhbiA9IE5VTEw7CisJdXAtPmRtYV9yeF9hZGRy ID0gMDsKKwl1cC0+ZG1hX3J4X2FkZHIgPSAwOworCS8vVHggYnVmZmVyIHdpbGwgZnJlZSBieSBz ZXJpYWxfY29yZS5jCisJZnJlZV9pcnEodXAtPnBvcnQuaXJxLCBhc3RfdWFydF9pcnEpOworfQor CitzdGF0aWMgdW5zaWduZWQgaW50IHNlcmlhbDgyNTBfZ2V0X2Rpdmlzb3Ioc3RydWN0IHVhcnRf cG9ydCAqcG9ydCwKKwkJCQkJCQl1bnNpZ25lZCBpbnQgYmF1ZCkKK3sKKwl1bnNpZ25lZCBpbnQg cXVvdDsKKworCXF1b3QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOworCXJldHVybiBx dW90OworfQorCitzdGF0aWMgdm9pZAorc2VyaWFsODI1MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFy dF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgICBzdHJ1Y3Qg a3Rlcm1pb3MgKm9sZCkKK3sKKwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAgPSB0b19hc3RfZG1h X3VhcnRfcG9ydChwb3J0KTsKKwl1bnNpZ25lZCBjaGFyIGN2YWwsIGZjciA9IDA7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYmF1ZCwgcXVvdDsKKworCXN3aXRjaCAodGVy bWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWN2YWwgPSBVQVJUX0xDUl9X TEVONTsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONjsKKwkJ YnJlYWs7CisJY2FzZSBDUzc6CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONzsKKwkJYnJlYWs7CisJ ZGVmYXVsdDoKKwljYXNlIENTODoKKwkJY3ZhbCA9IFVBUlRfTENSX1dMRU44OworCQlicmVhazsK Kwl9CisKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKKwkJY3ZhbCB8PSBVQVJUX0xD Ul9TVE9QOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQorCQljdmFsIHw9IFVBUlRf TENSX1BBUklUWTsKKwlpZiAoISh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8 PSBVQVJUX0xDUl9FUEFSOworI2lmZGVmIENNU1BBUgorCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYg Q01TUEFSKQorCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7CisjZW5kaWYKKworCS8qCisJICogQXNr IHRoZSBjb3JlIHRvIGNhbGN1bGF0ZSB0aGUgZGl2aXNvciBmb3IgdXMuCisJICovCisJYmF1ZCA9 IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsv MTYpOworCXF1b3QgPSBzZXJpYWw4MjUwX2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOworCisJaWYg KHVwLT5jYXBhYmlsaXRpZXMgJiBVQVJUX0NBUF9GSUZPICYmIHVwLT5wb3J0LmZpZm9zaXplID4g MSkgeworCQlpZiAoYmF1ZCA8IDI0MDApCisJCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8 IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwkJZWxzZQorCQkJZmNyID0gdWFydF9jb25maWdbdXAtPnBv cnQudHlwZV0uZmNyOworCX0KKworCS8qCisJICogT2ssIHdlJ3JlIG5vdyBjaGFuZ2luZyB0aGUg cG9ydCBzdGF0ZS4gIERvIGl0IHdpdGgKKwkgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLgorCSAqLwor CXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFVw ZGF0ZSB0aGUgcGVyLXBvcnQgdGltZW91dC4KKwkgKi8KKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBv cnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJdXAtPnBvcnQucmVhZF9zdGF0dXNfbWFz ayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmICh0ZXJt aW9zLT5jX2lmbGFnICYgSU5QQ0spCisJCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgfD0gVUFS VF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIChCUktJTlQg fCBQQVJNUkspKQorCQl1cC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwor CisJLyoKKwkgKiBDaGFyYWN0ZXJlcyB0byBpZ25vcmUKKwkgKi8KKwl1cC0+cG9ydC5pZ25vcmVf c3RhdHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQl1cC0+ cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwlp ZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSykgeworCQl1cC0+cG9ydC5pZ25vcmVfc3RhdHVz X21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yaW5nIHBhcml0 eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywKKwkJICogaWdub3JlIG92ZXJydW5zIHRvbyAoZm9yIHJl YWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIp CisJCQl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0U7CisJfQorCisJ LyoKKwkgKiBpZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgbm90IHNldAorCSAqLwor CWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQorCQl1cC0+cG9ydC5pZ25vcmVf c3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRFI7CisKKwkvKgorCSAqIENUUyBmbG93IGNvbnRyb2wg ZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMKKwkgKi8KKwl1cC0+aWVyICY9IH5VQVJU X0lFUl9NU0k7CisJaWYgKFVBUlRfRU5BQkxFX01TKCZ1cC0+cG9ydCwgdGVybWlvcy0+Y19jZmxh ZykpCisJCXVwLT5pZXIgfD0gVUFSVF9JRVJfTVNJOworCisJYXN0X3NlcmlhbF9vdXQodXAsIFVB UlRfSUVSLCB1cC0+aWVyKTsKKworCisJc2VyaWFsX291dHAodXAsIFVBUlRfTENSLCBjdmFsIHwg VUFSVF9MQ1JfRExBQik7Lyogc2V0IERMQUIgKi8KKworCXNlcmlhbF9kbF93cml0ZSh1cCwgcXVv dCk7CisKKwkvKgorCSAqIExDUiBETEFCIG11c3QgYmUgc2V0IHRvIGVuYWJsZSA2NC1ieXRlIEZJ Rk8gbW9kZS4gSWYgdGhlIEZDUgorCSAqIGlzIHdyaXR0ZW4gd2l0aG91dCBETEFCIHNldCwgdGhp cyBtb2RlIHdpbGwgYmUgZGlzYWJsZWQuCisJICovCisKKwlzZXJpYWxfb3V0cCh1cCwgVUFSVF9M Q1IsIGN2YWwpOwkJLyogcmVzZXQgRExBQiAqLworCXVwLT5sY3IgPSBjdmFsOwkJCQkJLyogU2F2 ZSBMQ1IgKi8KKwkJaWYgKGZjciAmIFVBUlRfRkNSX0VOQUJMRV9GSUZPKSB7CisJCQkvKiBlbXVs YXRlZCBVQVJUcyAoTHVjZW50IFZlbnVzIDE2N3gpIG5lZWQgdHdvIHN0ZXBzICovCisJCQlzZXJp YWxfb3V0cCh1cCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKKwkJfQorCQlzZXJp YWxfb3V0cCh1cCwgVUFSVF9GQ1IsIGZjcik7CQkvKiBzZXQgZmNyICovCisJc2VyaWFsODI1MF9z ZXRfbWN0cmwoJnVwLT5wb3J0LCB1cC0+cG9ydC5tY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCS8qIERvbid0IHJld3JpdGUgQjAgKi8KKwlp ZiAodHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHRlcm1pb3MpKQorCQl0dHlfdGVybWlvc19lbmNvZGVf YmF1ZF9yYXRlKHRlcm1pb3MsIGJhdWQsIGJhdWQpOworfQorCitzdGF0aWMgdm9pZAorc2VyaWFs ODI1MF9wbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdGUsCisJICAg ICAgdW5zaWduZWQgaW50IG9sZHN0YXRlKQoreworCXN0cnVjdCBhc3RfdWFydF9wb3J0ICpwID0g KHN0cnVjdCBhc3RfdWFydF9wb3J0ICopcG9ydDsKKworCWlmIChwLT5wbSkKKwkJcC0+cG0ocG9y dCwgc3RhdGUsIG9sZHN0YXRlKTsKK30KKworLyoKKyAqIFJlc291cmNlIGhhbmRsaW5nLgorICov CitzdGF0aWMgaW50IHNlcmlhbDgyNTBfcmVxdWVzdF9zdGRfcmVzb3VyY2Uoc3RydWN0IGFzdF91 YXJ0X3BvcnQgKnVwKQoreworCXVuc2lnbmVkIGludCBzaXplID0gOCA8PCB1cC0+cG9ydC5yZWdz aGlmdDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdXAtPnBvcnQubWFwYmFzZSkKKwkJcmV0dXJu IHJldDsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHVwLT5wb3J0Lm1hcGJhc2UsIHNpemUs ICJhc3QtdWFydC1kbWEiKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCXJldHVybiByZXQ7CisJfQor CisJaWYgKHVwLT5wb3J0LmZsYWdzICYgVVBGX0lPUkVNQVApIHsKKwkJdXAtPnBvcnQubWVtYmFz ZSA9IGlvcmVtYXBfbm9jYWNoZSh1cC0+cG9ydC5tYXBiYXNlLCBzaXplKTsKKwkJaWYgKCF1cC0+ cG9ydC5tZW1iYXNlKSB7CisJCQlyZWxlYXNlX21lbV9yZWdpb24odXAtPnBvcnQubWFwYmFzZSwg c2l6ZSk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3JlbGVhc2Vfc3RkX3Jlc291cmNl KHN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDggPDwg dXAtPnBvcnQucmVnc2hpZnQ7CisKKwkJaWYgKCF1cC0+cG9ydC5tYXBiYXNlKQorCQkJcmV0dXJu OworCisJCWlmICh1cC0+cG9ydC5mbGFncyAmIFVQRl9JT1JFTUFQKSB7CisJCQlpb3VubWFwKHVw LT5wb3J0Lm1lbWJhc2UpOworCQkJdXAtPnBvcnQubWVtYmFzZSA9IE5VTEw7CisJCX0KKworCQly ZWxlYXNlX21lbV9yZWdpb24odXAtPnBvcnQubWFwYmFzZSwgc2l6ZSk7Cit9CisKKworc3RhdGlj IHZvaWQgc2VyaWFsODI1MF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sK KwlzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAgPSAoc3RydWN0IGFzdF91YXJ0X3BvcnQgKilwb3J0 OworCisJc2VyaWFsODI1MF9yZWxlYXNlX3N0ZF9yZXNvdXJjZSh1cCk7Cit9CisKK3N0YXRpYyBp bnQgc2VyaWFsODI1MF9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlz dHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAgPSAoc3RydWN0IGFzdF91YXJ0X3BvcnQgKilwb3J0Owor CWludCByZXQgPSAwOworCisJcmV0ID0gc2VyaWFsODI1MF9yZXF1ZXN0X3N0ZF9yZXNvdXJjZSh1 cCk7CisJaWYgKHJldCA9PSAwKQorCQlzZXJpYWw4MjUwX3JlbGVhc2Vfc3RkX3Jlc291cmNlKHVw KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbDgyNTBfY29uZmlnX3Bv cnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBhc3RfdWFy dF9wb3J0ICp1cCA9IChzdHJ1Y3QgYXN0X3VhcnRfcG9ydCAqKXBvcnQ7CisJaW50IHJldDsKKwor CS8qCisJICogRmluZCB0aGUgcmVnaW9uIHRoYXQgd2UgY2FuIHByb2JlIGZvci4gIFRoaXMgaW4g dHVybgorCSAqIHRlbGxzIHVzIHdoZXRoZXIgd2UgY2FuIHByb2JlIGZvciB0aGUgdHlwZSBvZiBw b3J0LgorCSAqLworCXJldCA9IHNlcmlhbDgyNTBfcmVxdWVzdF9zdGRfcmVzb3VyY2UodXApOwor CWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBF KQorCQlhdXRvY29uZmlnKHVwKTsKKworCWlmICh1cC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9X TikKKwkJc2VyaWFsODI1MF9yZWxlYXNlX3N0ZF9yZXNvdXJjZSh1cCk7Cit9CisKK3N0YXRpYyBp bnQKK3NlcmlhbDgyNTBfdmVyaWZ5X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0 IHNlcmlhbF9zdHJ1Y3QgKnNlcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNo YXIgKgorc2VyaWFsODI1MF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaW50IHR5 cGUgPSBwb3J0LT50eXBlOworCisJaWYgKHR5cGUgPj0gQVJSQVlfU0laRSh1YXJ0X2NvbmZpZykp CisJCXR5cGUgPSAwOworCXJldHVybiB1YXJ0X2NvbmZpZ1t0eXBlXS5uYW1lOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIHNlcmlhbDgyNTBfcG9wcyA9IHsKKwkudHhfZW1wdHkJ PSBzZXJpYWw4MjUwX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwJPSBzZXJpYWw4MjUwX3NldF9tY3Ry bCwKKwkuZ2V0X21jdHJsCT0gc2VyaWFsODI1MF9nZXRfbWN0cmwsCisJLnN0b3BfdHgJPSBzZXJp YWw4MjUwX3N0b3BfdHgsCisJLnN0YXJ0X3R4CT0gc2VyaWFsODI1MF9zdGFydF90eCwKKwkuc3Rv cF9yeAk9IHNlcmlhbDgyNTBfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gc2VyaWFsODI1MF9lbmFi bGVfbXMsCisJLmJyZWFrX2N0bAk9IHNlcmlhbDgyNTBfYnJlYWtfY3RsLAorCS5zdGFydHVwCT0g c2VyaWFsODI1MF9zdGFydHVwLAorCS5zaHV0ZG93bgk9IHNlcmlhbDgyNTBfc2h1dGRvd24sCisJ LnNldF90ZXJtaW9zCT0gc2VyaWFsODI1MF9zZXRfdGVybWlvcywKKwkucG0JCT0gc2VyaWFsODI1 MF9wbSwKKwkudHlwZQkJPSBzZXJpYWw4MjUwX3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IHNlcmlh bDgyNTBfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQJPSBzZXJpYWw4MjUwX3JlcXVlc3Rf cG9ydCwKKwkuY29uZmlnX3BvcnQJPSBzZXJpYWw4MjUwX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlf cG9ydAk9IHNlcmlhbDgyNTBfdmVyaWZ5X3BvcnQsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQg c2VyaWFsODI1MF9pc2FfaW5pdF9wb3J0cyh2b2lkKQoreworCXN0YXRpYyBpbnQgZmlyc3QgPSAx OworCWludCBpOworCisJaWYgKCFmaXJzdCkKKwkJcmV0dXJuOworCWZpcnN0ID0gMDsKKworCWZv ciAoaSA9IDA7IGkgPCBucl91YXJ0czsgaSsrKSB7CisJCXN0cnVjdCBhc3RfdWFydF9wb3J0ICp1 cCA9ICZhc3RfdWFydF9wb3J0c1tpXTsKKworCQl1cC0+cG9ydC5saW5lID0gaTsKKwkJc3Bpbl9s b2NrX2luaXQoJnVwLT5wb3J0LmxvY2spOworCisJCS8qCisJCSAqIEFMUEhBX0tMVURHRV9NQ1Ig bmVlZHMgdG8gYmUga2lsbGVkLgorCQkgKi8KKwkJdXAtPm1jcl9tYXNrID0gfkFMUEhBX0tMVURH RV9NQ1I7CisJCXVwLT5tY3JfZm9yY2UgPSBBTFBIQV9LTFVER0VfTUNSOworCisJCXVwLT5wb3J0 Lm9wcyA9ICZzZXJpYWw4MjUwX3BvcHM7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAor c2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0 IGRldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBhc3RfdWFydF9wb3J0ICp1cCA9IE5V TEw7CisKKwlzZXJpYWw4MjUwX2lzYV9pbml0X3BvcnRzKCk7CisJZm9yIChpID0gMDsgaSA8IG5y X3VhcnRzOyBpKyspIHsKKwkJdXAgPSAmYXN0X3VhcnRfcG9ydHNbaV07CisJCXVwLT5wb3J0LmRl diA9IGRldjsKKwkJdWFydF9hZGRfb25lX3BvcnQoZHJ2LCAmdXAtPnBvcnQpOworCX0KK30KKwor I2RlZmluZSBTRVJJQUw4MjUwX0NPTlNPTEUJTlVMTAorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJp dmVyIHNlcmlhbDgyNTBfcmVnID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZl cl9uYW1lCQk9ICJhc3QtdWFydC1kbWEiLAorCS5kZXZfbmFtZQkJPSAidHR5RE1BIiwKKyNpZiAw CisJLm1ham9yCQkJPSBUVFlfTUFKT1IsCisJLm1pbm9yCQkJPSA2NCwKKyNlbHNlCisJLm1ham9y CQkJPSAyMDQsIC8vIGxpa2UgYXRtZWxfc2VyaWFsCisJLm1pbm9yCQkJPSAxNTUsCisjZW5kaWYK KwkubnIJCQk9IFVBUlRfRE1BX05SLAorCS5jb25zCQkJPSBTRVJJQUw4MjUwX0NPTlNPTEUsCit9 OworCitzdGF0aWMgdm9pZCBhc3RfZG1hX2NoYW5uZWxfdGVhcmRvd24oc3RydWN0IGFzdF91YXJ0 X3BvcnQgKnMpCit7CisJVUFSVF9EQkcoIlRlYXJkb3duIGNhbGxlZFxuIik7CisJaWYgKHMtPnR4 X2RtYV9jaGFuKSB7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocy0+dHhfZG1hX2NoYW4pOworCQlz LT50eF9kbWFfY2hhbiA9IE5VTEw7CisJfQorCWlmIChzLT5yeF9kbWFfY2hhbikgeworCQlkbWFf cmVsZWFzZV9jaGFubmVsKHMtPnJ4X2RtYV9jaGFuKTsKKwkJcy0+cnhfZG1hX2NoYW4gPSBOVUxM OworCX0KKworfQorc3RhdGljIGludCBhc3RfZG1hX2NoYW5uZWxfc2V0dXAoc3RydWN0IGFzdF91 YXJ0X3BvcnQgKnVwKQoreworCXVwLT5yeF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2No YW5uZWwodXAtPnBvcnQuZGV2LCAicngiKTsKKwlVQVJUX0RCRygiRW50ZXJlZCAlcyBwdHIgaXMg JXBcbiIsIF9fZnVuY19fLCB1cC0+cnhfZG1hX2NoYW4pOworCWlmICghdXAtPnJ4X2RtYV9jaGFu KQorCQlnb3RvIGVycl9vdXQ7CisKKwl1cC0+dHhfZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2 ZV9jaGFubmVsKHVwLT5wb3J0LmRldiwgInR4Iik7CisJVUFSVF9EQkcoIkVudGVyZWQgJXMgcHRy IGlzICVwXG4iLCBfX2Z1bmNfXywgdXAtPnR4X2RtYV9jaGFuKTsKKwlpZiAoIXVwLT50eF9kbWFf Y2hhbikKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuIDA7CitlcnJfb3V0OgorCWFzdF9kbWFf Y2hhbm5lbF90ZWFyZG93bih1cCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBSZWdp c3RlciBhIHNldCBvZiBzZXJpYWwgZGV2aWNlcyBhdHRhY2hlZCB0byBhIHBsYXRmb3JtIGRldmlj ZS4gIFRoZQorICogbGlzdCBpcyB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIGZsYWdzIGVudHJ5LCB3 aGljaCBtZWFucyB3ZSBleHBlY3QKKyAqIGFsbCBlbnRyaWVzIHRvIGhhdmUgYXQgbGVhc3QgVVBG X0JPT1RfQVVUT0NPTkYgc2V0LgorICovCitzdHJ1Y3QgY2xrICpjbGs7CitzdGF0aWMgaW50IHNl cmlhbDgyNTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBk ZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCB1YXJ0X3BvcnQgcG9y dDsKKwlpbnQgcmV0OworCXUzMiByZWFkID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IDA7 CisKKwlpZiAoVUFSVF9YTUlUX1NJWkUgPiBETUFfQlVGRl9TSVpFKQorCQlVQVJUX0RCRygiVUFS VF9YTUlUX1NJWkUgPiBETUFfQlVGRl9TSVpFIDogUGxlYXNlIENoZWNrXG4iKTsKKwltZW1zZXQo JnBvcnQsIDAsIHNpemVvZihzdHJ1Y3QgdWFydF9wb3J0KSk7CisKKwlwb3J0LmlycSA9IHBsYXRm b3JtX2dldF9pcnEoZGV2LCAwKTsKKwlpZiAocG9ydC5pcnEgPCAwKSB7CisJCWRldl9lcnIoJmRl di0+ZGV2LCAiY2Fubm90IGdldCBpcnFcbiIpOworCQlyZXR1cm4gcG9ydC5pcnE7CisJfQorCXJl cyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAo IXJlcykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIlJlZ2lzdGVyIGJhc2Ugbm90IGZvdW5kIik7 CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwb3J0Lm1hcGJhc2UgPSByZXMtPnN0YXJ0OworCWNs ayA9IGRldm1fY2xrX2dldCgmZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoY2xrKSkKKwkJ ZGV2X2VycigmZGV2LT5kZXYsICJtaXNzaW5nIGNvbnRyb2xsZXIgY2xvY2siKTsKKworCXJldCA9 IGNsa19wcmVwYXJlX2VuYWJsZShjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5k ZXYsICJmYWlsZWQgdG8gZW5hYmxlIERNQSBVQVJUIENsa1xuIik7CisJCXJldHVybiByZXQ7CisJ fQorCXBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShjbGspOworCisJaWYgKG9mX3Byb3BlcnR5 X3JlYWRfdTMyKG5wLCAicmVnLXNoaWZ0IiwgJnJlYWQpID09IDApCisJCXBvcnQucmVnc2hpZnQg PSByZWFkOworCXBvcnQuaW90eXBlID0gVVBJT19NRU07CisJcG9ydC5mbGFncyA9IFVQRl9JT1JF TUFQIHwgVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUOworCXBvcnQuZGV2ID0gJmRl di0+ZGV2OworCWlmIChzaGFyZV9pcnFzKQorCQlwb3J0LmZsYWdzIHw9IFVQRl9TSEFSRV9JUlE7 CisJcmV0ID0gYXN0X3VhcnRfcmVnaXN0ZXJfcG9ydCgmcG9ydCwgcmVhZCk7CisJaWYgKHJldCA8 IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCSJGYWlsOnJlZ2lzdGVyX3BvcnQgYXQgaW5k ZXggJWQoSU8lbHggTUVNJWxseCBJUlElZCk6ICVkXG4iLAorCQlyZWFkLCBwb3J0LmlvYmFzZSwg KHVuc2lnbmVkIGxvbmcgbG9uZylwb3J0Lm1hcGJhc2UsCisJCQkJCQkJCXBvcnQuaXJxLCByZXQp OworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVtb3ZlIHNlcmlhbCBwb3J0cyByZWdp c3RlcmVkIGFnYWluc3QgYSBwbGF0Zm9ybSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc2VyaWFs ODI1MF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJ Zm9yIChpID0gMDsgaSA8IG5yX3VhcnRzOyBpKyspIHsKKwkJc3RydWN0IGFzdF91YXJ0X3BvcnQg KnVwID0gJmFzdF91YXJ0X3BvcnRzW2ldOworCisJCWlmICh1cC0+cG9ydC5kZXYgPT0gJmRldi0+ ZGV2KQorCQkJYXN0X3VhcnRfdW5yZWdpc3Rlcl9wb3J0KGkpOworCQlhc3RfZG1hX2NoYW5uZWxf dGVhcmRvd24odXApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJpYWw4MjUw X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUp Cit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVUFSVF9ETUFfTlI7IGkrKykgeworCQlz dHJ1Y3QgYXN0X3VhcnRfcG9ydCAqdXAgPSAmYXN0X3VhcnRfcG9ydHNbaV07CisKKwkJaWYgKHVw LT5wb3J0LnR5cGUgIT0gUE9SVF9VTktOT1dOICYmIHVwLT5wb3J0LmRldiA9PSAmZGV2LT5kZXYp CisJCQl1YXJ0X3N1c3BlbmRfcG9ydCgmc2VyaWFsODI1MF9yZWcsICZ1cC0+cG9ydCk7CisJfQor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VyaWFsODI1MF9yZXN1bWUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFVBUlRf RE1BX05SOyBpKyspIHsKKwkJc3RydWN0IGFzdF91YXJ0X3BvcnQgKnVwID0gJmFzdF91YXJ0X3Bv cnRzW2ldOworCisJCWlmICh1cC0+cG9ydC50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiB1cC0+cG9y dC5kZXYgPT0gJmRldi0+ZGV2KQorCQkJc2VyaWFsODI1MF9yZXN1bWVfcG9ydChpKTsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXN0X3Nl cmlhbF9kdF9pZHNbXSA9IHsKKwkgeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0LXNkbWEtdWFy dCIsIH0sCisJIHsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgc2VyaWFsODI1MF9hc3RfZG1hX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2VyaWFs ODI1MF9wcm9iZSwKKwkucmVtb3ZlCQk9IHNlcmlhbDgyNTBfcmVtb3ZlLAorCS5zdXNwZW5kCT0g c2VyaWFsODI1MF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2VyaWFsODI1MF9yZXN1bWUsCisJLmRy aXZlcgkJPSB7CisJCS5uYW1lCT0gImFzdC11YXJ0LWRtYSIsCisJCS5vZl9tYXRjaF90YWJsZSAg ICAgPSBvZl9tYXRjaF9wdHIoYXN0X3NlcmlhbF9kdF9pZHMpLAorCX0sCit9OworCisvKgorICog VGhpcyAiZGV2aWNlIiBjb3ZlcnMgX2FsbF8gSVNBIDgyNTAtY29tcGF0aWJsZSBzZXJpYWwgZGV2 aWNlcyBsaXN0ZWQKKyAqIGluIHRoZSB0YWJsZSBpbiBpbmNsdWRlL2FzbS9zZXJpYWwuaAorICov CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2VyaWFsODI1MF9pc2FfZGV2czsKKwor LyoKKyAqIHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCBhbmQgc2VyaWFsODI1MF91bnJlZ2lzdGVy X3BvcnQgYWxsb3dzIGZvcgorICogMTZ4NTAgc2VyaWFsIHBvcnRzIHRvIGJlIGNvbmZpZ3VyZWQg YXQgcnVuLXRpbWUsIHRvIHN1cHBvcnQgUENNQ0lBCisgKiBtb2RlbXMgYW5kIFBDSSBtdWx0aXBv cnQgY2FyZHMuCisgKi8KKworc3RhdGljIHN0cnVjdCBhc3RfdWFydF9wb3J0ICoKKwkJc2VyaWFs ODI1MF9maW5kX21hdGNoX29yX3VudXNlZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWlu dCBpOworCisJLyoKKwkgKiBGaXJzdCwgZmluZCBhIHBvcnQgZW50cnkgd2hpY2ggbWF0Y2hlcy4K KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWFydHM7IGkrKykgeworCQlpZiAodWFydF9tYXRj aF9wb3J0KCZhc3RfdWFydF9wb3J0c1tpXS5wb3J0LCBwb3J0KSkKKwkJCXJldHVybiAmYXN0X3Vh cnRfcG9ydHNbaV07CisJfQorCS8qCisJICogV2UgZGlkbid0IGZpbmQgYSBtYXRjaGluZyBlbnRy eSwgc28gbG9vayBmb3IgdGhlIGZpcnN0CisJICogZnJlZSBlbnRyeS4gIFdlIGxvb2sgZm9yIG9u ZSB3aGljaCBoYXNuJ3QgYmVlbiBwcmV2aW91c2x5CisJICogdXNlZCAoaW5kaWNhdGVkIGJ5IHpl cm8gaW9iYXNlKS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWFydHM7IGkrKykKKwkJaWYg KGFzdF91YXJ0X3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gJiYKKwkJICAgIGFz dF91YXJ0X3BvcnRzW2ldLnBvcnQuaW9iYXNlID09IDApCisJCQlyZXR1cm4gJmFzdF91YXJ0X3Bv cnRzW2ldOworCS8qCisJICogVGhhdCBhbHNvIGZhaWxlZC4gIExhc3QgcmVzb3J0IGlzIHRvIGZp bmQgYW55IGVudHJ5IHdoaWNoCisJICogZG9lc24ndCBoYXZlIGEgcmVhbCBwb3J0IGFzc29jaWF0 ZWQgd2l0aCBpdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWFydHM7IGkrKykKKwkJaWYg KGFzdF91YXJ0X3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCisJCQlyZXR1cm4g JmFzdF91YXJ0X3BvcnRzW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJc2VyaWFs ODI1MF9yZWdpc3Rlcl9wb3J0IC0gcmVnaXN0ZXIgYSBzZXJpYWwgcG9ydAorICoJQHBvcnQ6IHNl cmlhbCBwb3J0IHRlbXBsYXRlCisgKgorICoJQ29uZmlndXJlIHRoZSBzZXJpYWwgcG9ydCBzcGVj aWZpZWQgYnkgdGhlIHJlcXVlc3QuIElmIHRoZQorICoJcG9ydCBleGlzdHMgYW5kIGlzIGluIHVz ZSwgaXQgaXMgaHVuZyB1cCBhbmQgdW5yZWdpc3RlcmVkCisgKglmaXJzdC4KKyAqCisgKglUaGUg cG9ydCBpcyB0aGVuIHByb2JlZCBhbmQgaWYgbmVjZXNzYXJ5IHRoZSBJUlEgaXMgYXV0b2RldGVj dGVkCisgKglJZiB0aGlzIGZhaWxzIGFuIGVycm9yIGlzIHJldHVybmVkLgorICoKKyAqCU9uIHN1 Y2Nlc3MgdGhlIHBvcnQgaXMgcmVhZHkgdG8gdXNlIGFuZCB0aGUgbGluZSBudW1iZXIgaXMgcmV0 dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgYXN0X3VhcnRfcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFy dF9wb3J0ICpwb3J0LAorCQkJCQl1bnNpZ25lZCBpbnQgY2hhbm5lbF9ubykKK3sKKwlzdHJ1Y3Qg YXN0X3VhcnRfcG9ydCAqdWFydDsKKwlpbnQgcmV0ID0gLUVOT1NQQzsKKworCWlmIChwb3J0LT51 YXJ0Y2xrID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmYXN0X3VhcnRf bXV0ZXgpOworCisJdWFydCA9IHNlcmlhbDgyNTBfZmluZF9tYXRjaF9vcl91bnVzZWQocG9ydCk7 CisJaWYgKHVhcnQpIHsKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbDgyNTBfcmVnLCAm dWFydC0+cG9ydCk7CisJCXVhcnQtPnBvcnQuaW9iYXNlICAgICAgID0gcG9ydC0+aW9iYXNlOwor CQl1YXJ0LT5wb3J0Lm1lbWJhc2UgICAgICA9IHBvcnQtPm1lbWJhc2U7CisJCXVhcnQtPnBvcnQu aXJxICAgICAgICAgID0gcG9ydC0+aXJxOworCQl1YXJ0LT5wb3J0LnVhcnRjbGsgICAgICA9IHBv cnQtPnVhcnRjbGs7CisJCXVhcnQtPnBvcnQuZmlmb3NpemUgICAgID0gcG9ydC0+Zmlmb3NpemU7 CisJCXVhcnQtPnBvcnQucmVnc2hpZnQgICAgID0gcG9ydC0+cmVnc2hpZnQ7CisJCXVhcnQtPnBv cnQuaW90eXBlICAgICAgID0gcG9ydC0+aW90eXBlOworCQl1YXJ0LT5wb3J0LmZsYWdzICAgICAg ICA9IHBvcnQtPmZsYWdzIHwgVVBGX0JPT1RfQVVUT0NPTkY7CisJCXVhcnQtPnBvcnQubWFwYmFz ZSAgICAgID0gcG9ydC0+bWFwYmFzZTsKKwkJdWFydC0+cG9ydC5wcml2YXRlX2RhdGEgPSB1YXJ0 OworCQlpZiAocG9ydC0+ZGV2KSB7CisJCQlVQVJUX0RCRygiV3JpdGluZyBkZXZcbiIpOworCQkJ dWFydC0+cG9ydC5kZXYgPSBwb3J0LT5kZXY7CisJCX0KKwkJcmV0ID0gdWFydF9hZGRfb25lX3Bv cnQoJnNlcmlhbDgyNTBfcmVnLCAmdWFydC0+cG9ydCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJ VUFSVF9EQkcoInVhcnRfYWRkX29uZV9wb3J0OiBGYWlsZWQgZm9yIHBvcnQ9JXAiLAorCQkJCQkJ CQkmdWFydC0+cG9ydCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXVhcnQtPmNoYW5uZWxfbm8g PSBjaGFubmVsX25vOworCQlzcGluX2xvY2tfaW5pdCgmdWFydC0+bG9jayk7CisKKwkJdGFza2xl dF9pbml0KCZ1YXJ0LT50eF90YXNrbGV0LCBhc3RfdWFydF90eF9zZG1hX3Rhc2tsZXRfZnVuYywK KwkJCQkodW5zaWduZWQgbG9uZyl1YXJ0KTsKKwkJdGFza2xldF9pbml0KCZ1YXJ0LT5yeF90YXNr bGV0LCBhc3RfdWFydF9yeF9zZG1hX3Rhc2tsZXRfZnVuYywKKwkJCQkodW5zaWduZWQgbG9uZyl1 YXJ0KTsKKwl9CisKKwltdXRleF91bmxvY2soJmFzdF91YXJ0X211dGV4KTsKKwlyZXR1cm4gcmV0 OworfQorRVhQT1JUX1NZTUJPTChhc3RfdWFydF9yZWdpc3Rlcl9wb3J0KTsKKworLyoqCisgKglz ZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydCAtIHJlbW92ZSBhIDE2eDUwIHNlcmlhbCBwb3J0IGF0 IHJ1bnRpbWUKKyAqCUBsaW5lOiBzZXJpYWwgbGluZSBudW1iZXIKKyAqCisgKglSZW1vdmUgb25l IHNlcmlhbCBwb3J0LiAgVGhpcyBtYXkgbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdAorICoJ Y29udGV4dC4gIFdlIGhhbmQgdGhlIHBvcnQgYmFjayB0byB0aGUgb3VyIGNvbnRyb2wuCisgKi8K K3N0YXRpYyB2b2lkIGFzdF91YXJ0X3VucmVnaXN0ZXJfcG9ydChpbnQgbGluZSkKK3sKKwlzdHJ1 Y3QgYXN0X3VhcnRfcG9ydCAqdWFydCA9ICZhc3RfdWFydF9wb3J0c1tsaW5lXTsKKworCW11dGV4 X2xvY2soJmFzdF91YXJ0X211dGV4KTsKKwl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2VyaWFsODI1 MF9yZWcsICZ1YXJ0LT5wb3J0KTsKKwlpZiAoc2VyaWFsODI1MF9pc2FfZGV2cykgeworCQl1YXJ0 LT5wb3J0LmZsYWdzICY9IH5VUEZfQk9PVF9BVVRPQ09ORjsKKwkJdWFydC0+cG9ydC50eXBlID0g UE9SVF9VTktOT1dOOworCQl1YXJ0LT5wb3J0LmRldiA9ICZzZXJpYWw4MjUwX2lzYV9kZXZzLT5k ZXY7CisJCXVhcnRfYWRkX29uZV9wb3J0KCZzZXJpYWw4MjUwX3JlZywgJnVhcnQtPnBvcnQpOwor CX0gZWxzZSB7CisJCXVhcnQtPnBvcnQuZGV2ID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZh c3RfdWFydF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGFzdF91YXJ0X3VucmVnaXN0ZXJfcG9y dCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFzdF91YXJ0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0 OworCisJaWYgKG5yX3VhcnRzID4gVUFSVF9ETUFfTlIpCisJCW5yX3VhcnRzID0gVUFSVF9ETUFf TlI7CisKKwlVQVJUX0RCRyhLRVJOX0lORk8KKwkiYXN0LXVhcnQtZG1hOiBVQVJUIGRyaXZlciB3 aXRoIERNQSAlZCBwb3J0cywgSVJRIHNoYXJpbmcgJXNhYmxlZFxuIiwKKwkJCQkJbnJfdWFydHMs IHNoYXJlX2lycXMgPyAiZW4iIDogImRpcyIpOworCXNwaW5fbG9ja19pbml0KCZhc3RfdWFydF9p cnFbMF0ubG9jayk7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2VyaWFsODI1MF9y ZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc2VyaWFsODI1MF9pc2FfZGV2cyA9IHBs YXRmb3JtX2RldmljZV9hbGxvYygiYXN0LXVhcnQtZG1hIiwKKwkJCQkJCSAgICBQTEFUODI1MF9E RVZfTEVHQUNZKTsKKwlpZiAoIXNlcmlhbDgyNTBfaXNhX2RldnMpIHsKKwkJcmV0ID0gLUVOT01F TTsKKwkJZ290byB1bnJlZ191YXJ0X2RydjsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2Vf YWRkKHNlcmlhbDgyNTBfaXNhX2RldnMpOworCWlmIChyZXQpCisJCWdvdG8gcHV0X2RldjsKKwor CXNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydHMoJnNlcmlhbDgyNTBfcmVnLCAmc2VyaWFsODI1MF9p c2FfZGV2cy0+ZGV2KTsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2VyaWFs ODI1MF9hc3RfZG1hX2RyaXZlcik7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCXBs YXRmb3JtX2RldmljZV9kZWwoc2VyaWFsODI1MF9pc2FfZGV2cyk7CisgcHV0X2RldjoKKwlwbGF0 Zm9ybV9kZXZpY2VfcHV0KHNlcmlhbDgyNTBfaXNhX2RldnMpOworIHVucmVnX3VhcnRfZHJ2Ogor CXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbDgyNTBfcmVnKTsKKyBvdXQ6CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFzdF91YXJ0X2V4aXQodm9pZCkKK3sKKwlz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppc2FfZGV2ID0gc2VyaWFsODI1MF9pc2FfZGV2czsKKwor CS8qCisJICogVGhpcyB0ZWxscyBzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydCgpIG5vdCB0byBy ZS1yZWdpc3RlcgorCSAqIHRoZSBwb3J0cyAodGhlcmVieSBtYWtpbmcgc2VyaWFsODI1MF9hc3Rf ZG1hX2RyaXZlciBwZXJtYW5lbnRseQorCSAqIGluIHVzZS4pCisJICovCisJc2VyaWFsODI1MF9p c2FfZGV2cyA9IE5VTEw7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2VyaWFsODI1 MF9hc3RfZG1hX2RyaXZlcik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaXNhX2Rldik7 CisKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWw4MjUwX3JlZyk7Cit9CisKK2xhdGVf aW5pdGNhbGwoYXN0X3VhcnRfaW5pdCk7Cittb2R1bGVfZXhpdChhc3RfdWFydF9leGl0KTsKKwor TU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU1QgRE1BIHNlcmlh bCBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKFRUWV9NQUpPUik7Cg==