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: [09/11] usb: musb: break the huge isr musb_stage0_irq() into small functions From: Bin Liu Message-Id: <1523906111-2328-10-git-send-email-b-liu@ti.com> Date: Mon, 16 Apr 2018 14:15:09 -0500 To: linux-usb@vger.kernel.org Cc: Bin Liu List-ID: bXVzYl9zdGFnZTBfaXJxKCkgaXMgNDAwKyBsaW5lcyBsb25nLiBCcmVhayBpdHMgaW50ZXJydXB0 IGV2ZW50cwpoYW5kbGluZyBpbnRvIGVhY2ggaW5kaXZpZHVhbCBmdW5jdGlvbnMgdG8gbWFrZSBp dCBlYXN5IHRvIHJlYWQuCgpTaWduZWQtb2ZmLWJ5OiBCaW4gTGl1IDxiLWxpdUB0aS5jb20+Ci0t LQogZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyB8IDczMCArKysrKysrKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzg0IGluc2VydGlvbnMo KyksIDM0NiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2Jf Y29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCBjZTU0ZjQ4MzE0ZTEu LmEzYTcxNjE5N2RjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwor KysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC01MjMsNiArNTIzLDM4MyBAQCB2 b2lkIG11c2JfaG5wX3N0b3Aoc3RydWN0IG11c2IgKm11c2IpCiAKIHN0YXRpYyB2b2lkIG11c2Jf cmVjb3Zlcl9mcm9tX2JhYmJsZShzdHJ1Y3QgbXVzYiAqbXVzYik7CiAKK3N0YXRpYyB2b2lkIG11 c2JfaGFuZGxlX2ludHJfcmVzdW1lKHN0cnVjdCBtdXNiICptdXNiLCB1OCBkZXZjdGwpCit7CisJ bXVzYl9kYmcobXVzYiwgIlJFU1VNRSAoJXMpIiwKKwkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11 c2ItPnhjZWl2LT5vdGctPnN0YXRlKSk7CisKKwlpZiAoZGV2Y3RsICYgTVVTQl9ERVZDVExfSE0p IHsKKwkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgeworCQljYXNlIE9UR19TVEFU RV9BX1NVU1BFTkQ6CisJCQkvKiByZW1vdGUgd2FrZXVwPyAqLworCQkJbXVzYi0+cG9ydDFfc3Rh dHVzIHw9CisJCQkJCShVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCA8PCAxNikKKwkJCQkJfCBNVVNC X1BPUlRfU1RBVF9SRVNVTUU7CisJCQltdXNiLT5yaF90aW1lciA9IGppZmZpZXMKKwkJCQkrIG1z ZWNzX3RvX2ppZmZpZXMoVVNCX1JFU1VNRV9USU1FT1VUKTsKKwkJCW11c2ItPnhjZWl2LT5vdGct PnN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsKKwkJCW11c2ItPmlzX2FjdGl2ZSA9IDE7CisJCQlt dXNiX2hvc3RfcmVzdW1lX3Jvb3RfaHViKG11c2IpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3Jr KCZtdXNiLT5maW5pc2hfcmVzdW1lX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhVU0JfUkVT VU1FX1RJTUVPVVQpKTsKKwkJCWJyZWFrOworCQljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoK KwkJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwkJ CW11c2ItPmlzX2FjdGl2ZSA9IDE7CisJCQlNVVNCX0RFVl9NT0RFKG11c2IpOworCQkJYnJlYWs7 CisJCWRlZmF1bHQ6CisJCQlXQVJOSU5HKCJib2d1cyAlcyBSRVNVTUUgKCVzKVxuIiwKKwkJCQki aG9zdCIsCisJCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUp KTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpIHsK KwkJY2FzZSBPVEdfU1RBVEVfQV9TVVNQRU5EOgorCQkJLyogcG9zc2libHkgRElTQ09OTkVDVCBp cyB1cGNvbWluZyAqLworCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQV9I T1NUOworCQkJbXVzYl9ob3N0X3Jlc3VtZV9yb290X2h1YihtdXNiKTsKKwkJCWJyZWFrOworCQlj YXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKKwkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFM OgorCQkJLyogZGlzY29ubmVjdCB3aGlsZSBzdXNwZW5kZWQ/ICB3ZSBtYXkKKwkJCSAqIG5vdCBn ZXQgYSBkaXNjb25uZWN0IGlycS4uLgorCQkJICovCisJCQlpZiAoKGRldmN0bCAmIE1VU0JfREVW Q1RMX1ZCVVMpCisJCQkJCSE9ICgzIDw8IE1VU0JfREVWQ1RMX1ZCVVNfU0hJRlQpCisJCQkJCSkg eworCQkJCW11c2ItPmludF91c2IgfD0gTVVTQl9JTlRSX0RJU0NPTk5FQ1Q7CisJCQkJbXVzYi0+ aW50X3VzYiAmPSB+TVVTQl9JTlRSX1NVU1BFTkQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQltdXNi X2dfcmVzdW1lKG11c2IpOworCQkJYnJlYWs7CisJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJ CW11c2ItPmludF91c2IgJj0gfk1VU0JfSU5UUl9TVVNQRU5EOworCQkJYnJlYWs7CisJCWRlZmF1 bHQ6CisJCQlXQVJOSU5HKCJib2d1cyAlcyBSRVNVTUUgKCVzKVxuIiwKKwkJCQkicGVyaXBoZXJh bCIsCisJCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsK KwkJfQorCX0KK30KKworLyogcmV0dXJuIElSUV9IQU5ETEVEIHRvIHRlbGwgdGhlIGNhbGxlciB0 byByZXR1cm4gaW1tZWRpYXRlbHkgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtdXNiX2hhbmRsZV9p bnRyX3Nlc3NyZXEoc3RydWN0IG11c2IgKm11c2IsIHU4IGRldmN0bCkKK3sKKwl2b2lkIF9faW9t ZW0gKm1iYXNlID0gbXVzYi0+bXJlZ3M7CisKKwlpZiAoKGRldmN0bCAmIE1VU0JfREVWQ1RMX1ZC VVMpID09IE1VU0JfREVWQ1RMX1ZCVVMKKwkJCSYmIChkZXZjdGwgJiBNVVNCX0RFVkNUTF9CREVW SUNFKSkgeworCQltdXNiX2RiZyhtdXNiLCAiU2Vzc1JlcSB3aGlsZSBvbiBCIHN0YXRlIik7CisJ CXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwltdXNiX2RiZyhtdXNiLCAiU0VTU0lPTl9SRVFV RVNUICglcykiLAorCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0 ZSkpOworCisJLyogSVJRIGFycml2ZXMgZnJvbSBJRCBwaW4gc2Vuc2Ugb3IgKGxhdGVyLCBpZiBW QlVTIHBvd2VyCisJICogaXMgcmVtb3ZlZCkgU1JQLiAgcmVzcG9uc2VzIGFyZSB0aW1lIGNyaXRp Y2FsOgorCSAqICAtIHR1cm4gb24gVkJVUyAod2l0aCBzaWxpY29uLXNwZWNpZmljIG1lY2hhbmlz bSkKKwkgKiAgLSBnbyB0aHJvdWdoIEFfV0FJVF9WUklTRQorCSAqICAtIC4uLiB0byBBX1dBSVRf QkNPTi4KKwkgKiBhX3dhaXRfdnJpc2VfdG1vdXQgdHJpZ2dlcnMgVkJVU19FUlJPUiB0cmFuc2l0 aW9ucworCSAqLworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0RFVkNUTCwgTVVTQl9ERVZDVExf U0VTU0lPTik7CisJbXVzYi0+ZXAwX3N0YWdlID0gTVVTQl9FUDBfU1RBUlQ7CisJbXVzYi0+eGNl aXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQV9JRExFOworCU1VU0JfSFNUX01PREUobXVzYik7 CisJbXVzYl9wbGF0Zm9ybV9zZXRfdmJ1cyhtdXNiLCAxKTsKKworCXJldHVybiBJUlFfTk9ORTsK K30KKworc3RhdGljIHZvaWQgbXVzYl9oYW5kbGVfaW50cl92YnVzZXJyKHN0cnVjdCBtdXNiICpt dXNiLCB1OCBkZXZjdGwpCit7CisJaW50CWlnbm9yZSA9IDA7CisKKwkvKiBEdXJpbmcgY29ubmVj dGlvbiBhcyBhbiBBLURldmljZSwgd2UgbWF5IHNlZSBhIHNob3J0CisJICogY3VycmVudCBzcGlr ZXMgY2F1c2luZyB2b2x0YWdlIGRyb3AsIGJlY2F1c2Ugb2YgY2FibGUKKwkgKiBhbmQgcGVyaXBo ZXJhbCBjYXBhY2l0YW5jZSBjb21iaW5lZCB3aXRoIHZidXMgZHJhdy4KKwkgKiAoU286IGxlc3Mg Y29tbW9uIHdpdGggdHJ1bHkgc2VsZi1wb3dlcmVkIGRldmljZXMsIHdoZXJlCisJICogdmJ1cyBk b2Vzbid0IGFjdCBsaWtlIGEgcG93ZXIgc3VwcGx5LikKKwkgKgorCSAqIFN1Y2ggc3Bpa2VzIGFy ZSBzaG9ydDsgdXN1YWxseSBsZXNzIHRoYW4gfjUwMCB1c2VjLCBtYXgKKwkgKiBvZiB+MiBtc2Vj LiAgVGhhdCBpcywgdGhleSdyZSBub3Qgc3VzdGFpbmVkIG92ZXJjdXJyZW50CisJICogZXJyb3Jz LCB0aG91Z2ggdGhleSdyZSByZXBvcnRlZCB1c2luZyBWQlVTRVJST1IgaXJxcy4KKwkgKgorCSAq IFdvcmthcm91bmRzOiAgKGEpIGhhcmR3YXJlOiB1c2Ugc2VsZiBwb3dlcmVkIGRldmljZXMuCisJ ICogKGIpIHNvZnR3YXJlOiAgaWdub3JlIG5vbi1yZXBlYXRlZCBWQlVTIGVycm9ycy4KKwkgKgor CSAqIFJFVklTSVQ6ICBkbyBkZWxheXMgZnJvbSBsb3RzIG9mIERFQlVHX0tFUk5FTCBjaGVja3MK KwkgKiBtYWtlIHRyb3VibGUgaGVyZSwga2VlcGluZyBWQlVTIDwgNC40ViA/CisJICovCisJc3dp dGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0FfSE9TVDoK KwkJLyogcmVjb3ZlcnkgaXMgZGljZXkgb25jZSB3ZSd2ZSBnb3R0ZW4gcGFzdCB0aGUKKwkJICog aW5pdGlhbCBzdGFnZXMgb2YgZW51bWVyYXRpb24sIGJ1dCBpZiBWQlVTCisJCSAqIHN0YXllZCBv ayBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBsaW5rLCBhbmQKKwkJICogYW5vdGhlciByZXNldCBp cyBkdWUgKGF0IGxlYXN0IGZvciBoaWdoIHNwZWVkLAorCQkgKiB0byByZWRvIHRoZSBjaGlycCBl dGMpLCBpdCBtaWdodCB3b3JrIE9LLi4uCisJCSAqLworCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9C Q09OOgorCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9WUklTRToKKwkJaWYgKG11c2ItPnZidXNlcnJf cmV0cnkpIHsKKwkJCXZvaWQgX19pb21lbSAqbWJhc2UgPSBtdXNiLT5tcmVnczsKKworCQkJbXVz Yi0+dmJ1c2Vycl9yZXRyeS0tOworCQkJaWdub3JlID0gMTsKKwkJCWRldmN0bCB8PSBNVVNCX0RF VkNUTF9TRVNTSU9OOworCQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfREVWQ1RMLCBkZXZjdGwp OworCQl9IGVsc2UgeworCQkJbXVzYi0+cG9ydDFfc3RhdHVzIHw9CisJCQkJICBVU0JfUE9SVF9T VEFUX09WRVJDVVJSRU5UCisJCQkJfCAoVVNCX1BPUlRfU1RBVF9DX09WRVJDVVJSRU5UIDw8IDE2 KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlkZXZfcHJpbnRr KGlnbm9yZSA/IEtFUk5fREVCVUcgOiBLRVJOX0VSUiwgbXVzYi0+Y29udHJvbGxlciwKKwkJCSJW QlVTX0VSUk9SIGluICVzICglMDJ4LCAlcyksIHJldHJ5ICMlZCwgcG9ydDEgJTA4eFxuIiwKKwkJ CXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSwKKwkJCWRldmN0 bCwKKwkJCSh7IGNoYXIgKnM7CisJCQlzd2l0Y2ggKGRldmN0bCAmIE1VU0JfREVWQ1RMX1ZCVVMp IHsKKwkJCWNhc2UgMCA8PCBNVVNCX0RFVkNUTF9WQlVTX1NISUZUOgorCQkJCXMgPSAiPFNlc3NF bmQiOyBicmVhazsKKwkJCWNhc2UgMSA8PCBNVVNCX0RFVkNUTF9WQlVTX1NISUZUOgorCQkJCXMg PSAiPEFWYWxpZCI7IGJyZWFrOworCQkJY2FzZSAyIDw8IE1VU0JfREVWQ1RMX1ZCVVNfU0hJRlQ6 CisJCQkJcyA9ICI8VkJ1c1ZhbGlkIjsgYnJlYWs7CisJCQkvKiBjYXNlIDMgPDwgTVVTQl9ERVZD VExfVkJVU19TSElGVDogKi8KKwkJCWRlZmF1bHQ6CisJCQkJcyA9ICJWQUxJRCI7IGJyZWFrOwor CQkJfSBzOyB9KSwKKwkJCVZCVVNFUlJfUkVUUllfQ09VTlQgLSBtdXNiLT52YnVzZXJyX3JldHJ5 LAorCQkJbXVzYi0+cG9ydDFfc3RhdHVzKTsKKworCS8qIGdvIHRocm91Z2ggQV9XQUlUX1ZGQUxM IHRoZW4gc3RhcnQgYSBuZXcgc2Vzc2lvbiAqLworCWlmICghaWdub3JlKQorCQltdXNiX3BsYXRm b3JtX3NldF92YnVzKG11c2IsIDApOworfQorCitzdGF0aWMgdm9pZCBtdXNiX2hhbmRsZV9pbnRy X3N1c3BlbmQoc3RydWN0IG11c2IgKm11c2IsIHU4IGRldmN0bCkKK3sKKwltdXNiX2RiZyhtdXNi LCAiU1VTUEVORCAoJXMpIGRldmN0bCAlMDJ4IiwKKwkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVz Yi0+eGNlaXYtPm90Zy0+c3RhdGUpLCBkZXZjdGwpOworCisJc3dpdGNoIChtdXNiLT54Y2Vpdi0+ b3RnLT5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKKwkJLyogV2UgYWxz byBjb21lIGhlcmUgaWYgdGhlIGNhYmxlIGlzIHJlbW92ZWQsIHNpbmNlCisJCSAqIHRoaXMgc2ls aWNvbiBkb2Vzbid0IHJlcG9ydCBJRC1uby1sb25nZXItZ3JvdW5kZWQuCisJCSAqCisJCSAqIFdl IGRlcGVuZCBvbiBUKGFfd2FpdF9iY29uKSB0byBzaHV0IHVzIGRvd24sIGFuZAorCQkgKiBob3Bl IHVzZXJzIGRvbid0IGRvIGFueXRoaW5nIGRpY2V5IGR1cmluZyB0aGlzCisJCSAqIHVuZGVzaXJl ZCBkZXRvdXIgdGhyb3VnaCBBX1dBSVRfQkNPTi4KKwkJICovCisJCW11c2JfaG5wX3N0b3AobXVz Yik7CisJCW11c2JfaG9zdF9yZXN1bWVfcm9vdF9odWIobXVzYik7CisJCW11c2Jfcm9vdF9kaXNj b25uZWN0KG11c2IpOworCQltdXNiX3BsYXRmb3JtX3RyeV9pZGxlKG11c2IsIGppZmZpZXMKKwkJ CQkrIG1zZWNzX3RvX2ppZmZpZXMobXVzYi0+YV93YWl0X2Jjb24KKwkJCQkJPyA6IE9UR19USU1F X0FfV0FJVF9CQ09OKSk7CisKKwkJYnJlYWs7CisJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgorCQlp ZiAoIW11c2ItPmlzX2FjdGl2ZSkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlj YXNlIE9UR19TVEFURV9CX1BFUklQSEVSQUw6CisJCW11c2JfZ19zdXNwZW5kKG11c2IpOworCQlt dXNiLT5pc19hY3RpdmUgPSBtdXNiLT5nLmJfaG5wX2VuYWJsZTsKKwkJaWYgKG11c2ItPmlzX2Fj dGl2ZSkgeworCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9XQUlUX0FD T047CisJCQltdXNiX2RiZyhtdXNiLCAiSE5QOiBTZXR0aW5nIHRpbWVyIGZvciBiX2FzZTBfYnJz dCIpOworCQkJbW9kX3RpbWVyKCZtdXNiLT5vdGdfdGltZXIsIGppZmZpZXMKKwkJCQkrIG1zZWNz X3RvX2ppZmZpZXMoCisJCQkJCQlPVEdfVElNRV9CX0FTRTBfQlJTVCkpOworCQl9CisJCWJyZWFr OworCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgorCQlpZiAobXVzYi0+YV93YWl0X2Jjb24g IT0gMCkKKwkJCW11c2JfcGxhdGZvcm1fdHJ5X2lkbGUobXVzYiwgamlmZmllcworCQkJCSsgbXNl Y3NfdG9famlmZmllcyhtdXNiLT5hX3dhaXRfYmNvbikpOworCQlicmVhazsKKwljYXNlIE9UR19T VEFURV9BX0hPU1Q6CisJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfU1VT UEVORDsKKwkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+aGNkLT5zZWxmLmJfaG5wX2VuYWJsZTsK KwkJYnJlYWs7CisJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgorCQkvKiBUcmFuc2l0aW9uIHRvIEJf UEVSSVBIRVJBTCwgc2VlIDYuOC4yLjYgcCA0NCAqLworCQltdXNiX2RiZyhtdXNiLCAiUkVWSVNJ VDogU1VTUEVORCBhcyBCX0hPU1QiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogInNob3Vs ZCBub3QgaGFwcGVuIiAqLworCQltdXNiLT5pc19hY3RpdmUgPSAwOworCQlicmVhazsKKwl9Cit9 CisKK3N0YXRpYyB2b2lkIG11c2JfaGFuZGxlX2ludHJfY29ubmVjdChzdHJ1Y3QgbXVzYiAqbXVz YiwgdTggZGV2Y3RsLCB1OCBpbnRfdXNiKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBtdXNi LT5oY2Q7CisKKwltdXNiLT5pc19hY3RpdmUgPSAxOworCW11c2ItPmVwMF9zdGFnZSA9IE1VU0Jf RVAwX1NUQVJUOworCisJbXVzYi0+aW50cnR4ZSA9IG11c2ItPmVwbWFzazsKKwltdXNiX3dyaXRl dyhtdXNiLT5tcmVncywgTVVTQl9JTlRSVFhFLCBtdXNiLT5pbnRydHhlKTsKKwltdXNiLT5pbnRy cnhlID0gbXVzYi0+ZXBtYXNrICYgMHhmZmZlOworCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBN VVNCX0lOVFJSWEUsIG11c2ItPmludHJyeGUpOworCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBN VVNCX0lOVFJVU0JFLCAweGY3KTsKKwltdXNiLT5wb3J0MV9zdGF0dXMgJj0gfihVU0JfUE9SVF9T VEFUX0xPV19TUEVFRAorCQkJCXxVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQKKwkJCQl8VVNCX1BP UlRfU1RBVF9FTkFCTEUKKwkJCQkpOworCW11c2ItPnBvcnQxX3N0YXR1cyB8PSBVU0JfUE9SVF9T VEFUX0NPTk5FQ1RJT04KKwkJCQl8KFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIDw8IDE2KTsK KworCS8qIGhpZ2ggdnMgZnVsbCBzcGVlZCBpcyBqdXN0IGEgZ3Vlc3MgdW50aWwgYWZ0ZXIgcmVz ZXQgKi8KKwlpZiAoZGV2Y3RsICYgTVVTQl9ERVZDVExfTFNERVYpCisJCW11c2ItPnBvcnQxX3N0 YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKworCS8qIGluZGljYXRlIG5ldyBjb25u ZWN0aW9uIHRvIE9URyBtYWNoaW5lICovCisJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0 ZSkgeworCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKKwkJaWYgKGludF91c2IgJiBNVVNC X0lOVFJfU1VTUEVORCkgeworCQkJbXVzYl9kYmcobXVzYiwgIkhOUDogU1VTUEVORCtDT05ORUNU LCBub3cgYl9ob3N0Iik7CisJCQlpbnRfdXNiICY9IH5NVVNCX0lOVFJfU1VTUEVORDsKKwkJCWdv dG8gYl9ob3N0OworCQl9IGVsc2UKKwkJCW11c2JfZGJnKG11c2IsICJDT05ORUNUIGFzIGJfcGVy aXBoZXJhbD8/PyIpOworCQlicmVhazsKKwljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKKwkJ bXVzYl9kYmcobXVzYiwgIkhOUDogQ09OTkVDVCwgbm93IGJfaG9zdCIpOworYl9ob3N0OgorCQlt dXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9CX0hPU1Q7CisJCWlmIChtdXNiLT5o Y2QpCisJCQltdXNiLT5oY2QtPnNlbGYuaXNfYl9ob3N0ID0gMTsKKwkJZGVsX3RpbWVyKCZtdXNi LT5vdGdfdGltZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoKGRldmN0bCAmIE1VU0Jf REVWQ1RMX1ZCVVMpCisJCQkJPT0gKDMgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkpIHsKKwkJ CW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsKKwkJCWlmIChoY2Qp CisJCQkJaGNkLT5zZWxmLmlzX2JfaG9zdCA9IDA7CisJCX0KKwkJYnJlYWs7CisJfQorCisJbXVz Yl9ob3N0X3Bva2Vfcm9vdF9odWIobXVzYik7CisKKwltdXNiX2RiZyhtdXNiLCAiQ09OTkVDVCAo JXMpIGRldmN0bCAlMDJ4IiwKKwkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5v dGctPnN0YXRlKSwgZGV2Y3RsKTsKK30KKworc3RhdGljIHZvaWQgbXVzYl9oYW5kbGVfaW50cl9k aXNjb25uZWN0KHN0cnVjdCBtdXNiICptdXNiLCB1OCBkZXZjdGwpCit7CisJbXVzYl9kYmcobXVz YiwgIkRJU0NPTk5FQ1QgKCVzKSBhcyAlcywgZGV2Y3RsICUwMngiLAorCQkJdXNiX290Z19zdGF0 ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpLAorCQkJTVVTQl9NT0RFKG11c2IpLCBk ZXZjdGwpOworCisJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgeworCWNhc2UgT1RH X1NUQVRFX0FfSE9TVDoKKwljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6CisJCW11c2JfaG9zdF9y ZXN1bWVfcm9vdF9odWIobXVzYik7CisJCW11c2Jfcm9vdF9kaXNjb25uZWN0KG11c2IpOworCQlp ZiAobXVzYi0+YV93YWl0X2Jjb24gIT0gMCkKKwkJCW11c2JfcGxhdGZvcm1fdHJ5X2lkbGUobXVz YiwgamlmZmllcworCQkJCSsgbXNlY3NfdG9famlmZmllcyhtdXNiLT5hX3dhaXRfYmNvbikpOwor CQlicmVhazsKKwljYXNlIE9UR19TVEFURV9CX0hPU1Q6CisJCS8qIFJFVklTSVQgdGhpcyBiZWhh dmVzIGZvciAicmVhbCBkaXNjb25uZWN0IgorCQkgKiBjYXNlczsgbWFrZSBzdXJlIHRoZSBvdGhl ciB0cmFuc2l0aW9ucyBmcm9tCisJCSAqIGZyb20gQl9IT1NUIGFjdCByaWdodCB0b28uICBUaGUg Ql9IT1NUIGNvZGUKKwkJICogaW4gaG5wX3N0b3AoKSBpcyBjdXJyZW50bHkgbm90IHVzZWQuLi4K KwkJICovCisJCW11c2Jfcm9vdF9kaXNjb25uZWN0KG11c2IpOworCQlpZiAobXVzYi0+aGNkKQor CQkJbXVzYi0+aGNkLT5zZWxmLmlzX2JfaG9zdCA9IDA7CisJCW11c2ItPnhjZWl2LT5vdGctPnN0 YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwkJTVVTQl9ERVZfTU9ERShtdXNiKTsKKwkJ bXVzYl9nX2Rpc2Nvbm5lY3QobXVzYik7CisJCWJyZWFrOworCWNhc2UgT1RHX1NUQVRFX0FfUEVS SVBIRVJBTDoKKwkJbXVzYl9obnBfc3RvcChtdXNiKTsKKwkJbXVzYl9yb290X2Rpc2Nvbm5lY3Qo bXVzYik7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046 CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgorCWNh c2UgT1RHX1NUQVRFX0JfSURMRToKKwkJbXVzYl9nX2Rpc2Nvbm5lY3QobXVzYik7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCVdBUk5JTkcoInVuaGFuZGxlZCBESVNDT05ORUNUIHRyYW5zaXRpb24g KCVzKVxuIiwKKwkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRl KSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIG1lbnRvciBzYXZlcyBhIGJpdDogYnVzIHJl c2V0IGFuZCBiYWJibGUgc2hhcmUgdGhlIHNhbWUgaXJxLgorICogb25seSBob3N0IHNlZXMgYmFi YmxlOyBvbmx5IHBlcmlwaGVyYWwgc2VlcyBidXMgcmVzZXQuCisgKi8KK3N0YXRpYyB2b2lkIG11 c2JfaGFuZGxlX2ludHJfcmVzZXQoc3RydWN0IG11c2IgKm11c2IpCit7CisJaWYgKGlzX2hvc3Rf YWN0aXZlKG11c2IpKSB7CisJCS8qCisJCSAqIFdoZW4gQkFCQkxFIGhhcHBlbnMgd2hhdCB3ZSBj YW4gZGVwZW5kcyBvbiB3aGljaAorCQkgKiBwbGF0Zm9ybSBNVVNCIGlzIHJ1bm5pbmcsIGJlY2F1 c2Ugc29tZSBwbGF0Zm9ybXMKKwkJICogaW1wbGVtZW50ZWQgcHJvcHJpZXRhcnkgbWVhbnMgZm9y ICdyZWNvdmVyaW5nJyBmcm9tCisJCSAqIEJhYmJsZSBjb25kaXRpb25zLiBPbmUgc3VjaCBwbGF0 Zm9ybSBpcyBBTTMzNXguIEluCisJCSAqIG1vc3QgY2FzZXMsIGhvd2V2ZXIsIHRoZSBvbmx5IHRo aW5nIHdlIGNhbiBkbyBpcworCQkgKiBkcm9wIHRoZSBzZXNzaW9uLgorCQkgKi8KKwkJZGV2X2Vy cihtdXNiLT5jb250cm9sbGVyLCAiQmFiYmxlXG4iKTsKKwkJbXVzYl9yZWNvdmVyX2Zyb21fYmFi YmxlKG11c2IpOworCX0gZWxzZSB7CisJCW11c2JfZGJnKG11c2IsICJCVVMgUkVTRVQgYXMgJXMi LAorCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKKwkJ c3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgeworCQljYXNlIE9UR19TVEFURV9BX1NV U1BFTkQ6CisJCQltdXNiX2dfcmVzZXQobXVzYik7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlj YXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoJLyogT1BUIFRELjQuNy05MDBtcyAqLworCQkJLyog bmV2ZXIgdXNlIGludmFsaWQgVChhX3dhaXRfYmNvbikgKi8KKwkJCW11c2JfZGJnKG11c2IsICJI TlA6IGluICVzLCAlZCBtc2VjIHRpbWVvdXQiLAorCQkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11 c2ItPnhjZWl2LT5vdGctPnN0YXRlKSwKKwkJCQlUQV9XQUlUX0JDT04obXVzYikpOworCQkJbW9k X3RpbWVyKCZtdXNiLT5vdGdfdGltZXIsIGppZmZpZXMKKwkJCQkrIG1zZWNzX3RvX2ppZmZpZXMo VEFfV0FJVF9CQ09OKG11c2IpKSk7CisJCQlicmVhazsKKwkJY2FzZSBPVEdfU1RBVEVfQV9QRVJJ UEhFUkFMOgorCQkJZGVsX3RpbWVyKCZtdXNiLT5vdGdfdGltZXIpOworCQkJbXVzYl9nX3Jlc2V0 KG11c2IpOworCQkJYnJlYWs7CisJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgorCQkJbXVz Yl9kYmcobXVzYiwgIkhOUDogUkVTRVQgKCVzKSwgdG8gYl9wZXJpcGhlcmFsIiwKKwkJCQl1c2Jf b3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkpOworCQkJbXVzYi0+eGNl aXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCQkJbXVzYl9nX3Jlc2V0 KG11c2IpOworCQkJYnJlYWs7CisJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwkJCW11c2ItPnhj ZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKKwkJCS8qIEZBTExUSFJP VUdIICovCisJCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKKwkJCW11c2JfZ19yZXNldCht dXNiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXVzYl9kYmcobXVzYiwgIlVuaGFuZGxl ZCBCVVMgUkVTRVQgYXMgJXMiLAorCQkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2 LT5vdGctPnN0YXRlKSk7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBJbnRlcnJ1cHQgU2VydmljZSBS b3V0aW5lIHRvIHJlY29yZCBVU0IgImdsb2JhbCIgaW50ZXJydXB0cy4KICAqIFNpbmNlIHRoZXNl IGRvIG5vdCBoYXBwZW4gb2Z0ZW4gYW5kIHNpZ25pZnkgdGhpbmdzIG9mCkBAIC01NDcsMzc5ICs5 MjQsNDAgQEAgc3RhdGljIGlycXJldHVybl90IG11c2Jfc3RhZ2UwX2lycShzdHJ1Y3QgbXVzYiAq bXVzYiwgdTggaW50X3VzYiwKIAkgKiBzcHVyaW91cyBSRVNVTUUgaXJxcyBoYXBwZW4gdG9vLCBw YWlyZWQgd2l0aCBTVVNQRU5ELgogCSAqLwogCWlmIChpbnRfdXNiICYgTVVTQl9JTlRSX1JFU1VN RSkgeworCQltdXNiX2hhbmRsZV9pbnRyX3Jlc3VtZShtdXNiLCBkZXZjdGwpOwogCQloYW5kbGVk ID0gSVJRX0hBTkRMRUQ7Ci0JCW11c2JfZGJnKG11c2IsICJSRVNVTUUgKCVzKSIsCi0JCQkJdXNi X290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQotCQlpZiAoZGV2 Y3RsICYgTVVTQl9ERVZDVExfSE0pIHsKLQkJCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+c3Rh dGUpIHsKLQkJCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKLQkJCQkvKiByZW1vdGUgd2FrZXVw PyAqLwotCQkJCW11c2ItPnBvcnQxX3N0YXR1cyB8PQotCQkJCQkJKFVTQl9QT1JUX1NUQVRfQ19T VVNQRU5EIDw8IDE2KQotCQkJCQkJfCBNVVNCX1BPUlRfU1RBVF9SRVNVTUU7Ci0JCQkJbXVzYi0+ cmhfdGltZXIgPSBqaWZmaWVzCi0JCQkJCSsgbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJ TUVPVVQpOwotCQkJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfSE9TVDsK LQkJCQltdXNiLT5pc19hY3RpdmUgPSAxOwotCQkJCW11c2JfaG9zdF9yZXN1bWVfcm9vdF9odWIo bXVzYik7Ci0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtdXNiLT5maW5pc2hfcmVzdW1lX3dv cmssCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoVVNCX1JFU1VNRV9USU1FT1VUKSk7Ci0JCQkJYnJl YWs7Ci0JCQljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKLQkJCQltdXNiLT54Y2Vpdi0+b3Rn LT5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7Ci0JCQkJbXVzYi0+aXNfYWN0aXZlID0g MTsKLQkJCQlNVVNCX0RFVl9NT0RFKG11c2IpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJ CQlXQVJOSU5HKCJib2d1cyAlcyBSRVNVTUUgKCVzKVxuIiwKLQkJCQkJImhvc3QiLAotCQkJCQl1 c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkpOwotCQkJfQotCQl9 IGVsc2UgewotCQkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgewotCQkJY2FzZSBP VEdfU1RBVEVfQV9TVVNQRU5EOgotCQkJCS8qIHBvc3NpYmx5IERJU0NPTk5FQ1QgaXMgdXBjb21p bmcgKi8KLQkJCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9BX0hPU1Q7Ci0J CQkJbXVzYl9ob3N0X3Jlc3VtZV9yb290X2h1YihtdXNiKTsKLQkJCQlicmVhazsKLQkJCWNhc2Ug T1RHX1NUQVRFX0JfV0FJVF9BQ09OOgotCQkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgot CQkJCS8qIGRpc2Nvbm5lY3Qgd2hpbGUgc3VzcGVuZGVkPyAgd2UgbWF5Ci0JCQkJICogbm90IGdl dCBhIGRpc2Nvbm5lY3QgaXJxLi4uCi0JCQkJICovCi0JCQkJaWYgKChkZXZjdGwgJiBNVVNCX0RF VkNUTF9WQlVTKQotCQkJCQkJIT0gKDMgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkKLQkJCQkJ CSkgewotCQkJCQltdXNiLT5pbnRfdXNiIHw9IE1VU0JfSU5UUl9ESVNDT05ORUNUOwotCQkJCQlt dXNiLT5pbnRfdXNiICY9IH5NVVNCX0lOVFJfU1VTUEVORDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQot CQkJCW11c2JfZ19yZXN1bWUobXVzYik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9UR19TVEFURV9C X0lETEU6Ci0JCQkJbXVzYi0+aW50X3VzYiAmPSB+TVVTQl9JTlRSX1NVU1BFTkQ7Ci0JCQkJYnJl YWs7Ci0JCQlkZWZhdWx0OgotCQkJCVdBUk5JTkcoImJvZ3VzICVzIFJFU1VNRSAoJXMpXG4iLAot CQkJCQkicGVyaXBoZXJhbCIsCi0JCQkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2 LT5vdGctPnN0YXRlKSk7Ci0JCQl9Ci0JCX0KIAl9CiAKIAkvKiBzZWUgbWFudWFsIGZvciB0aGUg b3JkZXIgb2YgdGhlIHRlc3RzICovCiAJaWYgKGludF91c2IgJiBNVVNCX0lOVFJfU0VTU1JFUSkg ewotCQl2b2lkIF9faW9tZW0gKm1iYXNlID0gbXVzYi0+bXJlZ3M7Ci0KLQkJaWYgKChkZXZjdGwg JiBNVVNCX0RFVkNUTF9WQlVTKSA9PSBNVVNCX0RFVkNUTF9WQlVTCi0JCQkJJiYgKGRldmN0bCAm IE1VU0JfREVWQ1RMX0JERVZJQ0UpKSB7Ci0JCQltdXNiX2RiZyhtdXNiLCAiU2Vzc1JlcSB3aGls ZSBvbiBCIHN0YXRlIik7CisJCWlmIChtdXNiX2hhbmRsZV9pbnRyX3Nlc3NyZXEobXVzYiwgZGV2 Y3RsKSkKIAkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCi0JCW11c2JfZGJnKG11c2IsICJT RVNTSU9OX1JFUVVFU1QgKCVzKSIsCi0JCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vp di0+b3RnLT5zdGF0ZSkpOwotCi0JCS8qIElSUSBhcnJpdmVzIGZyb20gSUQgcGluIHNlbnNlIG9y IChsYXRlciwgaWYgVkJVUyBwb3dlcgotCQkgKiBpcyByZW1vdmVkKSBTUlAuICByZXNwb25zZXMg YXJlIHRpbWUgY3JpdGljYWw6Ci0JCSAqICAtIHR1cm4gb24gVkJVUyAod2l0aCBzaWxpY29uLXNw ZWNpZmljIG1lY2hhbmlzbSkKLQkJICogIC0gZ28gdGhyb3VnaCBBX1dBSVRfVlJJU0UKLQkJICog IC0gLi4uIHRvIEFfV0FJVF9CQ09OLgotCQkgKiBhX3dhaXRfdnJpc2VfdG1vdXQgdHJpZ2dlcnMg VkJVU19FUlJPUiB0cmFuc2l0aW9ucwotCQkgKi8KLQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0Jf REVWQ1RMLCBNVVNCX0RFVkNUTF9TRVNTSU9OKTsKLQkJbXVzYi0+ZXAwX3N0YWdlID0gTVVTQl9F UDBfU1RBUlQ7Ci0JCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsK LQkJTVVTQl9IU1RfTU9ERShtdXNiKTsKLQkJbXVzYl9wbGF0Zm9ybV9zZXRfdmJ1cyhtdXNiLCAx KTsKLQogCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CiAJfQogCiAJaWYgKGludF91c2IgJiBNVVNC X0lOVFJfVkJVU0VSUk9SKSB7Ci0JCWludAlpZ25vcmUgPSAwOwotCi0JCS8qIER1cmluZyBjb25u ZWN0aW9uIGFzIGFuIEEtRGV2aWNlLCB3ZSBtYXkgc2VlIGEgc2hvcnQKLQkJICogY3VycmVudCBz cGlrZXMgY2F1c2luZyB2b2x0YWdlIGRyb3AsIGJlY2F1c2Ugb2YgY2FibGUKLQkJICogYW5kIHBl cmlwaGVyYWwgY2FwYWNpdGFuY2UgY29tYmluZWQgd2l0aCB2YnVzIGRyYXcuCi0JCSAqIChTbzog bGVzcyBjb21tb24gd2l0aCB0cnVseSBzZWxmLXBvd2VyZWQgZGV2aWNlcywgd2hlcmUKLQkJICog dmJ1cyBkb2Vzbid0IGFjdCBsaWtlIGEgcG93ZXIgc3VwcGx5LikKLQkJICoKLQkJICogU3VjaCBz cGlrZXMgYXJlIHNob3J0OyB1c3VhbGx5IGxlc3MgdGhhbiB+NTAwIHVzZWMsIG1heAotCQkgKiBv ZiB+MiBtc2VjLiAgVGhhdCBpcywgdGhleSdyZSBub3Qgc3VzdGFpbmVkIG92ZXJjdXJyZW50Ci0J CSAqIGVycm9ycywgdGhvdWdoIHRoZXkncmUgcmVwb3J0ZWQgdXNpbmcgVkJVU0VSUk9SIGlycXMu Ci0JCSAqCi0JCSAqIFdvcmthcm91bmRzOiAgKGEpIGhhcmR3YXJlOiB1c2Ugc2VsZiBwb3dlcmVk IGRldmljZXMuCi0JCSAqIChiKSBzb2Z0d2FyZTogIGlnbm9yZSBub24tcmVwZWF0ZWQgVkJVUyBl cnJvcnMuCi0JCSAqCi0JCSAqIFJFVklTSVQ6ICBkbyBkZWxheXMgZnJvbSBsb3RzIG9mIERFQlVH X0tFUk5FTCBjaGVja3MKLQkJICogbWFrZSB0cm91YmxlIGhlcmUsIGtlZXBpbmcgVkJVUyA8IDQu NFYgPwotCQkgKi8KLQkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgewotCQljYXNl IE9UR19TVEFURV9BX0hPU1Q6Ci0JCQkvKiByZWNvdmVyeSBpcyBkaWNleSBvbmNlIHdlJ3ZlIGdv dHRlbiBwYXN0IHRoZQotCQkJICogaW5pdGlhbCBzdGFnZXMgb2YgZW51bWVyYXRpb24sIGJ1dCBp ZiBWQlVTCi0JCQkgKiBzdGF5ZWQgb2sgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgbGluaywgYW5k Ci0JCQkgKiBhbm90aGVyIHJlc2V0IGlzIGR1ZSAoYXQgbGVhc3QgZm9yIGhpZ2ggc3BlZWQsCi0J CQkgKiB0byByZWRvIHRoZSBjaGlycCBldGMpLCBpdCBtaWdodCB3b3JrIE9LLi4uCi0JCQkgKi8K LQkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046Ci0JCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9W UklTRToKLQkJCWlmIChtdXNiLT52YnVzZXJyX3JldHJ5KSB7Ci0JCQkJdm9pZCBfX2lvbWVtICpt YmFzZSA9IG11c2ItPm1yZWdzOwotCi0JCQkJbXVzYi0+dmJ1c2Vycl9yZXRyeS0tOwotCQkJCWln bm9yZSA9IDE7Ci0JCQkJZGV2Y3RsIHw9IE1VU0JfREVWQ1RMX1NFU1NJT047Ci0JCQkJbXVzYl93 cml0ZWIobWJhc2UsIE1VU0JfREVWQ1RMLCBkZXZjdGwpOwotCQkJfSBlbHNlIHsKLQkJCQltdXNi LT5wb3J0MV9zdGF0dXMgfD0KLQkJCQkJICBVU0JfUE9SVF9TVEFUX09WRVJDVVJSRU5UCi0JCQkJ CXwgKFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCA8PCAxNik7Ci0JCQl9Ci0JCQlicmVhazsK LQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZGV2X3ByaW50ayhpZ25vcmUgPyBLRVJO X0RFQlVHIDogS0VSTl9FUlIsIG11c2ItPmNvbnRyb2xsZXIsCi0JCQkJIlZCVVNfRVJST1IgaW4g JXMgKCUwMngsICVzKSwgcmV0cnkgIyVkLCBwb3J0MSAlMDh4XG4iLAotCQkJCXVzYl9vdGdfc3Rh dGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSwKLQkJCQlkZXZjdGwsCi0JCQkJKHsg Y2hhciAqczsKLQkJCQlzd2l0Y2ggKGRldmN0bCAmIE1VU0JfREVWQ1RMX1ZCVVMpIHsKLQkJCQlj YXNlIDAgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVDoKLQkJCQkJcyA9ICI8U2Vzc0VuZCI7IGJy ZWFrOwotCQkJCWNhc2UgMSA8PCBNVVNCX0RFVkNUTF9WQlVTX1NISUZUOgotCQkJCQlzID0gIjxB VmFsaWQiOyBicmVhazsKLQkJCQljYXNlIDIgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVDoKLQkJ CQkJcyA9ICI8VkJ1c1ZhbGlkIjsgYnJlYWs7Ci0JCQkJLyogY2FzZSAzIDw8IE1VU0JfREVWQ1RM X1ZCVVNfU0hJRlQ6ICovCi0JCQkJZGVmYXVsdDoKLQkJCQkJcyA9ICJWQUxJRCI7IGJyZWFrOwot CQkJCX0gczsgfSksCi0JCQkJVkJVU0VSUl9SRVRSWV9DT1VOVCAtIG11c2ItPnZidXNlcnJfcmV0 cnksCi0JCQkJbXVzYi0+cG9ydDFfc3RhdHVzKTsKLQotCQkvKiBnbyB0aHJvdWdoIEFfV0FJVF9W RkFMTCB0aGVuIHN0YXJ0IGEgbmV3IHNlc3Npb24gKi8KLQkJaWYgKCFpZ25vcmUpCi0JCQltdXNi X3BsYXRmb3JtX3NldF92YnVzKG11c2IsIDApOworCQltdXNiX2hhbmRsZV9pbnRyX3ZidXNlcnIo bXVzYiwgZGV2Y3RsKTsKIAkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOwogCX0KIAogCWlmIChpbnRf dXNiICYgTVVTQl9JTlRSX1NVU1BFTkQpIHsKLQkJbXVzYl9kYmcobXVzYiwgIlNVU1BFTkQgKCVz KSBkZXZjdGwgJTAyeCIsCi0JCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3Rn LT5zdGF0ZSksIGRldmN0bCk7CisJCW11c2JfaGFuZGxlX2ludHJfc3VzcGVuZChtdXNiLCBkZXZj dGwpOwogCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7Ci0KLQkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+ b3RnLT5zdGF0ZSkgewotCQljYXNlIE9UR19TVEFURV9BX1BFUklQSEVSQUw6Ci0JCQkvKiBXZSBh bHNvIGNvbWUgaGVyZSBpZiB0aGUgY2FibGUgaXMgcmVtb3ZlZCwgc2luY2UKLQkJCSAqIHRoaXMg c2lsaWNvbiBkb2Vzbid0IHJlcG9ydCBJRC1uby1sb25nZXItZ3JvdW5kZWQuCi0JCQkgKgotCQkJ ICogV2UgZGVwZW5kIG9uIFQoYV93YWl0X2Jjb24pIHRvIHNodXQgdXMgZG93biwgYW5kCi0JCQkg KiBob3BlIHVzZXJzIGRvbid0IGRvIGFueXRoaW5nIGRpY2V5IGR1cmluZyB0aGlzCi0JCQkgKiB1 bmRlc2lyZWQgZGV0b3VyIHRocm91Z2ggQV9XQUlUX0JDT04uCi0JCQkgKi8KLQkJCW11c2JfaG5w X3N0b3AobXVzYik7Ci0JCQltdXNiX2hvc3RfcmVzdW1lX3Jvb3RfaHViKG11c2IpOwotCQkJbXVz Yl9yb290X2Rpc2Nvbm5lY3QobXVzYik7Ci0JCQltdXNiX3BsYXRmb3JtX3RyeV9pZGxlKG11c2Is IGppZmZpZXMKLQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKG11c2ItPmFfd2FpdF9iY29uCi0JCQkJ CQk/IDogT1RHX1RJTUVfQV9XQUlUX0JDT04pKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1RHX1NU QVRFX0JfSURMRToKLQkJCWlmICghbXVzYi0+aXNfYWN0aXZlKQotCQkJCWJyZWFrOwotCQkJLyog ZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKLQkJCW11c2Jf Z19zdXNwZW5kKG11c2IpOwotCQkJbXVzYi0+aXNfYWN0aXZlID0gbXVzYi0+Zy5iX2hucF9lbmFi bGU7Ci0JCQlpZiAobXVzYi0+aXNfYWN0aXZlKSB7Ci0JCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3Rh dGUgPSBPVEdfU1RBVEVfQl9XQUlUX0FDT047Ci0JCQkJbXVzYl9kYmcobXVzYiwgIkhOUDogU2V0 dGluZyB0aW1lciBmb3IgYl9hc2UwX2Jyc3QiKTsKLQkJCQltb2RfdGltZXIoJm11c2ItPm90Z190 aW1lciwgamlmZmllcwotCQkJCQkrIG1zZWNzX3RvX2ppZmZpZXMoCi0JCQkJCQkJT1RHX1RJTUVf Ql9BU0UwX0JSU1QpKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9UR19TVEFURV9BX1dBSVRf QkNPTjoKLQkJCWlmIChtdXNiLT5hX3dhaXRfYmNvbiAhPSAwKQotCQkJCW11c2JfcGxhdGZvcm1f dHJ5X2lkbGUobXVzYiwgamlmZmllcwotCQkJCQkrIG1zZWNzX3RvX2ppZmZpZXMobXVzYi0+YV93 YWl0X2Jjb24pKTsKLQkJCWJyZWFrOwotCQljYXNlIE9UR19TVEFURV9BX0hPU1Q6Ci0JCQltdXNi LT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9BX1NVU1BFTkQ7Ci0JCQltdXNiLT5pc19h Y3RpdmUgPSBtdXNiLT5oY2QtPnNlbGYuYl9obnBfZW5hYmxlOwotCQkJYnJlYWs7Ci0JCWNhc2Ug T1RHX1NUQVRFX0JfSE9TVDoKLQkJCS8qIFRyYW5zaXRpb24gdG8gQl9QRVJJUEhFUkFMLCBzZWUg Ni44LjIuNiBwIDQ0ICovCi0JCQltdXNiX2RiZyhtdXNiLCAiUkVWSVNJVDogU1VTUEVORCBhcyBC X0hPU1QiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogInNob3VsZCBub3QgaGFwcGVu IiAqLwotCQkJbXVzYi0+aXNfYWN0aXZlID0gMDsKLQkJCWJyZWFrOwotCQl9CiAJfQogCiAJaWYg KGludF91c2IgJiBNVVNCX0lOVFJfQ09OTkVDVCkgewotCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0g bXVzYi0+aGNkOwotCisJCW11c2JfaGFuZGxlX2ludHJfY29ubmVjdChtdXNiLCBkZXZjdGwsIGlu dF91c2IpOwogCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7Ci0JCW11c2ItPmlzX2FjdGl2ZSA9IDE7 Ci0KLQkJbXVzYi0+ZXAwX3N0YWdlID0gTVVTQl9FUDBfU1RBUlQ7Ci0KLQkJbXVzYi0+aW50cnR4 ZSA9IG11c2ItPmVwbWFzazsKLQkJbXVzYl93cml0ZXcobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlRY RSwgbXVzYi0+aW50cnR4ZSk7Ci0JCW11c2ItPmludHJyeGUgPSBtdXNiLT5lcG1hc2sgJiAweGZm ZmU7Ci0JCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWEUsIG11c2ItPmludHJy eGUpOwotCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCRSwgMHhmNyk7Ci0J CW11c2ItPnBvcnQxX3N0YXR1cyAmPSB+KFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECi0JCQkJCXxV U0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQKLQkJCQkJfFVTQl9QT1JUX1NUQVRfRU5BQkxFCi0JCQkJ CSk7Ci0JCW11c2ItPnBvcnQxX3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04KLQkJ CQkJfChVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7Ci0KLQkJLyogaGlnaCB2cyBm dWxsIHNwZWVkIGlzIGp1c3QgYSBndWVzcyB1bnRpbCBhZnRlciByZXNldCAqLwotCQlpZiAoZGV2 Y3RsICYgTVVTQl9ERVZDVExfTFNERVYpCi0JCQltdXNiLT5wb3J0MV9zdGF0dXMgfD0gVVNCX1BP UlRfU1RBVF9MT1dfU1BFRUQ7Ci0KLQkJLyogaW5kaWNhdGUgbmV3IGNvbm5lY3Rpb24gdG8gT1RH IG1hY2hpbmUgKi8KLQkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgewotCQljYXNl IE9UR19TVEFURV9CX1BFUklQSEVSQUw6Ci0JCQlpZiAoaW50X3VzYiAmIE1VU0JfSU5UUl9TVVNQ RU5EKSB7Ci0JCQkJbXVzYl9kYmcobXVzYiwgIkhOUDogU1VTUEVORCtDT05ORUNULCBub3cgYl9o b3N0Iik7Ci0JCQkJaW50X3VzYiAmPSB+TVVTQl9JTlRSX1NVU1BFTkQ7Ci0JCQkJZ290byBiX2hv c3Q7Ci0JCQl9IGVsc2UKLQkJCQltdXNiX2RiZyhtdXNiLCAiQ09OTkVDVCBhcyBiX3BlcmlwaGVy YWw/Pz8iKTsKLQkJCWJyZWFrOwotCQljYXNlIE9UR19TVEFURV9CX1dBSVRfQUNPTjoKLQkJCW11 c2JfZGJnKG11c2IsICJITlA6IENPTk5FQ1QsIG5vdyBiX2hvc3QiKTsKLWJfaG9zdDoKLQkJCW11 c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfSE9TVDsKLQkJCWlmIChtdXNiLT5o Y2QpCi0JCQkJbXVzYi0+aGNkLT5zZWxmLmlzX2JfaG9zdCA9IDE7Ci0JCQlkZWxfdGltZXIoJm11 c2ItPm90Z190aW1lcik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmICgoZGV2Y3RsICYg TVVTQl9ERVZDVExfVkJVUykKLQkJCQkJPT0gKDMgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkp IHsKLQkJCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9BX0hPU1Q7Ci0JCQkJ aWYgKGhjZCkKLQkJCQkJaGNkLT5zZWxmLmlzX2JfaG9zdCA9IDA7Ci0JCQl9Ci0JCQlicmVhazsK LQkJfQotCi0JCW11c2JfaG9zdF9wb2tlX3Jvb3RfaHViKG11c2IpOwotCi0JCW11c2JfZGJnKG11 c2IsICJDT05ORUNUICglcykgZGV2Y3RsICUwMngiLAotCQkJCXVzYl9vdGdfc3RhdGVfc3RyaW5n KG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSwgZGV2Y3RsKTsKIAl9CiAKIAlpZiAoaW50X3VzYiAm IE1VU0JfSU5UUl9ESVNDT05ORUNUKSB7Ci0JCW11c2JfZGJnKG11c2IsICJESVNDT05ORUNUICgl cykgYXMgJXMsIGRldmN0bCAlMDJ4IiwKLQkJCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54 Y2Vpdi0+b3RnLT5zdGF0ZSksCi0JCQkJTVVTQl9NT0RFKG11c2IpLCBkZXZjdGwpOworCQltdXNi X2hhbmRsZV9pbnRyX2Rpc2Nvbm5lY3QobXVzYiwgZGV2Y3RsKTsKIAkJaGFuZGxlZCA9IElSUV9I QU5ETEVEOwotCi0JCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpIHsKLQkJY2FzZSBP VEdfU1RBVEVfQV9IT1NUOgotCQljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6Ci0JCQltdXNiX2hv c3RfcmVzdW1lX3Jvb3RfaHViKG11c2IpOwotCQkJbXVzYl9yb290X2Rpc2Nvbm5lY3QobXVzYik7 Ci0JCQlpZiAobXVzYi0+YV93YWl0X2Jjb24gIT0gMCkKLQkJCQltdXNiX3BsYXRmb3JtX3RyeV9p ZGxlKG11c2IsIGppZmZpZXMKLQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKG11c2ItPmFfd2FpdF9i Y29uKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgotCQkJLyogUkVWSVNJ VCB0aGlzIGJlaGF2ZXMgZm9yICJyZWFsIGRpc2Nvbm5lY3QiCi0JCQkgKiBjYXNlczsgbWFrZSBz dXJlIHRoZSBvdGhlciB0cmFuc2l0aW9ucyBmcm9tCi0JCQkgKiBmcm9tIEJfSE9TVCBhY3Qgcmln aHQgdG9vLiAgVGhlIEJfSE9TVCBjb2RlCi0JCQkgKiBpbiBobnBfc3RvcCgpIGlzIGN1cnJlbnRs eSBub3QgdXNlZC4uLgotCQkJICovCi0JCQltdXNiX3Jvb3RfZGlzY29ubmVjdChtdXNiKTsKLQkJ CWlmIChtdXNiLT5oY2QpCi0JCQkJbXVzYi0+aGNkLT5zZWxmLmlzX2JfaG9zdCA9IDA7Ci0JCQlt dXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7Ci0JCQlNVVNC X0RFVl9NT0RFKG11c2IpOwotCQkJbXVzYl9nX2Rpc2Nvbm5lY3QobXVzYik7Ci0JCQlicmVhazsK LQkJY2FzZSBPVEdfU1RBVEVfQV9QRVJJUEhFUkFMOgotCQkJbXVzYl9obnBfc3RvcChtdXNiKTsK LQkJCW11c2Jfcm9vdF9kaXNjb25uZWN0KG11c2IpOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJ Y2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNl IE9UR19TVEFURV9CX1BFUklQSEVSQUw6Ci0JCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKLQkJCW11 c2JfZ19kaXNjb25uZWN0KG11c2IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXQVJOSU5H KCJ1bmhhbmRsZWQgRElTQ09OTkVDVCB0cmFuc2l0aW9uICglcylcbiIsCi0JCQkJdXNiX290Z19z dGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQkJCWJyZWFrOwotCQl9CiAJ fQogCi0JLyogbWVudG9yIHNhdmVzIGEgYml0OiBidXMgcmVzZXQgYW5kIGJhYmJsZSBzaGFyZSB0 aGUgc2FtZSBpcnEuCi0JICogb25seSBob3N0IHNlZXMgYmFiYmxlOyBvbmx5IHBlcmlwaGVyYWwg c2VlcyBidXMgcmVzZXQuCi0JICovCiAJaWYgKGludF91c2IgJiBNVVNCX0lOVFJfUkVTRVQpIHsK KwkJbXVzYl9oYW5kbGVfaW50cl9yZXNldChtdXNiKTsKIAkJaGFuZGxlZCA9IElSUV9IQU5ETEVE OwotCQlpZiAoaXNfaG9zdF9hY3RpdmUobXVzYikpIHsKLQkJCS8qCi0JCQkgKiBXaGVuIEJBQkJM RSBoYXBwZW5zIHdoYXQgd2UgY2FuIGRlcGVuZHMgb24gd2hpY2gKLQkJCSAqIHBsYXRmb3JtIE1V U0IgaXMgcnVubmluZywgYmVjYXVzZSBzb21lIHBsYXRmb3JtcwotCQkJICogaW1wbGVtZW50ZWQg cHJvcHJpZXRhcnkgbWVhbnMgZm9yICdyZWNvdmVyaW5nJyBmcm9tCi0JCQkgKiBCYWJibGUgY29u ZGl0aW9ucy4gT25lIHN1Y2ggcGxhdGZvcm0gaXMgQU0zMzV4LiBJbgotCQkJICogbW9zdCBjYXNl cywgaG93ZXZlciwgdGhlIG9ubHkgdGhpbmcgd2UgY2FuIGRvIGlzCi0JCQkgKiBkcm9wIHRoZSBz ZXNzaW9uLgotCQkJICovCi0JCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXIsICJCYWJibGVcbiIp OwotCQkJbXVzYl9yZWNvdmVyX2Zyb21fYmFiYmxlKG11c2IpOwotCQl9IGVsc2UgewotCQkJbXVz Yl9kYmcobXVzYiwgIkJVUyBSRVNFVCBhcyAlcyIsCi0JCQkJdXNiX290Z19zdGF0ZV9zdHJpbmco bXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQkJCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+ c3RhdGUpIHsKLQkJCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKLQkJCQltdXNiX2dfcmVzZXQo bXVzYik7Ci0JCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9C Q09OOgkvKiBPUFQgVEQuNC43LTkwMG1zICovCi0JCQkJLyogbmV2ZXIgdXNlIGludmFsaWQgVChh X3dhaXRfYmNvbikgKi8KLQkJCQltdXNiX2RiZyhtdXNiLCAiSE5QOiBpbiAlcywgJWQgbXNlYyB0 aW1lb3V0IiwKLQkJCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3Rh dGUpLAotCQkJCQlUQV9XQUlUX0JDT04obXVzYikpOwotCQkJCW1vZF90aW1lcigmbXVzYi0+b3Rn X3RpbWVyLCBqaWZmaWVzCi0JCQkJCSsgbXNlY3NfdG9famlmZmllcyhUQV9XQUlUX0JDT04obXVz YikpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKLQkJCQlk ZWxfdGltZXIoJm11c2ItPm90Z190aW1lcik7Ci0JCQkJbXVzYl9nX3Jlc2V0KG11c2IpOwotCQkJ CWJyZWFrOwotCQkJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046Ci0JCQkJbXVzYl9kYmcobXVz YiwgIkhOUDogUkVTRVQgKCVzKSwgdG8gYl9wZXJpcGhlcmFsIiwKLQkJCQkJdXNiX290Z19zdGF0 ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQkJCQltdXNiLT54Y2Vpdi0+b3Rn LT5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7Ci0JCQkJbXVzYl9nX3Jlc2V0KG11c2Ip OwotCQkJCWJyZWFrOwotCQkJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgotCQkJCW11c2ItPnhjZWl2 LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKLQkJCQkvKiBGQUxMVEhST1VH SCAqLwotCQkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgotCQkJCW11c2JfZ19yZXNldCht dXNiKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJbXVzYl9kYmcobXVzYiwgIlVuaGFu ZGxlZCBCVVMgUkVTRVQgYXMgJXMiLAotCQkJCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54 Y2Vpdi0+b3RnLT5zdGF0ZSkpOwotCQkJfQotCQl9CiAJfQogCiAjaWYgMAo=