From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?B?R2HDq3RhbiBDYXJsaWVy?= Date: Fri, 17 Aug 2012 07:07:57 +0000 Subject: i.MX27 SLCDC driver Message-Id: <502DEDCD.9050303@gmail.com> MIME-Version: 1 Content-Type: multipart/mixed; boundary="------------080906090607040704010200" List-Id: To: linux-arm-kernel@lists.infradead.org This is a multi-part message in MIME format. --------------080906090607040704010200 Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: 8bit Hello, I would like to write the driver for SmartLCD controller of i.MX27. This kind of interface needs a LCD with an embedded graphic controller partially controlled by GPIO. I want to link it with an OLED DD12832. How have I to write this driver : One driver for SLCDC and one driver for DD12832 ? How to link them together ? Maybe use similar philosophy than soc-camera ? I have written a driver for kernel 2.6.22 but SLCDC and DD12832 are in the same driver. Thank you for your help. Gaƫtan Carlier ps : I attach my previous driver for a better overview (this is a working draft for test purpose) --------------080906090607040704010200 Content-Type: text/x-csrc; name="mx2fb-slcd_dd12832_oled.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="mx2fb-slcd_dd12832_oled.c" LyoKICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5j LiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKi8KCi8qCiAqIFRoZSBjb2RlIGNvbnRhaW5lZCBo ZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNl bnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCiAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9u czoKICoKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5z ZS5odG1sCiAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAogKi8KCi8q IQogKiBAZGVmZ3JvdXAgRnJhbWVidWZmZXJfTVgyNyBGcmFtZWJ1ZmZlciBEcml2ZXIgZm9y IE1YMjcuCiAqLwoKLyohCiAqIEBmaWxlIG14MmZiLmMKICoKICogQGJyaWVmIEZyYW1lIGJ1 ZmZlciBkcml2ZXIgZm9yIE1YMjcgQURTLgogKgogKiBAaW5ncm91cCBGcmFtZWJ1ZmZlcl9N WDI3CiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5n Lmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CiNpbmNsdWRlIDxsaW51eC9mYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVk ZSA8bGludXgvZG1hcG9vbC5oPgojaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJy dXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+ CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL2FyY2gvbXhjZmIuaD4K I2luY2x1ZGUgPGFzbS9hcmNoL214MmZiX3NsY2RjLmg+CgojaW5jbHVkZSA8YXNtL2FyY2gv cG1pY19wb3dlci5oPgojaW5jbHVkZSAiZGQxMjgzMl9vbGVkLmgiCgojaWZkZWYgQ09ORklH X1BNCnN0YXRpYyBpbnQgbXgyZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpzdGF0aWMgaW50IG14MmZiX3Jlc3VtZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKI2Vsc2UKI2RlZmluZSBteDJmYl9zdXNwZW5k CQkwCiNkZWZpbmUgbXgyZmJfcmVzdW1lCQkwCiNlbmRpZgoKI2RlZmluZSBNWDJGQl9UWVBF X0JHICAgICAgICAgIDAKI2RlZmluZSBNWDJGQl9UWVBFX0dXICAgICAgICAgIDEKCiNkZWZp bmUgZmxvb3I4KGEpIChhJih+MHgwNykpCi8vI2RlZmluZSBpY2VpbDgoYSkgKCgoaW50KSgo YSs3KS84KSkqOCkKI2RlZmluZSBpY2VpbDgoYSkgKChpbnQpKChhICYgfigoaW50KTB4MDMp KSArIDgpKQoKCgpleHRlcm4gdm9pZCBncGlvX3NsY2RjX2FjdGl2ZSh2b2lkKTsKZXh0ZXJu IHZvaWQgZ3Bpb19zbGNkY19pbmFjdGl2ZSh2b2lkKTsKCnN0YXRpYyBjaGFyICpmYl9tb2Rl OwpzdGF0aWMgaW50IGZiX2VuYWJsZWQ7CnN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRf YnBwID0gMTsKc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJpZ2h0bmVzcyA9IDI1NTsKc3RhdGlj IEFUT01JQ19OT1RJRklFUl9IRUFEKG14MmZiX25vdGlmaWVyX2xpc3QpOwpzdGF0aWMgc3Ry dWN0IGNsayAqc2xjZGNfY2xrOwovKiEKICogQGJyaWVmIFN0cnVjdHVyZSBjb250YWluaW5n IHRoZSBNWDIgc3BlY2lmaWMgZnJhbWVidWZmZXIgcGFyYW1ldGVycy4KICovCnN0cnVjdCBt eDJmYl9wYXIgewoJaW50IHR5cGU7CgljaGFyICppZDsKCWludCByZWdpc3RlcmVkOwoJaW50 IGJsYW5rOwoJLyogVGVsbCBpZiBkcml2ZXIgY29tcGlsZWQgd2l0aCByb3RhdGUgb3B0aW9u IGVuYWJsZWQgKi8KCWludCByb3RhdGU7CgkvKiBDb250YWlucyBkaXNwbGF5ZWQgZGF0YSBp biAxIGJ5dGUgLyBjb2x1bW4gKDggcGl4ZWxzKQoJICogZmIgZGF0YSBhcmUgc3RvcmVkIGFz IDEgYnl0ZSAvIHBpeGVsCgkgKiAhISBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIDEyOGsgYWxp Z25tZW50IHVzaW5nIGRtYV9wb29sX2NyZWF0ZQoJICovCgkvKiBGcmFtZUJ1ZmZlciBtZW1v cnkgbWFwICovCgl1bnNpZ25lZCBjaGFyKiBmYl92bWVtOwoJc2l6ZV90IGZiX2xlbjsKCWRt YV9hZGRyX3QgZmJfcG1lbTsKCS8qIE9sZWQgY2dyYW0gbWVtb3J5IG1hcCAqLwoJdW5zaWdu ZWQgbG9uZyBjZ3JhbV9jbWRfdmFkZHI7Cgl1bnNpZ25lZCBsb25nIGNncmFtX2NtZF9wYWRk cjsKCXVuc2lnbmVkIGxvbmcgY2dyYW1fY21kX2xlbjsKCXN0cnVjdCBkbWFfcG9vbCAqY2dy YW1fY21kX2RtYV9wb29sOwoJdW5zaWduZWQgbG9uZyBjZ3JhbV9kYXRhX3ZhZGRyOwoJdW5z aWduZWQgbG9uZyBjZ3JhbV9kYXRhX3BhZGRyOwoJdW5zaWduZWQgbG9uZyBjZ3JhbV9kYXRh X2xlbjsKCXN0cnVjdCBkbWFfcG9vbCAqY2dyYW1fZGF0YV9kbWFfcG9vbDsKfTsKCi8qIEZy YW1lYnVmZmVyIEFQSXMgKi8KLypzdGF0aWMgaW50IG14MmZiX2NoZWNrX3ZhcihzdHJ1Y3Qg ZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMg aW50IG14MmZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgdm9pZCBf c2V0X2ZpeChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ki8KCi8qIEludGVybmFsIGZ1bmN0aW9u cyAqLwpzdGF0aWMgaW50IF9faW5pdCBfaW5pdF9mYmluZm8oc3RydWN0IGZiX2luZm8gKmlu Zm8sCgkJCSAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKc3RhdGljIGlu dCBfX2luaXQgX2luc3RhbGxfZmIoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJCSAgICAgIHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpzdGF0aWMgdm9pZCBfX2V4aXQgX3VuaW5z dGFsbF9mYihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgX21hcF92aWRlb19t ZW1vcnkoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgdm9pZCBfdW5tYXBfdmlkZW9f bWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLypzdGF0aWMgdm9pZCBfZW5hYmxlX2xj ZGMoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgdm9pZCBfZGlzYWJsZV9sY2RjKHN0 cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIHZvaWQgX3VwZGF0ZV9zbGNkYyhzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbyk7Ki8KCi8qIE9sZWQgZGlzcGxheSBpbmZvcm1hdGlvbiAqLwpzdHJ1 Y3QgZmJfdmlkZW9tb2RlIG14Y2ZiX21vZGVkYltdID0gewoJewoJCS8qIDEyOHgzMiAqLwoJ CSJEZW5zaXRyb24gREQxMjgzMiIsIC8qIG5hbWUgKi8KCQkwLCAvKiByZWZyZXNoICovCgkJ MTI4LCAvKiB4cmVzICovCgkJMzIsIC8qIHlyZXMgKi8KCQkwLCAvKiBwaXhjbG9jayAqLwoJ CTAsIC8qIGxlZnRfbWFyZ2luICovCgkJMCwgLyogcmlnaHRfbWFyZ2luICovCgkJMCwgLyog dXBwZXJfbWFyZ2luICovCgkJMCwgLyogbG93ZXJfbWFyZ2luICovCgkJMCwgLyogaHN5bmNf bGVuICovCgkJMCwgLyogdnN5bmNfbGVuICovCgkJMCwgLyogc3luYyAqLwoJCTAsIC8qIG1v ZGUgKi8KCQkwfSwgLyogZmxhZyAqLwp9OwppbnQgbXhjZmJfbW9kZWRiX3N6ID0gQVJSQVlf U0laRShteGNmYl9tb2RlZGIpOwoKc3RydWN0IG14MmZiX3BhciBteDJmYnBfYmcgPSB7Cgku dHlwZSA9IE1YMkZCX1RZUEVfQkcsCgkuaWQgPSAiRElTUDAgQkciLAoJLnJlZ2lzdGVyZWQg PSAwLAojaWZkZWYgQ09ORklHX0ZCX01YQ19ERU5TSVRST05fREQxMjgzMl9ST1RBVEUKCS5y b3RhdGUgPSAxLAojZWxzZQoJLnJvdGF0ZSA9IDAsCiNlbmRpZgp9OwoKLyohCiAqIEBicmll ZiBGcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzLgogKiBUaGVyZSBhcmUgdXAg dG8gMyBmcmFtZWJ1ZmZlcnM6IGJhY2tncm91bmQsIFRWb3V0LCBhbmQgZ3JhcGhpYyB3aW5k b3cuCiAqIElmIGdyYXBoaWMgd2luZG93IGlzIGNvbmZpZ3VyZWQsIGl0IG11c3QgYmUgdGhl IGxhc3QgZnJhbWVidWZmZXIuCiAqLwpzdGF0aWMgc3RydWN0IGZiX2luZm8gbXgyZmJfaW5m byA9IHsKCS5wYXIgPSAmbXgyZmJwX2JnLAp9OwoKLyohCiAqIERvIGEgbWluaW1hbCBzZXR1 cCBvZiBTTENEQyB0byBiZSBhYmxlIHRvIHNlbmQgY29tbWFuZCB0byBERDEyODMyCiAqLwpz dGF0aWMgdm9pZCBzbGNkY19maXJzdF9pbml0KHZvaWQpCnsKCXVuc2lnbmVkIGxvbmcgdmFs OwoJaW50IGk7Cgl1bnNpZ25lZCBsb25nICpwZGF0YTsKCgkvKiBTY3JlZW4gc3RhcnQgYWRk cmVzcyByZWdpc3RlciAqLwoJX19yYXdfd3JpdGVsKG14MmZicF9iZy5jZ3JhbV9kYXRhX3Bh ZGRyLCBTTENEQ19SRUcoU0xDRENfREFUQUJBU0VBRERSKSk7CglfX3Jhd193cml0ZWwobXgy ZmJwX2JnLmNncmFtX2RhdGFfbGVuLCBTTENEQ19SRUcoU0xDRENfREFUQUJVRlNJWkUpKTsK CgkvKiBDb3B5IGNvbW1hbmQgYXJyYXkgdG8gRE1BIGFyZWEgKi8KCXBkYXRhID0gKHVuc2ln bmVkIGxvbmcgKilteDJmYnBfYmcuY2dyYW1fY21kX3ZhZGRyOwoJZm9yIChpID0gMDsgaSA8 IG14MmZicF9iZy5jZ3JhbV9jbWRfbGVuOyBpKyspIHsKCQlpZiAoKGkgJiAweDAxKSA9PSAw KSB7CgkJCS8qIElmIGV2ZW4gb2Zmc2V0LCBjb21tYW5kIG11c3QgYmUgbGVmdC1hbGlnbmVk IGluCgkJCSAqIDMyLWJpdHMgbWVtb3J5IHNwYWNlICovCgkJCSpwZGF0YSA9ICh1bnNpZ25l ZCBsb25nKV9zc2QxMzA1X3BhZ2VjbWRfYXJyYXlbaV0gPDwgMTY7CgkJfSBlbHNlIHsKCQkJ LyogSWYgb2RkIG9mZnNldCwgY29tbWFuZCBtdXN0IGJlIHJpZ2h0LWFsaWduZWQgaW4KCQkJ ICogMzItYml0cyBtZW1vcnkgc3BhY2UgKi8KCQkJKnBkYXRhIHw9ICh1bnNpZ25lZCBsb25n KV9zc2QxMzA1X3BhZ2VjbWRfYXJyYXlbaV07CgkJCS8qIFdoZW4gInJpZ2h0IGNvbHVtbiIg aXMgZmlsbGVkLCBnbyB0byBuZXh0IGFkZHJlc3MgKi8KCQkJcGRhdGErKzsKCQl9Cgl9Cgkv KiBTZXQgQXJyYXkgb2YgY29tbWFuZCBmb3IgcGFnZSBhZGRyZXNzaW5nICovCglfX3Jhd193 cml0ZWwobXgyZmJwX2JnLmNncmFtX2NtZF9wYWRkciwgU0xDRENfUkVHKFNMQ0RDX0NPTUJB U0VBRERSKSk7CglfX3Jhd193cml0ZWwobXgyZmJwX2JnLmNncmFtX2NtZF9sZW4sIFNMQ0RD X1JFRyhTTENEQ19DT01CVUZTSVpFKSk7CgoJLyogU2V0IG51bWJlciBvZiBjb21tYW5kICh3 b3JkcykgdGhhdCBtdXN0IGJlIHNlbmQgdG8ganVtcCB0byBhCgkgKiBzcGVjaWZpYyBwYWdl LiBTaXplIG9mICJ3b3JkIiBpcyBkZWZpbmUgYnkgV09SRERFRkNPTSBmbGFnIGluCgkgKiBM Q0RUUkFOU0NPTkZJRyByZWdpc3RlciAqLwoJX19yYXdfd3JpdGVsKFBBR0VfQ09NTUFORF9Q QUNLX1NJWkUsIFNMQ0RDX1JFRyhTTENEQ19DT01TVFJJTkdTSVopKTsKCgkvKiBEZWZpbmUg RE1BIGJ1cnN0ICovCglfX3Jhd193cml0ZWwoMCwgU0xDRENfUkVHKFNMQ0RDX0ZJRk9DT05G SUcpKTsKCgkvKiBEZWZpbmUgbnVtYmVyIG9mIGNvbHVtbi9zZWdtZW50IGluIGEgcGFnZSAq LwoJX19yYXdfd3JpdGVsKE9MRURfV0lEVEgsIFNMQ0RDX1JFRyhTTENEQ19MQ0RDT05GSUcp KTsKCgkvKiBTZXQgdHJhbnNmZXIgY29uZmlndXJhdGlvbiAqLwoJdmFsID0gU0xDRENfREFU QV84QklUIHwgU0xDRENfQ09NTUFORF84QklUIHwgU0xDRENfUEFSQUxMRUwgfAoJCVNMQ0RD X1dSSVRFREFUQV84QklUIHwgU0xDRENfVFJBTlNfTElUTEVORElBTl84QklUIHwKCQlTTENE Q19DU1BPTF9MT1c7CglfX3Jhd193cml0ZWwodmFsLCBTTENEQ19SRUcoU0xDRENfTENEVFJB TlNDT05GSUcpKTsKCgkvKiBTZXQgY29udHJvbCByZWdpc3RlciAqLwoJdmFsID0gU0xDRENf TU9ERV9DT01NQU5EIHwgU0xDRENfSVJRX0RJU0FCTEUgfCBTTENEQ19JUlFfRkxBR1NfTUFT SzsKCV9fcmF3X3dyaXRlbCh2YWwsIFNMQ0RDX1JFRyhTTENEQ19TTENEQ0NUUkxTVEFUKSk7 CgoJLyogU2V0IFNMQ0RDIGNsb2NrIGRpdmlkZXIgPSBIQ0xLX1NMQ0RDICogdmFsIC8gMTI4 ICovCgl2YWwgPSA0MDsKCV9fcmF3X3dyaXRlbCh2YWwsIFNMQ0RDX1JFRyhTTENEQ19MQ0RD TE9DS0NPTkZJRykpOwp9CgoKLyoKICogU2VuZCBvbmUgY29tbWFuZCB0byBvbGVkIHZpYSBT TENEQwogKi8Kc3RhdGljIGludCBfc2xjZGNfc2VuZGNtZF9zaW5nbGUodW5zaWduZWQgY2hh ciBjbWQpCnsKCXdoaWxlIChfX3Jhd19yZWFkbChTTENEQ19SRUcoU0xDRENfU0xDRENDVFJM U1RBVCkpICYgU0xDRENfQlVTWV9NQVNLKTsKCV9fcmF3X3dyaXRlbCgodTMyKWNtZCB8IFdS SVRFX0xDRENNRCwgU0xDRENfUkVHKFNMQ0RDX0xDRFdSSVRFREFUQSkpOwoJcmV0dXJuIDA7 Cn0KCi8qCiAqIFNlbmQgb25lIGRhdGEgdG8gb2xlZCB2aWEgU0xDREMKICovCnN0YXRpYyBp bnQgX3NsY2RjX3NlbmRkYXRhX3NpbmdsZSh1bnNpZ25lZCBjaGFyIGNtZCkKewoJd2hpbGUg KF9fcmF3X3JlYWRsKFNMQ0RDX1JFRyhTTENEQ19TTENEQ0NUUkxTVEFUKSkgJiBTTENEQ19C VVNZX01BU0spOwoJX19yYXdfd3JpdGVsKCh1MzIpY21kIHwgV1JJVEVfTENEREFUQSwgU0xD RENfUkVHKFNMQ0RDX0xDRFdSSVRFREFUQSkpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIFNldCBT dGFydCBsaW5lIGZvciBQYW4gZnVuY3Rpb24KICovCnN0YXRpYyB2b2lkIGRkMTI4MzJfc2V0 X3N0YXJ0X2xpbmUodW5zaWduZWQgY2hhciB5KQp7Cglfc2xjZGNfc2VuZGNtZF9zaW5nbGUo U1NEMTMwNV9DTURfUk9XQUREUiB8ICh5ICYgMHgzRikpOwp9CgovKgogKiBTZXQgcGFnZSBh ZGRyZXNzCiAqLwpzdGF0aWMgdm9pZCBkZDEyODMyX3NldF95YWRkcih1bnNpZ25lZCBjaGFy IHkpCnsKCV9zbGNkY19zZW5kY21kX3NpbmdsZShTU0QxMzA1X0NNRF9QQUdFQUREUiB8ICh5 ICYgMHgwNykpOwp9CgovKgogKiBTZXQgc2VnbWVudCBhZGRyZXNzCiAqLwpzdGF0aWMgdm9p ZCBkZDEyODMyX3NldF94YWRkcih1bnNpZ25lZCBjaGFyIHgpCnsKI2lmbmRlZiBDT05GSUdf RkJfTVhDX0RFTlNJVFJPTl9ERDEyODMyX1JPVEFURQoJX3NsY2RjX3NlbmRjbWRfc2luZ2xl KFNTRDEzMDVfQ01EX0hJR0hDT0xBRERSIHwgKHggPj4gNCkpOwoJX3NsY2RjX3NlbmRjbWRf c2luZ2xlKFNTRDEzMDVfQ01EX0xPV0NPTEFERFIgfCAoeCAmIDB4MEYpKTsKI2Vsc2UKCXgg Kz0gU1NEMTMwNV9XSURUSCAtIE9MRURfV0lEVEg7Cglfc2xjZGNfc2VuZGNtZF9zaW5nbGUo U1NEMTMwNV9DTURfSElHSENPTEFERFIgfCAoeCA+PiA0KSk7Cglfc2xjZGNfc2VuZGNtZF9z aW5nbGUoU1NEMTMwNV9DTURfTE9XQ09MQUREUiB8ICh4ICYgMHgwRikpOwojZW5kaWYKfQoK LyoKICogTW9kaWZ5IGNvbnRyYXN0IHZhbHVlCiAqLwpzdGF0aWMgdm9pZCBkZDEyODMyX3Nl dF9icmlnaHRuZXNzKHVuc2lnbmVkIGNoYXIgbGV2ZWwpCnsKCWlmIChsZXZlbCA9PSAwKSB7 CgkJLyogSWYgbGV2ZWwgMCBhc2tlZCwgZGlzcGxheSBtdXN0IGJlIHR1cm5lZCBvZmYKCQkq IGJlY2F1c2UgRGlzcGxheSBpcyBzdGlsbCBPTiB3aGVuIENvbnRyYXN0CgkJKiBpcyBzZXQg dG8gMCAqLwoJCV9zbGNkY19zZW5kY21kX3NpbmdsZShTU0QxMzA1X0NNRF9ESVNQTEFZX1BP V0VSX09GRik7Cgl9IGVsc2UgewoJCS8qIEFwcGx5IG5ldyBjb250cmFzdCAqLwoJCV9zbGNk Y19zZW5kY21kX3NpbmdsZShTU0QxMzA1X0NNRF9CUklHSFRORVNTX01PREUpOwoJCV9zbGNk Y19zZW5kY21kX3NpbmdsZShsZXZlbCk7CgkJLyogQmUgc3VyZSB0aGF0IERJU1BMQVkgaXMg T04gKi8KCQlfc2xjZGNfc2VuZGNtZF9zaW5nbGUoU1NEMTMwNV9DTURfRElTUExBWV9QT1dF Ul9PTik7Cgl9Cn0KCi8qCiAqIENsZWFyIGludGVybmFsIFJBTSBvZiBjb250cm9sbGVyCiAq LwpzdGF0aWMgdm9pZCBkZDEyODMyX2NsZWFyX2xjZCh2b2lkKQp7Cgl1bnNpZ25lZCBsb25n IHN0YXR1czsKCS8qIENsZWFyIE9MRUQgUkFNIG1pcnJvciBidWZmZXIgKi8KCWNoYXIgKnBk YXRhID0gKGNoYXIgKilteDJmYnBfYmcuY2dyYW1fZGF0YV92YWRkcjsKCW1lbXNldChwZGF0 YSwgMCwgbXgyZmJwX2JnLmNncmFtX2RhdGFfbGVuKTsKCgkvKiBDbGVhciBGcmFtZUJ1ZmZl ciBtaXJyb3IgYnVmZmVyICovCglwZGF0YSA9IChjaGFyIF9fZm9yY2UgKikgbXgyZmJwX2Jn LmZiX3ZtZW07CgltZW1zZXQocGRhdGEsIDAsIG14MmZicF9iZy5mYl9sZW4pOwoKCWRkMTI4 MzJfc2V0X3lhZGRyKDApOwoJZGQxMjgzMl9zZXRfeGFkZHIoMCk7Cgl3aGlsZSAoX19yYXdf cmVhZGwoU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKSAmIFNMQ0RDX0JVU1lfTUFT Syk7CglzdGF0dXMgPSBfX3Jhd19yZWFkbChTTENEQ19SRUcoU0xDRENfU0xDRENDVFJMU1RB VCkpOwoJc3RhdHVzICY9IH4oU0xDRENfU0xDRENDVFJMU1RBVF9BVVRPTU9ERV9NQVNLKTsK CXN0YXR1cyB8PSBTTENEQ19NT0RFX0RBVEEgfCBTTENEQ19TVEFSVF9UUkFOU0ZFUlQ7Cglf X3Jhd193cml0ZWwoc3RhdHVzLCBTTENEQ19SRUcoU0xDRENfU0xDRENDVFJMU1RBVCkpOwp9 CgovKgogKiBTZW5kIGluaXQgc2VxdWVuY2UgdG8gZGlzcGxheSBjb250cm9sbGVyCiAqLwpz dGF0aWMgaW50IGRkMTI4MzJfaW5pdF9jb250cm9sbGVyKHZvaWQpCnsKCS8qIFVzZSBTTENE QyB0byBzZW5kIGNvbW1hbmQgYmxvY2sgKi8KCXVuc2lnbmVkIGxvbmcgaTsKCglmb3IgKGkg PSAwOyBpIDwgc2l6ZW9mKF9zc2QxMzA1X2luaXRfYXJyYXkpOyBpKyspIHsKCQlfc2xjZGNf c2VuZGNtZF9zaW5nbGUoX3NzZDEzMDVfaW5pdF9hcnJheVtpXSk7Cgl9CglkZDEyODMyX2Ns ZWFyX2xjZCgpOwoJcmV0dXJuIDA7Cn0KCi8qIQogKiBAYnJpZWYgRW5hYmxlIExDRCBjb250 cm9sbGVyLgogKiBAcGFyYW0gaW5mbwlmcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBwb2ludGVy CiAqLwpzdGF0aWMgdm9pZCBfZW5hYmxlX3NsY2RjKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7 CglpZiAoIWZiX2VuYWJsZWQpIHsKCQlmYl9lbmFibGVkKys7CgoJCWlmIChmYl9tb2RlKSB7 CgkJCXVuc2lnbmVkIGxvbmcgbW9kZSA9IDA7CgkJCWlmIChtb2RlID09IDApIHsKCQkJCWRk MTI4MzJfc2V0X2JyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CgkJCX0KCQl9Cgl9Cn0KCi8qIQog KiBAYnJpZWYgRGlzYWJsZSBMQ0QgY29udHJvbGxlci4KICogQHBhcmFtIGluZm8JZnJhbWVi dWZmZXIgaW5mb3JtYXRpb24gcG9pbnRlcgogKi8Kc3RhdGljIHZvaWQgX2Rpc2FibGVfc2xj ZGMoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCWlmIChmYl9lbmFibGVkKSB7CgkJZGQxMjgz Ml9zZXRfYnJpZ2h0bmVzcygwKTsKCQlmYl9lbmFibGVkID0gMDsKCX0KfQoKLyohCiAqIEBi cmllZiBVcGRhdGUgU0xDREMgcmVnaXN0ZXJzCiAqIEBwYXJhbSBpbmZvCWZyYW1lYnVmZmVy IGluZm9ybWF0aW9uIHBvaW50ZXIKICovCnN0YXRpYyB2b2lkIF91cGRhdGVfc2xjZGMoc3Ry dWN0IGZiX2luZm8gKmluZm8pCnsKCXVuc2lnbmVkIGxvbmcgYmFzZTsKCXVuc2lnbmVkIGxv bmcgdmFsOwoJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwoK CWJhc2UgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZz ZXQpOwoJYmFzZSArPSAodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZTsKCgkvKiBT ZXQgbnVtYmVyIG9mIGNvbW1hbmQgKHdvcmRzKSB0aGF0IG11c3QgYmUgc2VuZCB0byBqdW1w IHRvIGEKCSAqIHNwZWNpZmljIHBhZ2UuIFNpemUgb2YgIndvcmQiIGlzIGRlZmluZSBieSBX T1JEREVGQ09NIGZsYWcgaW4KCSAqIExDRFRSQU5TQ09ORklHIHJlZ2lzdGVyICovCglfX3Jh d193cml0ZWwoUEFHRV9DT01NQU5EX1BBQ0tfU0laRSwgU0xDRENfUkVHKFNMQ0RDX0NPTVNU UklOR1NJWikpOwoKCS8qIERlZmluZSBETUEgYnVyc3QgKi8KCV9fcmF3X3dyaXRlbCgwLCBT TENEQ19SRUcoU0xDRENfRklGT0NPTkZJRykpOwoKCS8qIERlZmluZSBudW1iZXIgb2YgY29s dW1uL3NlZ21lbnQgaW4gYSBwYWdlICovCglfX3Jhd193cml0ZWwoT0xFRF9XSURUSCwgU0xD RENfUkVHKFNMQ0RDX0xDRENPTkZJRykpOwoKCS8qIFNldCB0cmFuc2ZlciBjb25maWd1cmF0 aW9uICovCgl2YWwgPSBTTENEQ19EQVRBXzhCSVQgfCBTTENEQ19DT01NQU5EXzhCSVQgfCBT TENEQ19QQVJBTExFTCB8CgkJU0xDRENfV1JJVEVEQVRBXzhCSVQgfCBTTENEQ19UUkFOU19M SVRMRU5ESUFOXzhCSVQgfAoJCVNMQ0RDX0NTUE9MX0xPVzsKCV9fcmF3X3dyaXRlbCh2YWws IFNMQ0RDX1JFRyhTTENEQ19MQ0RUUkFOU0NPTkZJRykpOwoKCS8qIFNldCBTTENEQyBjbG9j ayBkaXZpZGVyID0gSENMS19TTENEQyAqIHZhbCAvIDEyOCAqLwoJdmFsID0gNjA7CglfX3Jh d193cml0ZWwodmFsLCBTTENEQ19SRUcoU0xDRENfTENEQ0xPQ0tDT05GSUcpKTsKCglyZXR1 cm47Cn0KCgovKiEKICogQGJyaWVmIEJsYW5rcyB0aGUgZGlzcGxheS4KICoKICogQHBhcmFt IGJsYW5rX21vZGUJVGhlIGJsYW5rIG1vZGUgd2Ugd2FudC4KICogQHBhcmFtIGluZm8JCUZy YW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1 ZmZlcgogKgogKiBAcmV0dXJuCQlOZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBv biBzdWNjZXNzLgogKgogKiBCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gMCwg ZWxzZSB1bmJsYW5rLiBSZXR1cm4gMCBpZiBibGFua2luZwogKiBzdWNjZWVkZWQsICE9IDAg aWYgdW4tL2JsYW5raW5nIGZhaWxlZC4KICogYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZz eW5jCiAqIGJsYW5rX21vZGUgPT0gMzogc3VzcGVuZCBoc3luYwogKiBibGFua19tb2RlID09 IDQ6IHBvd2VyZG93bgogKi8Kc3RhdGljIGludCBteDJmYl9ibGFuayhpbnQgYmxhbmtfbW9k ZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBteDJmYl9wYXIgKm14MmZicCA9 IChzdHJ1Y3QgbXgyZmJfcGFyICopaW5mby0+cGFyOwoKCWRldl9kYmcoaW5mby0+ZGV2aWNl LCAiYmxhbmsgbW9kZSA9ICVkXG4iLCBibGFua19tb2RlKTsKCglteDJmYnAtPmJsYW5rID0g YmxhbmtfbW9kZTsKCglzd2l0Y2ggKGJsYW5rX21vZGUpIHsKCWNhc2UgRkJfQkxBTktfUE9X RVJET1dOOgoJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgoJY2FzZSBGQl9CTEFOS19I U1lOQ19TVVNQRU5EOgoJY2FzZSBGQl9CTEFOS19OT1JNQUw6CgkJX2Rpc2FibGVfc2xjZGMo aW5mbyk7CgkJYnJlYWs7CgljYXNlIEZCX0JMQU5LX1VOQkxBTks6CgkJX2VuYWJsZV9zbGNk YyhpbmZvKTsKCQlicmVhazsKCX0KCglyZXR1cm4gMDsKfQoKLyoKICogaGVyZSB3ZSBzdGFy dCB0aGUgcHJvY2VzcyBvZiBzcGxpdGluZyBvdXQgdGhlIGZiIHVwZGF0ZSBpbnRvCiAqIGlu ZGl2aWR1YWwgYmxvY2tzIG9mIHBpeGVscy4gd2UgZW5kIHVwIHNwbGl0aW5nIGludG8gNjR4 NjQgYmxvY2tzCiAqIGFuZCBmaW5hbGx5IGRvd24gdG8gNjR4OCBwYWdlcy4KICovCnN0YXRp YyB2b2lkIGRkMTI4MzJfY2dyYW1fdXBkYXRlKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNp Z25lZCBpbnQgZHgsCgkJCQkJdW5zaWduZWQgaW50IGR5LCB1bnNpZ25lZCBpbnQgdywgdW5z aWduZWQgaW50IGgpCnsKCXN0cnVjdCBteDJmYl9wYXIgKm14MmZicCA9IChzdHJ1Y3QgbXgy ZmJfcGFyICopaW5mby0+cGFyOwoJdW5zaWduZWQgaW50IHN0YXJ0cGFnZSwgZW5kcGFnZSwg c3RhcnRzZWcsIGVuZHNlZzsKCXVuc2lnbmVkIGludCBjdXJwYWdlLCBjdXJzZWc7Cgl1bnNp Z25lZCBsb25nIHN0YXR1czsKCWludCBpOwoJdW5zaWduZWQgY2hhciBteXNlZzsKCWNoYXIg KmNncmFtOwoJdW5zaWduZWQgY2hhciAqcHBpeGVsOwoKCS8qIGFsaWduIHRoZSByZXF1ZXN0 IGZpcnN0ICovCgkvKiBHZXQgZmlyc3QgbGluZSBvZiB0aGUgcGFnZSB3aGVyZSBzdGFydGlu ZyBwaXhlbCBpcyBsb2NhdGVkICovCglzdGFydHBhZ2UgPSBmbG9vcjgoZHkpIC8gODsKCS8q IEdldCBmaXJzdCBsaW5lIG9mIHRoZSBuZXh0IHBhZ2Ugd2hlcmUgbGFzdCBwaXhlbCB0byB1 cGRhdGUKCSAqIGlzIGxvY2F0ZWQgKi8KCWVuZHBhZ2UgPSBoICsgZHkgLSAxOwoJZW5kcGFn ZSA9IGljZWlsOChlbmRwYWdlKSAvIDg7CgoJLyogRmlyc3Qgc2VnbWVudCB0byB1cGRhdGUg Ki8KCXN0YXJ0c2VnID0gZHg7CgkvKiBMYXN0IHNlZ21lbnQgdG8gdXBkYXRlICovCgllbmRz ZWcgPSBkeCArICh3IC0gMSk7CgoJZm9yIChjdXJwYWdlID0gc3RhcnRwYWdlOyBjdXJwYWdl IDwgZW5kcGFnZTsgY3VycGFnZSsrKSB7CgkJY2dyYW0gPSAoY2hhciopbXgyZmJwLT5jZ3Jh bV9kYXRhX3ZhZGRyOwoJCWNncmFtICs9IGN1cnBhZ2UgKiBpbmZvLT5maXgubGluZV9sZW5n dGg7CgkJY2dyYW0gKz0gc3RhcnRzZWc7CgkJZm9yIChjdXJzZWcgPSBzdGFydHNlZzsgY3Vy c2VnIDw9IGVuZHNlZzsgY3Vyc2VnKyspIHsKCQkJLyogR2V0IHNlZ21lbnQgdG8gdXBkYXRl IGluIHZpZGVvIG1lbW9yeSAqLwoJCQlteXNlZyA9IDA7CgkJCXBwaXhlbCA9ICh1bnNpZ25l ZCBjaGFyIF9fZm9yY2UgKikgbXgyZmJwLT5mYl92bWVtOwoJCQkvKiBUaGVyZSBpcyA4IGxp bmVzIHBlciBwYWdlICovCgkJCXBwaXhlbCArPSBjdXJwYWdlICogaW5mby0+Zml4LmxpbmVf bGVuZ3RoICogODsKCQkJLyogUG9pbnRzIHRvIHVwcGVyIHBpeGVsIG9mIHRoZSBjdXJyZW50 IHNlZ21lbnQgKi8KCQkJcHBpeGVsICs9IGN1cnNlZzsKCQkJZm9yIChpID0gMDsgaSA8IDg7 IGkrKykgewoJCQkJaWYgKCpwcGl4ZWwgIT0gMCkgewoJCQkJCW15c2VnIHw9IDEgPDwgaTsK CQkJCX0KCQkJCS8qIEp1bXAgdG8gbmV4dCBsaW5lIHRvIGdldCBwaXhlbCBiZWxvdyAqLwoJ CQkJcHBpeGVsICs9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKCQkJfQoJCQkqY2dyYW0gPSBt eXNlZzsKCQkJY2dyYW0rKzsKCQl9Cgl9CglkZDEyODMyX3NldF94YWRkcigwKTsKCWRkMTI4 MzJfc2V0X3lhZGRyKDApOwoJd2hpbGUgKF9fcmF3X3JlYWRsKFNMQ0RDX1JFRyhTTENEQ19T TENEQ0NUUkxTVEFUKSkgJiBTTENEQ19CVVNZX01BU0spOwoJc3RhdHVzID0gX19yYXdfcmVh ZGwoU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCXN0YXR1cyAmPSB+KFNMQ0RD X1NMQ0RDQ1RSTFNUQVRfQVVUT01PREVfTUFTSyk7CglzdGF0dXMgfD0gU0xDRENfTU9ERV9E QVRBIHwgU0xDRENfU1RBUlRfVFJBTlNGRVJUOwoJX19yYXdfd3JpdGVsKHN0YXR1cywgU0xD RENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKfQoKCgpzdGF0aWMgdm9pZCBteDJmYl9m aWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCQkJICAgY29uc3Qgc3RydWN0IGZiX2Zp bGxyZWN0ICpyZWN0KQp7CglzeXNfZmlsbHJlY3QoaW5mbywgcmVjdCk7CgoJLyogdXBkYXRl IHRoZSBwaHlzaWNhbCBsY2QgKi8KCWRkMTI4MzJfY2dyYW1fdXBkYXRlKGluZm8sIHJlY3Qt PmR4LCByZWN0LT5keSwgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Cn0KCnN0YXRpYyB2 b2lkIG14MmZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAoJCQkgICBjb25zdCBz dHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpCnsKCXN5c19jb3B5YXJlYShpbmZvLCBhcmVhKTsK CgkvKiB1cGRhdGUgdGhlIHBoeXNpY2FsIGxjZCAqLwoJZGQxMjgzMl9jZ3JhbV91cGRhdGUo aW5mbywgYXJlYS0+ZHgsIGFyZWEtPmR5LCBhcmVhLT53aWR0aCwgYXJlYS0+aGVpZ2h0KTsK fQoKc3RhdGljIHZvaWQgbXgyZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBj b25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQp7CglzdHJ1Y3QgbXgyZmJfcGFyICpteDJm YnAgPSAoc3RydWN0IG14MmZiX3BhciAqKWluZm8tPnBhcjsKCWNoYXIgKnBwaXhlbDsKCWNv bnN0IGNoYXIgKnBkYXRhOwoJaW50IGo7CgoJaWYgKGltYWdlLT5kZXB0aCA9PSAxKSB7CgkJ LyogRHJhdyBpbWFnZSAqLwoJCXBkYXRhID0gaW1hZ2UtPmRhdGE7CgkJcHBpeGVsID0gbXgy ZmJwLT5mYl92bWVtOwoJCXBwaXhlbCArPSBpbWFnZS0+ZHkgKiBpbmZvLT5maXgubGluZV9s ZW5ndGg7CgkJcHBpeGVsICs9IGltYWdlLT5keDsKCQlmb3IgKGogPSAwOyBqIDwgaW1hZ2Ut PmhlaWdodDsgaisrKSB7CgkJCW1lbWNweShwcGl4ZWwsIHBkYXRhLCBpbWFnZS0+d2lkdGgp OwoJCQlwZGF0YSArPSBpbWFnZS0+d2lkdGg7CgkJCXBwaXhlbCArPSBpbmZvLT5maXgubGlu ZV9sZW5ndGg7CgkJfQoJCS8qIHVwZGF0ZSB0aGUgcGh5c2ljYWwgbGNkICovCgkJZGQxMjgz Ml9jZ3JhbV91cGRhdGUoaW5mbywgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksIGltYWdlLT53aWR0 aCwgaW1hZ2UtPmhlaWdodCk7Cgl9Cn0KCgovKiEKICogQGJyaWVmIFBhbnMgdGhlIGRpc3Bs YXkuCiAqCiAqIEBwYXJhbSB2YXIJRnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1 Y3R1cmUKICogQHBhcmFtIGluZm8JRnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJl c2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAqCiAqIEByZXR1cm4JTmVnYXRpdmUgZXJy bm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICoKICogUGFuIChvciB3cmFwLCBk ZXBlbmRpbmcgb24gdGhlIGB2bW9kZScgZmllbGQpIHRoZSBkaXNwbGF5IHVzaW5nIHRoZQog KiAneG9mZnNldCcgYW5kICd5b2Zmc2V0JyBmaWVsZHMgb2YgdGhlICd2YXInIHN0cnVjdHVy ZS4gSWYgdGhlIHZhbHVlcwogKiBkb24ndCBmaXQsIHJldHVybiAtRUlOVkFMLgogKi8Kc3Rh dGljIGludCBteDJmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZh ciwKCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJaWYgKGluZm8tPnZhci55b2Zm c2V0ID09IHZhci0+eW9mZnNldCkgewoJCXJldHVybiAwOwkvKiBObyBjaGFuZ2UsIGRvIG5v dGhpbmcgKi8KCX0KCiAgICAgICAgaWYgKCh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVAp ICYmICh2YXItPnlvZmZzZXQgPCBPTEVEX1dJRFRIKQogICAgICAgICAgICAgICAgJiYgKGlu Zm8tPnZhci55cmVzIDw9IE9MRURfV0lEVEgpKSB7CiAgICAgICAgICAgICAgICBkZDEyODMy X3NldF9zdGFydF9saW5lKHZhci0+eW9mZnNldCk7CiAgICAgICAgICAgICAgICBpbmZvLT52 YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwog ICAgICAgIH0KCiAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgbXgyZmJf c3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJZGQxMjgzMl9jZ3JhbV91cGRhdGUoaW5m bywgMCwgMCwgaW5mby0+Zml4LmxpbmVfbGVuZ3RoLCBpbmZvLT52YXIueXJlc192aXJ0dWFs KTsKCXJldHVybiAwOwp9CgovKiEKICogQGJyaWVmIElvY3RsIGZ1bmN0aW9uIHRvIHN1cHBv cnQgY3VzdG9taXplZCBpb2N0bCBvcGVyYXRpb25zLgogKgogKiBAcGFyYW0gaW5mbwlGcmFt ZWJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZl cgogKiBAcGFyYW0gY21kCVRoZSBjb21tYW5kIG51bWJlcgogKiBAcGFyYW0gYXJnCUFyZ3Vt ZW50IHdoaWNoIGRlcGVuZHMgb24gY21kCiAqCiAqIEByZXR1cm4JTmVnYXRpdmUgZXJybm8g b24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICovCnN0YXRpYyBpbnQgbXgyZmJfaW9j dGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCgkJICAgICAgIHVu c2lnbmVkIGxvbmcgYXJnKQp7Cgl1bnNpZ25lZCBjaGFyIGxldmVsOwoKCXN3aXRjaCAoY21k KSB7CgljYXNlIE1YMkZCX1NFVF9CUklHSFRORVNTOgoJCWlmIChjb3B5X2Zyb21fdXNlcigo dm9pZCAqKSZsZXZlbCwgKHZvaWQgKilhcmcsIHNpemVvZihsZXZlbCkpKQoJCQlyZXR1cm4g LUVGQVVMVDsKCQlicmlnaHRuZXNzID0gbGV2ZWw7CgkJZGQxMjgzMl9zZXRfYnJpZ2h0bmVz cyhsZXZlbCk7CgkJYnJlYWs7CgljYXNlIE1YMkZCX0ZPUkNFX1NZTkM6CgkJbXgyZmJfc3lu YyhpbmZvKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2RiZyhpbmZvLT5kZXZpY2UsICJV bmtub3duIGlvY3RsIGNvbW1hbmQgKDB4JTA4WClcbiIsIGNtZCk7CgkJcmV0dXJuIC1FSU5W QUw7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIQogKiBAYnJpZWYgU2V0IGZpeGVkIGZyYW1lYnVm ZmVyIHBhcmFtZXRlcnMgYmFzZWQgb24gdmFyaWFibGUgc2V0dGluZ3MuCiAqCiAqIEBwYXJh bSBpbmZvCWZyYW1lYnVmZmVyIGluZm9ybWF0aW9uIHBvaW50ZXIKICogQHJldHVybglOZWdh dGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogKi8Kc3RhdGljIHZv aWQgX3NldF9maXgoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBmYl9maXhfc2Ny ZWVuaW5mbyAqZml4ID0gJmluZm8tPmZpeDsKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAq dmFyID0gJmluZm8tPnZhcjsKCXN0cnVjdCBteDJmYl9wYXIgKm14MmZicCA9IChzdHJ1Y3Qg bXgyZmJfcGFyICopaW5mby0+cGFyOwoKCXN0cm5jcHkoZml4LT5pZCwgbXgyZmJwLT5pZCwg c3RybGVuKG14MmZicC0+aWQpKTsKCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDwgOCkKCQlm aXgtPmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzX3ZpcnR1YWw7CgllbHNlCgkJZml4LT5saW5l X2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7 CglmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CglmaXgtPmFjY2VsID0gRkJf QUNDRUxfTk9ORTsKCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX01PTk8xMDsKCWZpeC0+eHBh bnN0ZXAgPSAwOwoJZml4LT55cGFuc3RlcCA9IDE7CglmaXgtPnl3cmFwc3RlcCA9IDA7Cn0K Ci8qIQogKiBAYnJpZWYgVmFsaWRhdGVzIGEgdmFyIHBhc3NlZCBpbi4KICoKICogQHBhcmFt IHZhcglGcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQogKiBAcGFyYW0g aW5mbwlGcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBm cmFtZSBidWZmZXIKICoKICogQHJldHVybglOZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3Ig emVybyBvbiBzdWNjZXNzLgogKgogKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBoYXJkd2FyZSBz dXBwb3J0cyB0aGUgc3RhdGUgcmVxdWVzdGVkIGJ5IHZhciBwYXNzZWQKICogaW4uIFRoaXMg ZnVuY3Rpb24gZG9lcyBub3QgYWx0ZXIgdGhlIGhhcmR3YXJlIHN0YXRlISBJZiB0aGUgdmFy IHBhc3NlZCBpbgogKiBpcyBzbGlnaHRseSBvZmYgYnkgd2hhdCB0aGUgaGFyZHdhcmUgY2Fu IHN1cHBvcnQgdGhlbiB3ZSBhbHRlciB0aGUgdmFyCiAqIFBBU1NFRCBpbiB0byB3aGF0IHdl IGNhbiBkby4gSWYgdGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCBtb2RlIGNoYW5nZQog KiBhIC1FSU5WQUwgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgdXBwZXIgbGF5ZXJzLgogKgog Ki8Kc3RhdGljIGludCBteDJmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZv ICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglpZiAodmFyLT54cmVzX3ZpcnR1YWwg PCB2YXItPnhyZXMpCgkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CglpZiAodmFy LT55cmVzX3ZpcnR1YWwgPCB2YXItPnlyZXMpCgkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXIt PnlyZXM7CgoJaWYgKHZhci0+eG9mZnNldCA8IDApCgkJdmFyLT54b2Zmc2V0ID0gMDsKCglp ZiAodmFyLT55b2Zmc2V0IDwgMCkKCQl2YXItPnlvZmZzZXQgPSAwOwoKCWlmICh2YXItPnhv ZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwpCgkJdmFy LT54b2Zmc2V0ID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbCAtIGluZm8tPnZhci54cmVzOwoK CWlmICh2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3Zp cnR1YWwpCgkJdmFyLT55b2Zmc2V0ID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbCAtIGluZm8t PnZhci55cmVzOwoKCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IGRlZmF1bHRfYnBwKQoJ CXZhci0+Yml0c19wZXJfcGl4ZWwgPSBkZWZhdWx0X2JwcDsKCglpZiAodmFyLT5waXhjbG9j ayAhPSAwKQoJCXZhci0+cGl4Y2xvY2sgPSAwOwoJdmFyLT5yZWQubGVuZ3RoID0gdmFyLT5n cmVlbi5sZW5ndGggPSB2YXItPmJsdWUubGVuZ3RoID0gMTsKCXZhci0+cmVkLm9mZnNldCA9 IHZhci0+Z3JlZW4ub2Zmc2V0ID0gdmFyLT5ibHVlLm9mZnNldCA9IDA7Cgl2YXItPnJlZC5t c2JfcmlnaHQgPSB2YXItPmdyZWVuLm1zYl9yaWdodCA9IHZhci0+Ymx1ZS5tc2JfcmlnaHQg PSAwOwoKCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7Cgl2YXItPnRyYW5zcC5vZmZzZXQgPSAw OwoJdmFyLT50cmFuc3AubXNiX3JpZ2h0ID0gMDsKCgl2YXItPmhlaWdodCA9IC0xOwoJdmFy LT53aWR0aCA9IC0xOwoJdmFyLT5ncmF5c2NhbGUgPSAwOwoKCS8qIENvcHkgbm9uc3RkIGZp ZWxkIHRvL2Zyb20gc3luYyBmb3IgZmJzZXQgdXNhZ2UgKi8KCXZhci0+c3luYyB8PSB2YXIt Pm5vbnN0ZDsKCXZhci0+bm9uc3RkIHw9IHZhci0+c3luYzsKCglyZXR1cm4gMDsKfQoKLyoh CiAqIEBicmllZiBBbHRlcnMgdGhlIGhhcmR3YXJlIHN0YXRlLgogKgogKiBAcGFyYW0gaW5m bwlGcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFt ZSBidWZmZXIKICoKICogQHJldHVybiBaZXJvIG9uIHN1Y2Nlc3Mgb3RoZXJzIG9uIGZhaWx1 cmUKICoKICogVXNpbmcgdGhlIGZiX3Zhcl9zY3JlZW5pbmZvIGluIGZiX2luZm8gd2Ugc2V0 IHRoZSByZXNvbHV0aW9uIG9mIHRoaXMKICogcGFydGljdWxhciBmcmFtZWJ1ZmZlci4gVGhp cyBmdW5jdGlvbiBhbHRlcnMgdGhlIGZiX2ZpeF9zY3JlZW5pbmZvIHN0b3JlZAogKiBpbiBm Yl9pbmZvLiBJdCBkb2Vzbid0IG5vdCBhbHRlciB2YXIgaW4gZmJfaW5mbyBzaW5jZSB3ZSBh cmUgdXNpbmcgdGhhdAogKiBkYXRhLiBUaGlzIG1lYW5zIHdlIGRlcGVuZCBvbiB0aGUgZGF0 YSBpbiB2YXIgaW5zaWRlIGZiX2luZm8gdG8gYmUKICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJk d2FyZS4gbXgyZmJfY2hlY2tfdmFyIGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlCiAqIG14MmZi X3NldF9wYXIgdG8gZW5zdXJlIHRoaXMuCiAqLwpzdGF0aWMgaW50IG14MmZiX3NldF9wYXIo c3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXVuc2lnbmVkIGxvbmcgbGVuOwoJc3RydWN0IG14 MmZiX3BhciAqbXgyZmJwID0gKHN0cnVjdCBteDJmYl9wYXIgKilpbmZvLT5wYXI7CgoJX3Nl dF9maXgoaW5mbyk7CgoJbGVuID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbCAqIGluZm8tPmZp eC5saW5lX2xlbmd0aDsKCWlmIChsZW4gPiBpbmZvLT5maXguc21lbV9sZW4pIHsKCQlpZiAo aW5mby0+Zml4LnNtZW1fc3RhcnQpCgkJCV91bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CgoJ CS8qIE1lbW9yeSBhbGxvY2F0aW9uIGZvciBmcmFtZWJ1ZmZlciAqLwoJCWlmIChfbWFwX3Zp ZGVvX21lbW9yeShpbmZvKSkgewoJCQlkZXZfZXJyKGluZm8tPmRldmljZSwgIlVuYWJsZSB0 byBhbGxvY2F0ZSBmYiBtZW1vcnlcbiIpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9Cgl9CgoJ X3VwZGF0ZV9zbGNkYyhpbmZvKTsKCglteDJmYl9ibGFuayhteDJmYnAtPmJsYW5rLCBpbmZv KTsKCglyZXR1cm4gMDsKfQoKLyoKICogdGhpcyBpcyB0aGUgYWNjZXNzIHBhdGggZnJvbSB1 c2Vyc3BhY2UuIHRoZXkgY2FuIHNlZWsgYW5kIHdyaXRlIHRvCiAqIHRoZSBmYi4gaXQncyBp bmVmZmljaWVudCBmb3IgdGhlbSB0byBkbyBhbnl0aGluZyBsZXNzIHRoYW4gNjQqOAogKiB3 cml0ZXMgc2luY2Ugd2UgdXBkYXRlIHRoZSBsY2QgaW4gZWFjaCB3cml0ZSgpIGFueXdheS4K ICovCnN0YXRpYyBzc2l6ZV90IG14MmZiX3dyaXRlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBj b25zdCBjaGFyIF9fdXNlciAqYnVmLAoJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBv cykKewoJLyogbW9kZGVkIGZyb20gZXBzb24gMTM1NSAqLwoKCXVuc2lnbmVkIGxvbmcgcDsK CWludCBlcnI9LUVJTlZBTDsKCXVuc2lnbmVkIGludCBmYm1lbWxlbmd0aCwgeCwgeSwgdywg aCwgc3RhcnRwYWdlLCBlbmRwYWdlOwoJc3RydWN0IGFyY2ZiX3BhciAqcGFyOwoJdW5zaWdu ZWQgaW50IHhyZXM7CgoJcCA9ICpwcG9zOwoJcGFyID0gaW5mby0+cGFyOwoJeHJlcyA9IGlu Zm8tPnZhci54cmVzOwoJZmJtZW1sZW5ndGggPSBpbmZvLT5maXguc21lbV9sZW47CgoJaWYg KHAgPiBmYm1lbWxlbmd0aCkKCQlyZXR1cm4gLUVOT1NQQzsKCgllcnIgPSAwOwoJaWYgKChj b3VudCArIHApID4gZmJtZW1sZW5ndGgpIHsKCQljb3VudCA9IGZibWVtbGVuZ3RoIC0gcDsK CQllcnIgPSAtRU5PU1BDOwoJfQoKCWlmIChjb3VudCkgewoJCWNoYXIgKmJhc2VfYWRkcjsK CgkJYmFzZV9hZGRyID0gKGNoYXIgX19mb3JjZSAqKWluZm8tPnNjcmVlbl9iYXNlOwoJCWNv dW50IC09IGNvcHlfZnJvbV91c2VyKGJhc2VfYWRkciArIHAsIGJ1ZiwgY291bnQpOwoJCSpw cG9zICs9IGNvdW50OwoJCWVyciA9IC1FRkFVTFQ7Cgl9CgoJLyogQ2hlY2sgaG93IG1hbnkg cGFnZSBhcmUgYWZmZWN0ZWQgKi8KCXN0YXJ0cGFnZSA9IGZsb29yOChwKSAvIDg7CgllbmRw YWdlID0gaWNlaWw4KChwICsgY291bnQpKSAvIDg7Cgl4ID0gcCAlIGluZm8tPmZpeC5saW5l X2xlbmd0aDsKCXkgPSBwIC8gaW5mby0+Zml4LmxpbmVfbGVuZ3RoOwoJdyA9IGNvdW50ICUg aW5mby0+Zml4LmxpbmVfbGVuZ3RoOwoJaCA9IGNvdW50IC8gaW5mby0+Zml4LmxpbmVfbGVu Z3RoOwoJaWYgKHN0YXJ0cGFnZSAhPSAoZW5kcGFnZSAtIDEpKSB7CgkJLyogSWYgc2V2ZXJh bCBwYWdlIGFmZmVjdGVkLCB1cGRhdGUgY29tcGxldGUgbGluZQoJCSAqIG9mIGFsbCBhZmZl Y3RlZCBwYWdlcyAqLwoJCWRkMTI4MzJfY2dyYW1fdXBkYXRlKGluZm8sIDAsIHksIGluZm8t PmZpeC5saW5lX2xlbmd0aCwgaCk7Cgl9IGVsc2UgewoJCS8qIE9uZSBwYWdlIGhhcyBiZWVu IGFmZmVjdGVkLCBvbmx5IHVwZGF0ZXMgbW9kaWZpZWQgc2VnbWVudAoJCSAqLwoJCWRkMTI4 MzJfY2dyYW1fdXBkYXRlKGluZm8sIHgsIHksIHcsIGgpOwoJfQoJaWYgKHArY291bnQgPiBp bmZvLT5maXgubGluZV9sZW5ndGgpIHsKCQkvKiBTZXZlcmFsIGxpbmUgbXVzdCBiZSB1cGRh dGVkICovCgl9CglpZiAoY291bnQpCgkJcmV0dXJuIGNvdW50OwoJcmV0dXJuIGVycjsKfQoK LyogZmJfbW1hcAogKiBNYXAgdmlkZW8gbWVtb3J5IGluIHVzZXIgc3BhY2UuIFdlIGRvbid0 IHVzZSB0aGUgZ2VuZXJpYyBmYl9tbWFwIG1ldGhvZAogKiBtYWlubHkKICogdG8gYWxsb3cg dGhlIHVzZSBvZiB0aGUgVExCIHN0cmVhbWluZyBmbGFnIChDQ0E9NikKICovCmludCBteDJm Yl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvIC8qZmJpKi8sIHN0cnVjdCB2bV9hcmVhX3N0 cnVjdCAqdm1hKQp7CglzdHJ1Y3QgbXgyZmJfcGFyICpteDJmYnAgPSAoc3RydWN0IG14MmZi X3BhciAqKWluZm8tPnBhcjsKCXVuc2lnbmVkIGludCBsZW47Cgl1bnNpZ25lZCBsb25nIHN0 YXJ0PTAsIG9mZjsKCglpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQp KSB7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJc3RhcnQgPSBteDJmYnAtPmZiX3BtZW0gJiBQ QUdFX01BU0s7CglsZW4gPSBQQUdFX0FMSUdOKChzdGFydCAmIH5QQUdFX01BU0spICsgbXgy ZmJwLT5mYl9sZW4pOwoKCW9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKCglp ZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCArIG9mZikgPiBsZW4pIHsKCQlyZXR1 cm4gLUVJTlZBTDsKCX0KCglvZmYgKz0gc3RhcnQ7Cgl2bWEtPnZtX3Bnb2ZmID0gb2ZmID4+ IFBBR0VfU0hJRlQ7CgoJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZt YS0+dm1fcGFnZV9wcm90KTsKCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9ICg2 IDw8IDkpOwoKCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CgoJaWYgKGlvX3JlbWFwX3Bmbl9y YW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAoJCQkJdm1hLT52 bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAoJCQkJdm1hLT52bV9wYWdlX3Byb3QpKSB7CgkJcmV0 dXJuIC1FQUdBSU47Cgl9CglyZXR1cm4gMDsKfQoKCi8qIQogKiBAYnJpZWYgRnJhbWVidWZm ZXIgZmlsZSBvcGVyYXRpb25zCiAqLwpzdGF0aWMgc3RydWN0IGZiX29wcyBteDJmYl9vcHMg PSB7Cgkub3duZXIgPSBUSElTX01PRFVMRSwKCS8vLmZiX3JlYWQgICAgICAgID0gZmJfc3lz X3JlYWQsCgkuZmJfd3JpdGUgCT0gbXgyZmJfd3JpdGUsCgkuZmJfY2hlY2tfdmFyIAk9IG14 MmZiX2NoZWNrX3ZhciwKCS5mYl9zZXRfcGFyIAk9IG14MmZiX3NldF9wYXIsCgkuZmJfYmxh bmsgCT0gbXgyZmJfYmxhbmssCgkuZmJfcGFuX2Rpc3BsYXkJPSBteDJmYl9wYW5fZGlzcGxh eSwKCS5mYl9maWxscmVjdAk9IG14MmZiX2ZpbGxyZWN0LAoJLmZiX2NvcHlhcmVhCT0gbXgy ZmJfY29weWFyZWEsCgkuZmJfaW1hZ2VibGl0CT0gbXgyZmJfaW1hZ2VibGl0LAoJLmZiX2lv Y3RsCT0gbXgyZmJfaW9jdGwsCgkuZmJfc3luYwk9IG14MmZiX3N5bmMsCgkuZmJfbW1hcAk9 IG14MmZiX21tYXAsCn07CgovKiEKICogQGJyaWVmIEluaXRpYWxpemUgZnJhbWVidWZmZXIg aW5mb3JtYXRpb24gc3RydWN0dXJlLgogKgogKiBAcGFyYW0gaW5mbwlmcmFtZWJ1ZmZlciBp bmZvcm1hdGlvbiBwb2ludGVyCiAqIEBwYXJhbSBwZGV2CXBvaW50ZXIgdG8gc3RydWN0IGRl dmljZQogKiBAcmV0dXJuCU5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1 Y2Nlc3MuCiAqLwpzdGF0aWMgaW50IF9faW5pdCBfaW5pdF9mYmluZm8oc3RydWN0IGZiX2lu Zm8gKmluZm8sCgkJCSAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQp7Cglp bmZvLT5kZXZpY2UgPSAmcGRldi0+ZGV2OwoJaW5mby0+dmFyLmFjdGl2YXRlID0gRkJfQUNU SVZBVEVfTk9XOwoJaW5mby0+ZmJvcHMgPSAmbXgyZmJfb3BzOwoJaW5mby0+ZmxhZ3MgPSBG QklORk9fRkxBR19ERUZBVUxUOwoJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBOVUxMOwoKCXJl dHVybiAwOwp9CgovKiEKICogQGJyaWVmIEluc3RhbGwgZnJhbWVidWZmZXIgaW50byB0aGUg c3lzdGVtLgogKgogKiBAcGFyYW0gaW5mbwlmcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBwb2lu dGVyCiAqIEBwYXJhbSBwZGV2ICBwb2ludGVyIHRvIHN0cnVjdCBkZXZpY2UKICogQHJldHVy bglOZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogKi8Kc3Rh dGljIGludCBfX2luaXQgX2luc3RhbGxfZmIoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJCSAg ICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXN0cnVjdCBteDJmYl9wYXIg Km14MmZicCA9IChzdHJ1Y3QgbXgyZmJfcGFyICopaW5mby0+cGFyOwoKCWlmIChfaW5pdF9m YmluZm8oaW5mbywgcGRldikpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKGZiX21vZGUgPT0g MCkKCQlmYl9tb2RlID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJaWYgKCFmYl9maW5k X21vZGUoJmluZm8tPnZhciwgaW5mbywgZmJfbW9kZSwgbXhjZmJfbW9kZWRiLAoJCQkgIG14 Y2ZiX21vZGVkYl9zeiwgTlVMTCwgZGVmYXVsdF9icHApKSB7CgkJcmV0dXJuIC1FQlVTWTsK CX0KCgkvKiBEZWZhdWx0IFkgdmlydHVhbCBzaXplIGlzIDJ4IHBhbmVsIHNpemUgKi8KCS8q IGluZm8tPnZhci55cmVzX3ZpcnR1YWwgPSBpbmZvLT52YXIueXJlcyA8PCAxOyAqLwoKCWlm IChteDJmYnAtPnR5cGUgPT0gTVgyRkJfVFlQRV9HVykKCQlteDJmYnAtPmJsYW5rID0gRkJf QkxBTktfTk9STUFMOwoJZWxzZQoJCW14MmZicC0+YmxhbmsgPSBGQl9CTEFOS19VTkJMQU5L OwoKCWlmIChteDJmYl9zZXRfcGFyKGluZm8pKSB7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJ aWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgewoJCV91bm1hcF92aWRlb19t ZW1vcnkoaW5mbyk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJbXgyZmJwLT5yZWdpc3RlcmVk ID0gMTsKCglkZXZfaW5mbyhpbmZvLT5kZXZpY2UsICJmYiVkIHJlZ2lzdGVyZWQgc3VjY2Vz c2Z1bGx5IG9uICVzIChyb3RhdGUgPSAlZCkuXG4iLAoJCSBpbmZvLT5ub2RlLCBmYl9tb2Rl LCBteDJmYnAtPnJvdGF0ZSk7CglyZXR1cm4gMDsKfQoKLyohCiAqIEBicmllZiBVbmluc3Rh bGwgZnJhbWVidWZmZXIgZnJvbSB0aGUgc3lzdGVtLgogKgogKiBAcGFyYW0gaW5mbwlmcmFt ZWJ1ZmZlciBpbmZvcm1hdGlvbiBwb2ludGVyCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgX3Vu aW5zdGFsbF9mYihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IG14MmZiX3BhciAq bXgyZmJwID0gKHN0cnVjdCBteDJmYl9wYXIgKilpbmZvLT5wYXI7CgoJaWYgKCFteDJmYnAt PnJlZ2lzdGVyZWQpCgkJcmV0dXJuOwoKCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7 CglfdW5tYXBfdmlkZW9fbWVtb3J5KGluZm8pOwoJaWYgKCZpbmZvLT5jbWFwKQoJCWZiX2Rl YWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CgoJbXgyZmJwLT5yZWdpc3RlcmVkID0gMDsKfQoK LyohCiAqIEBicmllZiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGZyYW1lYnVmZmVyLgogKgogKiBA cGFyYW0gaW5mbwlmcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBwb2ludGVyCiAqIEByZXR1cm4J TmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICovCnN0YXRp YyBpbnQgX21hcF92aWRlb19tZW1vcnkoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXVuc2ln bmVkIGxvbmcgcGFnZTsKCXN0cnVjdCBteDJmYl9wYXIgKm14MmZicCA9IChzdHJ1Y3QgbXgy ZmJfcGFyICopaW5mby0+cGFyOwoJbXgyZmJwLT5mYl9sZW4gPSBpbmZvLT5maXgubGluZV9s ZW5ndGggKiBpbmZvLT52YXIueXJlc192aXJ0dWFsOwoKCW14MmZicC0+ZmJfdm1lbSA9IGRt YV9hbGxvY19jb2hlcmVudChpbmZvLT5kZXZpY2UsIFBBR0VfQUxJR04obXgyZmJwLT5mYl9s ZW4pLAoJCQkmbXgyZmJwLT5mYl9wbWVtLCBHRlBfS0VSTkVMKTsKCWlmIChteDJmYnAtPmZi X3ZtZW0gPT0gMCkgewoJCWRldl9lcnIoaW5mby0+ZGV2aWNlLCAiZmFpbCB0byBhbGxvY2F0 ZSBmcmFtYnVmZmVyIChzaXplOiAlZEspKSIsCgkJCQlteDJmYnAtPmZiX2xlbiAvIDEwMjQp OwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWluZm8tPnNjcmVlbl9iYXNlID0gbXgyZmJwLT5m Yl92bWVtOwoJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBteDJmYnAtPmZiX3BtZW07CglpbmZv LT5maXguc21lbV9sZW4gPSBteDJmYnAtPmZiX2xlbjsKCglkZXZfZGJnKGluZm8tPmRldmlj ZSwgIkFsbG9jYXRlZCBmYiBAIHBhZGRyPTB4JTA4bFgsIHNpemU9JWQuXG4iLAoJCWluZm8t PmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOwoKCWluZm8tPnNjcmVlbl9z aXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwoKCS8qIENsZWFyIHRoZSBzY3JlZW4gKi8KCW1l bXNldCgoY2hhciAqKW14MmZicC0+ZmJfdm1lbSwgMHgwMCwgbXgyZmJwLT5mYl9sZW4pOwoK CS8qCgkgKiBTZXQgcGFnZSByZXNlcnZlZCBzbyB0aGF0IG1tYXAgd2lsbCB3b3JrLiBUaGlz IGlzIG5lY2Vzc2FyeQoJICogc2luY2Ugd2UnbGwgYmUgcmVtYXBwaW5nIG5vcm1hbCBtZW1v cnkuCgkgKi8KCWZvciAocGFnZSA9ICh1bnNpZ25lZCBsb25nKW14MmZicC0+ZmJfdm1lbTsK CSAgICAgcGFnZSA8IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpbXgyZmJwLT5mYl92bWVt ICsgbXgyZmJwLT5mYl9sZW4pOwoJICAgICBwYWdlICs9IFBBR0VfU0laRSkgewojaWZkZWYg Q09ORklHX0RNQV9OT05DT0hFUkVOVAoJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2Uo Q0FDX0FERFIocGFnZSkpKTsKI2Vsc2UKCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdl KHBhZ2UpKTsKI2VuZGlmCgl9CgoJcmV0dXJuIDA7Cn0KCi8qIQogKiBAYnJpZWYgUmVsZWFz ZSBtZW1vcnkgZm9yIGZyYW1lYnVmZmVyLgogKiBAcGFyYW0gaW5mbwlmcmFtZWJ1ZmZlciBp bmZvcm1hdGlvbiBwb2ludGVyCiAqLwpzdGF0aWMgdm9pZCBfdW5tYXBfdmlkZW9fbWVtb3J5 KHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgbXgyZmJfcGFyICpteDJmYnAgPSAo c3RydWN0IG14MmZiX3BhciAqKWluZm8tPnBhcjsKCWlmIChteDJmYnAtPmZiX3ZtZW0pIHsK CQlkbWFfZnJlZV9ub25jb2hlcmVudChpbmZvLT5kZXZpY2UsIG14MmZicC0+ZmJfbGVuLCBt eDJmYnAtPmZiX3ZtZW0sIG14MmZicC0+ZmJfcG1lbSk7Cgl9CglteDJmYnAtPmZiX2xlbiA9 IDA7CglteDJmYnAtPmZiX3BtZW0gPSAwOwoJbXgyZmJwLT5mYl92bWVtID0gMDsKCWluZm8t PnNjcmVlbl9iYXNlID0gMDsKCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gMDsKCWluZm8tPmZp eC5zbWVtX2xlbiA9IDA7CgkvKiBGcmVlIERNQSBvZiBTTENEQyB0cmFuc2ZlcnQgKi8KCWRt YV9wb29sX2ZyZWUobXgyZmJwLT5jZ3JhbV9kYXRhX2RtYV9wb29sLCAodm9pZCAqKW14MmZi cC0+Y2dyYW1fZGF0YV92YWRkciwgKGRtYV9hZGRyX3QpIG14MmZicC0+Y2dyYW1fZGF0YV9w YWRkcik7CglkbWFfcG9vbF9kZXN0cm95KG14MmZicC0+Y2dyYW1fZGF0YV9kbWFfcG9vbCk7 CglteDJmYnAtPmNncmFtX2RhdGFfZG1hX3Bvb2wgPSAwOwoJbXgyZmJwLT5jZ3JhbV9kYXRh X3ZhZGRyID0gMDsKCW14MmZicC0+Y2dyYW1fZGF0YV9wYWRkciA9IDA7CglteDJmYnAtPmNn cmFtX2RhdGFfbGVuID0gMDsKCS8qIEZyZWUgRE1BIG9mIFNMQ0RDIHRyYW5zZmVydCAqLwoJ ZG1hX3Bvb2xfZnJlZShteDJmYnAtPmNncmFtX2NtZF9kbWFfcG9vbCwgKHZvaWQgKilteDJm YnAtPmNncmFtX2NtZF92YWRkciwgKGRtYV9hZGRyX3QpIG14MmZicC0+Y2dyYW1fY21kX3Bh ZGRyKTsKCWRtYV9wb29sX2Rlc3Ryb3kobXgyZmJwLT5jZ3JhbV9jbWRfZG1hX3Bvb2wpOwoJ bXgyZmJwLT5jZ3JhbV9jbWRfZG1hX3Bvb2wgPSAwOwoJbXgyZmJwLT5jZ3JhbV9jbWRfdmFk ZHIgPSAwOwoJbXgyZmJwLT5jZ3JhbV9jbWRfcGFkZHIgPSAwOwoJbXgyZmJwLT5jZ3JhbV9j bWRfbGVuID0gMDsKfQoKLyoKICogQGJyaWVmIExDREMgaW50ZXJydXB0IGhhbmRsZXIKICov CnN0YXRpYyBpcnFyZXR1cm5fdCBteDJmYl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7 CglzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7Cgl1bnNpZ25lZCBsb25nIHN0YXR1czsKCglzdGF0 dXMgPSBfX3Jhd19yZWFkbChTTENEQ19SRUcoU0xDRENfU0xDRENDVFJMU1RBVCkpOwoJc3Rh dHVzICY9IFNMQ0RDX0lSUV9GTEFHU19NQVNLOwoKCWlmIChzdGF0dXMgJiBTTENEQ19JUlFf RkxBRykgewoJCXByaW50aygiT2xlZCB4ZmVyIGRvbmUgOiAiKTsKCQlpZiAoc3RhdHVzID09 IFNMQ0RDX0lSUV9GTEFHKSB7CgkJCXByaW50aygiU3VjY2Vzc2Z1bFxuIik7CgkJfQoJCWlm IChzdGF0dXMgJiBTTENEQ19JUlFfVEVBX0ZMQUcpIHsKCQkJcHJpbnRrKCJETUEgZXJyb3Jc biIpOwoJCQlldmVudC5pbmZvID0gJm14MmZiX2luZm87CgkJCWF0b21pY19ub3RpZmllcl9j YWxsX2NoYWluKCZteDJmYl9ub3RpZmllcl9saXN0LAoJCQkJCUZCX0VWRU5UX01YQ19ETUFf RVJST1IsICZldmVudCk7CgkJfQoJCWlmIChzdGF0dXMgJiBTTENEQ19JUlFfVU5EUkZMT1df RkxBRykgewoJCQlwcmludGsoIlVuZGVyZmxvdyBvY2N1cnNcbiIpOwoJCQlldmVudC5pbmZv ID0gJm14MmZiX2luZm87CgkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZteDJmYl9u b3RpZmllcl9saXN0LAoJCQkJCUZCX0VWRU5UX01YQ19VTkRFUkZMT1csICZldmVudCk7CgkJ fQoJfQoKCS8qIFdyaXRlIDEgdG8gY2xlYXIgdGhlIHN0YXR1cyAqLwoJc3RhdHVzID0gX19y YXdfcmVhZGwoU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCXN0YXR1cyB8PSBT TENEQ19JUlFfRkxBR1NfTUFTSzsKCV9fcmF3X3dyaXRlbChzdGF0dXMsIFNMQ0RDX1JFRyhT TENEQ19TTENEQ0NUUkxTVEFUKSk7CgkKCXJldHVybiBJUlFfSEFORExFRDsKfQoKLyohCiAq IEBicmllZiBDb25maWcgYW5kIHJlcXVlc3QgTENEQyBpbnRlcnJ1cHQKICovCnN0YXRpYyB2 b2lkIF9yZXF1ZXN0X2lycSh2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIHN0YXR1czsKCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CgoJLyogV3JpdGUgMSB0byBjbGVhciB0aGUgc3RhdHVzICovCglz dGF0dXMgPSBfX3Jhd19yZWFkbChTTENEQ19SRUcoU0xDRENfU0xDRENDVFJMU1RBVCkpOwoJ c3RhdHVzIHw9IFNMQ0RDX0lSUV9GTEFHU19NQVNLOwoJX19yYXdfd3JpdGVsKHN0YXR1cywg U0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCglpZiAocmVxdWVzdF9pcnEoSU5U X1NMQ0RDLCBteDJmYl9pc3IsIDAsICJTTENEQyIsIDApKQoJCXByX2luZm8oIlJlcXVlc3Qg TENEQyBJUlEgZmFpbGVkLlxuIik7CgllbHNlIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXgy ZmJfbm90aWZpZXJfbGlzdC5sb2NrLCBmbGFncyk7CgoJCS8qIEVuYWJsZSBpbnRlcnJ1cHQg aW4gY2FzZSBjbGllbnQgaGFzIHJlZ2lzdGVyZWQgKi8KCQkvL2lmIChteDJmYl9ub3RpZmll cl9saXN0LmhlYWQgIT0gTlVMTCkgewoJCQkvL3Vuc2lnbmVkIGxvbmcgc3RhdHVzOwoJCQkv L3Vuc2lnbmVkIGxvbmcgaW50cyA9IE1YMkZCX0lOVF9FT0Y7CgoJCQkvL2ludHMgfD0gTVgy RkJfSU5UX0dXX0VPRjsKCgkJCS8qIEVuYWJsZSBpbnRlcnJ1cHQgaW4gY2FzZSBjbGllbnQg aGFzIHJlZ2lzdGVyZWQgKi8KCQkJLy9pZiAobXgyZmJfbm90aWZpZXJfbGlzdC5oZWFkICE9 IE5VTEwpIHsKCQkJCS8qIFdyaXRlIDEgdG8gY2xlYXIgdGhlIHN0YXR1cyAqLwoJCQkJc3Rh dHVzID0gX19yYXdfcmVhZGwoU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCQkJ CXN0YXR1cyB8PSBTTENEQ19JUlFfRkxBR1NfTUFTSzsKCQkJCV9fcmF3X3dyaXRlbChzdGF0 dXMsIFNMQ0RDX1JFRyhTTENEQ19TTENEQ0NUUkxTVEFUKSk7CgoJCQkJLyogRW5hYmxlIFNM Q0RDIGludGVycnVwdCAqLwoJCQkJc3RhdHVzID0gX19yYXdfcmVhZGwoU0xDRENfUkVHKFNM Q0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCQkJCXN0YXR1cyB8PSBTTENEQ19JUlFfRU5BQkxFOwoJ CQkJX19yYXdfd3JpdGVsKHN0YXR1cywgU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQp KTsKCQkJLy99CgkJLy99CgoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm14MmZiX25vdGlm aWVyX2xpc3QubG9jaywgZmxhZ3MpOwoJfQp9CgovKiEKICogQGJyaWVmIEZyZWUgTENEQyBp bnRlcnJ1cHQgaGFuZGxlcgogKi8Kc3RhdGljIHZvaWQgX2ZyZWVfaXJxKHZvaWQpCnsKCXVu c2lnbmVkIGxvbmcgc3RhdHVzOwoJc3RhdHVzID1fX3Jhd19yZWFkbChTTENEQ19SRUcoU0xD RENfU0xDRENDVFJMU1RBVCkpOwoJLyogV3JpdGUgMSB0byBjbGVhciB0aGUgc3RhdHVzICov CglzdGF0dXMgfD0gU0xDRENfSVJRX0ZMQUdTX01BU0s7CgkvKiBEaXNhYmxlIGFsbCBMQ0RD IGludGVycnVwdCAqLwoJc3RhdHVzICY9IH5TTENEQ19JUlFfRU5BQkxFOwoJX19yYXdfd3Jp dGVsKHN0YXR1cywgU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCglmcmVlX2ly cShJTlRfU0xDREMsIDApOwp9CgovKiEKICogQGJyaWVmIFJlZ2lzdGVyIGEgY2xpZW50IG5v dGlmaWVyCiAqIEBwYXJhbSBuYglub3RpZmllciBibG9jayB0byBjYWxsYmFjayBvbiBldmVu dHMKICovCmludCBteDJmYl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpuYikKewoJdW5zaWduZWQgbG9uZyBmbGFncywgc3RhdHVzOwoJaW50IHJldDsKCglyZXQg PSBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm14MmZiX25vdGlmaWVyX2xpc3Qs IG5iKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmbXgyZmJfbm90aWZpZXJfbGlzdC5sb2NrLCBm bGFncyk7CgoJLyogRW5hYmxlIGludGVycnVwdCBpbiBjYXNlIGNsaWVudCBoYXMgcmVnaXN0 ZXJlZCAqLwoJaWYgKG14MmZiX25vdGlmaWVyX2xpc3QuaGVhZCAhPSBOVUxMKSB7CgkJLyog V3JpdGUgMSB0byBjbGVhciB0aGUgc3RhdHVzICovCgkJc3RhdHVzID0gX19yYXdfcmVhZGwo U0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCQlzdGF0dXMgfD0gU0xDRENfSVJR X0ZMQUdTX01BU0s7CgkJX19yYXdfd3JpdGVsKHN0YXR1cywgU0xDRENfUkVHKFNMQ0RDX1NM Q0RDQ1RSTFNUQVQpKTsKCgkJLyogRW5hYmxlIFNMQ0RDIGludGVycnVwdCAqLwoJCXN0YXR1 cyA9IF9fcmF3X3JlYWRsKFNMQ0RDX1JFRyhTTENEQ19TTENEQ0NUUkxTVEFUKSk7CgkJc3Rh dHVzIHw9IFNMQ0RDX0lSUV9FTkFCTEU7CgkJX19yYXdfd3JpdGVsKHN0YXR1cywgU0xDRENf UkVHKFNMQ0RDX1NMQ0RDQ1RSTFNUQVQpKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jm14MmZiX25vdGlmaWVyX2xpc3QubG9jaywgZmxhZ3MpOwoKCXJldHVybiByZXQ7Cn0KCi8q IQogKiBAYnJpZWYgVW5yZWdpc3RlciBhIGNsaWVudCBub3RpZmllcgogKiBAcGFyYW0gbmIJ bm90aWZpZXIgYmxvY2sgdG8gY2FsbGJhY2sgb24gZXZlbnRzCiAqLwppbnQgbXgyZmJfdW5y ZWdpc3Rlcl9jbGllbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKewoJdW5zaWduZWQg bG9uZyBmbGFncywgc3RhdHVzOwoJaW50IHJldDsKCglyZXQgPSBhdG9taWNfbm90aWZpZXJf Y2hhaW5fdW5yZWdpc3RlcigmbXgyZmJfbm90aWZpZXJfbGlzdCwgbmIpOwoKCXNwaW5fbG9j a19pcnFzYXZlKCZteDJmYl9ub3RpZmllcl9saXN0LmxvY2ssIGZsYWdzKTsKCgkvKiBNYXNr IGludGVycnVwdCBpbiBjYXNlIG5vIGNsaWVudCByZWdpc3RlcmVkICovCglpZiAobXgyZmJf bm90aWZpZXJfbGlzdC5oZWFkID09IE5VTEwpIHsKCQkvKiBFbmFibGUgU0xDREMgaW50ZXJy dXB0ICovCgkJc3RhdHVzID0gX19yYXdfcmVhZGwoU0xDRENfUkVHKFNMQ0RDX1NMQ0RDQ1RS TFNUQVQpKTsKCQlzdGF0dXMgJj0gfihTTENEQ19JUlFfRU5BQkxFKTsKCQlfX3Jhd193cml0 ZWwoc3RhdHVzLCBTTENEQ19SRUcoU0xDRENfU0xDRENDVFJMU1RBVCkpOwoJfQoKCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJm14MmZiX25vdGlmaWVyX2xpc3QubG9jaywgZmxhZ3MpOwoK CXJldHVybiByZXQ7Cn0KCiNpZmRlZiBDT05GSUdfUE0KLyoKICogUG93ZXIgbWFuYWdlbWVu dCBob29rcy4gTm90ZSB0aGF0IHdlIHdvbid0IGJlIGNhbGxlZCBmcm9tIElSUSBjb250ZXh0 LAogKiB1bmxpa2UgdGhlIGJsYW5rIGZ1bmN0aW9ucyBhYm92ZSwgc28gd2UgbWF5IHNsZWVw LgogKi8KCi8qIQogKiBAYnJpZWYgU3VzcGVuZHMgdGhlIGZyYW1lYnVmZmVyIGFuZCBibGFu a3MgdGhlIHNjcmVlbi4KICogUG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0CiAqLwojaWZkZWYg Q09ORklHX0ZCX01YQ19FUFNPTl9MNEYwMDI0CnN0YXRpYyBpbnQgbXgyZmJfc3BpX3N1c3Bl bmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CiNlbHNl CnN0YXRpYyBpbnQgbXgyZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKI2VuZGlmCglfZGlzYWJsZV9zbGNkYygmbXgyZmJf aW5mbyk7CgoJcmV0dXJuIDA7Cn0KCi8qIQogKiBAYnJpZWYgUmVzdW1lcyB0aGUgZnJhbWVi dWZmZXIgYW5kIHVuYmxhbmtzIHRoZSBzY3JlZW4uCiAqIFBvd2VyIG1hbmFnZW1lbnQgc3Vw cG9ydAogKi8KI2lmZGVmIENPTkZJR19GQl9NWENfRVBTT05fTDRGMDAyNApzdGF0aWMgaW50 IG14MmZiX3NwaV9yZXN1bWUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKI2Vsc2UKc3RhdGlj IGludCBteDJmYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKI2VuZGlm CnsKCV9lbmFibGVfc2xjZGMoJm14MmZiX2luZm8pOwoJcmV0dXJuIDA7Cn0KI2VuZGlmCQkJ CS8qIENPTkZJR19QTSAqLwoKLyohCiAqIEBicmllZiBQcm9iZSByb3V0aW5lIGZvciB0aGUg ZnJhbWVidWZmZXIgZHJpdmVyLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQogKiAgICAgICAg ZHJpdmVyIGJpbmRpbmcgcHJvY2Vzcy4KICoKICogQHJldHVybiBBcHByb3ByaWF0ZSBlcnJv ciBjb2RlIHRvIHRoZSBrZXJuZWwgY29tbW9uIGNvZGUKICovCnN0YXRpYyBpbnQgbXgyZmJf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldDsKCglzbGNk Y19jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzbGNkY19jbGsiKTsKCWNsa19lbmFibGUo c2xjZGNfY2xrKTsKCglncGlvX3NsY2RjX2FjdGl2ZSgpOwoKCS8qIE1lbW9yeSBhbGxvY2F0 aW9uIG9mIGRpc3BsYXkgZGF0YSBmb3IgRE1BIHRyYW5zZmVydCAqLwoJLyogY29udmVydCAx IGJ5dGUgLyBwaXhlbCBsZW5ndGggdG8gMSBieXRlIC8gY29sdW1uICg4IHBpeGVscykgKi8K CW14MmZicF9iZy5jZ3JhbV9kYXRhX2xlbiA9IE9MRURfV0lEVEgqT0xFRF9IRUlHSFQgLyA4 OwoJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBDR1JBTSBtaXJyb3Igd2l0aCAxMjhrIGJvdW5k YXJ5CgkgKiAoY2Ygbm90ZSBTTENEQyBpbiBDaC4gNDQuMiBvZiBpLk1YMjcgUk0pIGFsaWdu ZWQgb24gMSBieXRlICovCglteDJmYnBfYmcuY2dyYW1fZGF0YV9kbWFfcG9vbCA9IGRtYV9w b29sX2NyZWF0ZSgiU0xDRENfRE1BX0RBVEEiLCAmcGRldi0+ZGV2LCBteDJmYnBfYmcuY2dy YW1fZGF0YV9sZW4sIDEsIDEyOCoxMDI0KTsKCWlmIChteDJmYnBfYmcuY2dyYW1fZGF0YV9k bWFfcG9vbCA9PSBOVUxMKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFs bG9jYXRlZCBETUEgUG9vbC5cbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbXgyZmJwX2Jn LmNncmFtX2RhdGFfdmFkZHIgPSAodW5zaWduZWQgbG9uZylkbWFfcG9vbF9hbGxvYyhteDJm YnBfYmcuY2dyYW1fZGF0YV9kbWFfcG9vbCwgR0ZQX0RNQSB8IEdGUF9LRVJORUwsIChkbWFf YWRkcl90ICopICZteDJmYnBfYmcuY2dyYW1fZGF0YV9wYWRkcik7CglpZiAoKHZvaWQgKilt eDJmYnBfYmcuY2dyYW1fZGF0YV92YWRkciA9PSBOVUxMKSB7CgkJZGV2X2VycigmcGRldi0+ ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlZCBETUEgbWVtb3J5LlxuIik7CgkJcmV0dXJuIC1F Tk9NRU07Cgl9CgoJLyogTWVtb3J5IGFsbG9jYXRpb24gb2YgZGlzcGxheSBjb21tYW5kcyBm b3IgRE1BIHRyYW5zZmVydCAqLwoJLyogYSBwYWdlIGFkZHJlc3Mgb24gTENEIGlzIGRlZmlu ZWQgYnkgMyB0aHJlZSBjb21tYW5kcy4KCSAqIEVhY2ggY29tbWFuZCBtdXN0IGJlIGpvaW5l ZCB3aXRoIGEgYnl0ZSBjb250YWluaW5nIHRoZSBzdGF0ZQoJICogb2YgUlMgcGluIHRvIGFw cGx5IChjZiBGaWcgNDQtNSBmcm9tIFNMQ0RDIGNoYXB0ZXIgaW4gaS5NWDI3IFJNKS4KCSAq IEFycmF5IG11c3QgYmUgZGVmaW5lZCBhcyB1bnNpZ25lZCBzaG9ydCAqLwoJbXgyZmJwX2Jn LmNncmFtX2NtZF9sZW4gPSBzaXplb2YoX3NzZDEzMDVfcGFnZWNtZF9hcnJheSkvc2l6ZW9m KF9zc2QxMzA1X3BhZ2VjbWRfYXJyYXlbMF0pOwoJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBD R1JBTSBtaXJyb3Igd2l0aCAxMjhrIGJvdW5kYXJ5CgkgKiAoY2Ygbm90ZSBTTENEQyBpbiBD aC4gNDQuMiBvZiBpLk1YMjcgUk0pIGFsaWduZWQgb24gMiBieXRlcyAoYXJyYXkgb2Ygc2hv cnRzKSAqLwoJbXgyZmJwX2JnLmNncmFtX2NtZF9kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0 ZSgiU0xDRENfRE1BX0NNRCIsICZwZGV2LT5kZXYsIG14MmZicF9iZy5jZ3JhbV9jbWRfbGVu LyhzaXplb2YoaW50KS9zaXplb2YoX3NzZDEzMDVfcGFnZWNtZF9hcnJheVswXSkpLCAyLCAx MjgqMTAyNCk7CglpZiAobXgyZmJwX2JnLmNncmFtX2NtZF9kbWFfcG9vbCA9PSBOVUxMKSB7 CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlZCBETUEgUG9vbC5c biIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbXgyZmJwX2JnLmNncmFtX2NtZF92YWRkciA9 ICh1bnNpZ25lZCBsb25nKWRtYV9wb29sX2FsbG9jKG14MmZicF9iZy5jZ3JhbV9jbWRfZG1h X3Bvb2wsIEdGUF9ETUEgfCBHRlBfS0VSTkVMLCAoZG1hX2FkZHJfdCAqKSAmbXgyZmJwX2Jn LmNncmFtX2NtZF9wYWRkcik7CglpZiAoKHZvaWQgKilteDJmYnBfYmcuY2dyYW1fY21kX3Zh ZGRyID09IE5VTEwpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2Nh dGVkIERNQSBtZW1vcnkuXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglzbGNkY19maXJz dF9pbml0KCk7CglkZDEyODMyX2luaXRfY29udHJvbGxlcigpOwoKCXJldCA9IF9pbnN0YWxs X2ZiKCZteDJmYl9pbmZvLCBwZGV2KTsKCWlmIChyZXQpIHsKCQlkZXZfZXJyKCZwZGV2LT5k ZXYsCgkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOwoJCXJldHVybiBy ZXQ7Cgl9CgoJLy9fcmVxdWVzdF9pcnEoKTsKCglyZXR1cm4gMDsKfQoKLyohCiAqIEBicmll ZiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBwb2ludGVycyB0byB0aGUgcG93ZXIgbWFuYWdl bWVudAogKiBjYWxsYmFjayBmdW5jdGlvbnMuCiAqLwpzdGF0aWMgc3RydWN0IHBsYXRmb3Jt X2RyaXZlciBteDJmYl9kcml2ZXIgPSB7CgkuZHJpdmVyID0gewoJCSAgIC5uYW1lID0gIm14 Y19zZGNfZmIiLAoJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAoJCSAgIC5idXMgPSAmcGxh dGZvcm1fYnVzX3R5cGUsCgkJICAgfSwKCS5wcm9iZSA9IG14MmZiX3Byb2JlLAoJLnN1c3Bl bmQgPSBteDJmYl9zdXNwZW5kLAoJLnJlc3VtZSA9IG14MmZiX3Jlc3VtZSwKfTsKCi8qIQog KiBAYnJpZWYgSW5pdGlhbGl6YXRpb24KICovCmludCBfX2luaXQgbXgyZmJfaW5pdCh2b2lk KQp7CglpbnQgcmV0ID0gMDsKCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXgy ZmJfZHJpdmVyKTsKCXJldHVybiByZXQ7Cn0KCi8qIQogKiBAYnJpZWYgQ2xlYW51cAogKi8K dm9pZCBfX2V4aXQgbXgyZmJfZXhpdCh2b2lkKQp7CglfZnJlZV9pcnEoKTsKCV91bmluc3Rh bGxfZmIoJm14MmZiX2luZm8pOwoKCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZteDJm Yl9kcml2ZXIpOwp9CgovKiBNb2R1bGFyaXphdGlvbiAqLwptb2R1bGVfaW5pdChteDJmYl9p bml0KTsKbW9kdWxlX2V4aXQobXgyZmJfZXhpdCk7CgpFWFBPUlRfU1lNQk9MKG14Ml9nd19z ZXQpOwpFWFBPUlRfU1lNQk9MKG14MmZiX3JlZ2lzdGVyX2NsaWVudCk7CkVYUE9SVF9TWU1C T0wobXgyZmJfdW5yZWdpc3Rlcl9jbGllbnQpOwoKTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxl IFNlbWljb25kdWN0b3IsIEluYy4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJNWDIgZnJhbWVi dWZmZXIgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK --------------080906090607040704010200--