ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMxY2JmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICoJRXhlY3V0aXZlIE9TTQorICoKKyAqIAlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQSBsb3Qgb2YgdGhlIEkyTyBtZXNzYWdlIHNpZGUgY29kZSBmcm9tIHRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgUmVkCisgKglDcmVlayBSQ1BDSTQ1IGFkYXB0ZXIgZHJpdmVyIGJ5IFJlZCBDcmVlayBDb21tdW5pY2F0aW9ucworICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlQaGlsaXBwIFJ1bXBmCisgKgkJSnVoYSBTaWV25G5lbiA8SnVoYS5TaWV2YW5lbkBjcy5IZWxzaW5raS5GST4KKyAqCQlBdXZvIEjka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KKyAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlTdXBwb3J0IGZvciBzeXNmcyBpbmNsdWRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBPU01fTkFNRSAiZXhlYy1vc20iCisKK3N0cnVjdCBpMm9fZHJpdmVyIGkyb19leGVjX2RyaXZlcjsKKworc3RhdGljIGludCBpMm9fZXhlY19sY3Rfbm90aWZ5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNoYW5nZV9pbmQpOworCisvKiBNb2R1bGUgaW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gb3RoZXIgc291cmNlcyAqLworZXh0ZXJuIGludCBpMm9fZGV2aWNlX3BhcnNlX2xjdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CisKKy8qIGdsb2JhbCB3YWl0IGxpc3QgZm9yIFBPU1QgV0FJVCAqLworc3RhdGljIExJU1RfSEVBRChpMm9fZXhlY193YWl0X2xpc3QpOworCisvKiBXYWl0IHN0cnVjdCBuZWVkZWQgZm9yIFBPU1QgV0FJVCAqLworc3RydWN0IGkyb19leGVjX3dhaXQgeworCXdhaXRfcXVldWVfaGVhZF90ICp3cTsJLyogUG9pbnRlciB0byBXYWl0IHF1ZXVlICovCisJc3RydWN0IGkyb19kbWEgZG1hOwkvKiBETUEgYnVmZmVycyB0byBmcmVlIG9uIGZhaWx1cmUgKi8KKwl1MzIgdGNudHh0OwkJLyogdHJhbnNhY3Rpb24gY29udGV4dCBmcm9tIHJlcGx5ICovCisJaW50IGNvbXBsZXRlOwkJLyogMSBpZiByZXBseSByZWNlaXZlZCBvdGhlcndpc2UgMCAqLworCXUzMiBtOwkJCS8qIG1lc3NhZ2UgaWQgKi8KKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwkvKiBwb2ludGVyIHRvIHRoZSByZXBseSBtZXNzYWdlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBub2RlIGluIGdsb2JhbCB3YWl0IGxpc3QgKi8KK307CisKKy8qIEV4ZWMgT1NNIGNsYXNzIGhhbmRsaW5nIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2NsYXNzX2lkIGkyb19leGVjX2NsYXNzX2lkW10gPSB7CisJe0kyT19DTEFTU19FWEVDVVRJVkV9LAorCXtJMk9fQ0xBU1NfRU5EfQorfTsKKworLyoqCisgKglpMm9fZXhlY193YWl0X2FsbG9jIC0gQWxsb2NhdGUgYSBpMm9fZXhlY193YWl0IHN0cnVjdCBhbiBpbml0aWFsaXplIGl0CisgKgorICoJQWxsb2NhdGUgdGhlIGkyb19leGVjX3dhaXQgc3RydWN0IGFuZCBpbml0aWFsaXplIHRoZSB3YWl0LgorICoKKyAqCVJldHVybnMgaTJvX2V4ZWNfd2FpdCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbgorICoJZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fZXhlY193YWl0ICppMm9fZXhlY193YWl0X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQ7CisKKwl3YWl0ID0ga21hbGxvYyhzaXplb2YoKndhaXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdhaXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWVtc2V0KHdhaXQsIDAsIHNpemVvZigqd2FpdCkpOworCisJSU5JVF9MSVNUX0hFQUQoJndhaXQtPmxpc3QpOworCisJcmV0dXJuIHdhaXQ7Cit9OworCisvKioKKyAqCWkyb19leGVjX3dhaXRfZnJlZSAtIEZyZWUgYSBpMm9fZXhlY193YWl0IHN0cnVjdAorICoJQGkyb19leGVjX3dhaXQ6IEkyTyB3YWl0IGRhdGEgd2hpY2ggc2hvdWxkIGJlIGNsZWFuZWQgdXAKKyAqLworc3RhdGljIHZvaWQgaTJvX2V4ZWNfd2FpdF9mcmVlKHN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0KQoreworCWtmcmVlKHdhaXQpOworfTsKKworLyoqCisgKiAJaTJvX21zZ19wb3N0X3dhaXRfbWVtIC0gUG9zdCBhbmQgd2FpdCBhIG1lc3NhZ2Ugd2l0aCBETUEgYnVmZmVycworICoJQGM6IGNvbnRyb2xsZXIKKyAqCUBtOiBtZXNzYWdlIHRvIHBvc3QKKyAqCUB0aW1lb3V0OiB0aW1lIGluIHNlY29uZHMgdG8gd2FpdAorICoJQGRtYTogaTJvX2RtYSBzdHJ1Y3Qgb2YgdGhlIERNQSBidWZmZXIgdG8gZnJlZSBvbiBmYWlsdXJlCisgKgorICogCVRoaXMgQVBJIGFsbG93cyBhbiBPU00gdG8gcG9zdCBhIG1lc3NhZ2UgYW5kIHRoZW4gYmUgdG9sZCB3aGV0aGVyIG9yCisgKglub3QgdGhlIHN5c3RlbSByZWNlaXZlZCBhIHN1Y2Nlc3NmdWwgcmVwbHkuIElmIHRoZSBtZXNzYWdlIHRpbWVzIG91dAorICoJdGhlbiB0aGUgdmFsdWUgJy1FVElNRURPVVQnIGlzIHJldHVybmVkLiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJbgorICoJdGhpcyBzaXR1YXRpb24gdGhlIG1lc3NhZ2UgbWF5IChzaG91bGQpIGNvbXBsZXRlIGF0IGFuIGluZGVmaW5pdGUgdGltZQorICoJaW4gdGhlIGZ1dHVyZS4gV2hlbiBpdCBjb21wbGV0ZXMgaXQgd2lsbCB1c2UgdGhlIG1lbW9yeSBidWZmZXIKKyAqCWF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0LiBJZiAtRVRJTUVET1VUIGlzIHJldHVybmVkIHRoZW4gdGhlIG1lbW9yeQorICoJYnVmZmVyIG11c3Qgbm90IGJlIGZyZWVkLiBJbnN0ZWFkIHRoZSBldmVudCBjb21wbGV0aW9uIHdpbGwgZnJlZSB0aGVtCisgKglmb3IgeW91LiBJbiBhbGwgb3RoZXIgY2FzZXMgdGhlIGJ1ZmZlciBhcmUgeW91ciBwcm9ibGVtLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19tc2dfcG9zdF93YWl0X21lbShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLCB1bnNpZ25lZCBsb25nCisJCQkgIHRpbWVvdXQsIHN0cnVjdCBpMm9fZG1hICpkbWEpCit7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OworCXN0YXRpYyB1MzIgdGNudHh0ID0gMHg4MDAwMDAwMDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnID0gYy0+aW5fcXVldWUudmlydCArIG07CisJaW50IHJjID0gMDsKKworCXdhaXQgPSBpMm9fZXhlY193YWl0X2FsbG9jKCk7CisJaWYgKCF3YWl0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh0Y250eHQgPT0gMHhmZmZmZmZmZikKKwkJdGNudHh0ID0gMHg4MDAwMDAwMDsKKworCWlmIChkbWEpCisJCXdhaXQtPmRtYSA9ICpkbWE7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG1lc3NhZ2UgaW5pdGlhdG9yIGNvbnRleHQgYW5kIHRyYW5zYWN0aW9uIGNvbnRleHQuCisJICogV2Ugd2lsbCBvbmx5IHVzZSB0cmFuc2FjdGlvbiBjb250ZXh0cyA+PSAweDgwMDAwMDAwIGZvciBQT1NUIFdBSVQsCisJICogc28gd2UgY291bGQgZmluZCBhIFBPU1QgV0FJVCByZXBseSBlYXNpZXIgaW4gdGhlIHJlcGx5IGhhbmRsZXIuCisJICovCisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3YWl0LT50Y250eHQgPSB0Y250eHQrKzsKKwl3cml0ZWwod2FpdC0+dGNudHh0LCAmbXNnLT51LnMudGNudHh0KTsKKworCS8qCisJICogUG9zdCB0aGUgbWVzc2FnZSB0byB0aGUgY29udHJvbGxlci4gQXQgc29tZSBwb2ludCBsYXRlciBpdCB3aWxsCisJICogcmV0dXJuLiBJZiB3ZSB0aW1lIG91dCBiZWZvcmUgaXQgcmV0dXJucyB0aGVuIGNvbXBsZXRlIHdpbGwgYmUgemVyby4KKwkgKi8KKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlpZiAoIXdhaXQtPmNvbXBsZXRlKSB7CisJCXdhaXQtPndxID0gJndxOworCQkvKgorCQkgKiB3ZSBhZGQgZWxlbWVudHMgYWRkIHRoZSBoZWFkLCBiZWNhdXNlIGlmIGEgZW50cnkgaW4gdGhlIGxpc3QKKwkJICogd2lsbCBuZXZlciBiZSByZW1vdmVkLCB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBpdCBldmVyeSB0aW1lCisJCSAqLworCQlsaXN0X2FkZCgmd2FpdC0+bGlzdCwgJmkyb19leGVjX3dhaXRfbGlzdCk7CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIHdhaXQtPmNvbXBsZXRlLAorCQkJdGltZW91dCAqIEhaKTsKKworCQl3YWl0LT53cSA9IE5VTEw7CisJfQorCisJYmFycmllcigpOworCisJaWYgKHdhaXQtPmNvbXBsZXRlKSB7CisJCWlmIChyZWFkbCgmd2FpdC0+bXNnLT5ib2R5WzBdKSA+PiAyNCkKKwkJCXJjID0gcmVhZGwoJndhaXQtPm1zZy0+Ym9keVswXSkgJiAweGZmOworCQlpMm9fZmx1c2hfcmVwbHkoYywgd2FpdC0+bSk7CisJCWkyb19leGVjX3dhaXRfZnJlZSh3YWl0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBjYW5ub3QgcmVtb3ZlIGl0IG5vdy4gVGhpcyBpcyBpbXBvcnRhbnQuIFdoZW4gaXQgZG9lcworCQkgKiB0ZXJtaW5hdGUgKHdoaWNoIGl0IG11c3QgZG8gaWYgdGhlIGNvbnRyb2xsZXIgaGFzIG5vdAorCQkgKiBkaWVkLi4uKSB0aGVuIGl0IHdpbGwgb3RoZXJ3aXNlIHNjcmliYmxlIG9uIHN0dWZmLgorCQkgKgorCQkgKiBGSVhNRTogdHJ5IGFib3J0IG1lc3NhZ2UKKwkJICovCisJCWlmIChkbWEpCisJCQlkbWEtPnZpcnQgPSBOVUxMOworCisJCXJjID0gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlIC0gUmVwbHkgdG8gYSBpMm9fbXNnX3Bvc3QgcmVxdWVzdCBmcm9tIElPUAorICoJQGM6IEkyTyBjb250cm9sbGVyIHdoaWNoIGFuc3dlcnMKKyAqCUBtOiBtZXNzYWdlIGlkCisgKglAbXNnOiBwb2ludGVyIHRvIHRoZSBJMk8gcmVwbHkgbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0IG9ubHkuIElmIHRoZSByZXBseSByZWFjaGVkCisgKgliZWZvcmUgdGhlIHRpbWVvdXQsIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCBpcyBmaWxsZWQgd2l0aCB0aGUgbWVzc2FnZQorICoJYW5kIHRoZSB0YXNrIHdpbGwgYmUgd2FrZWQgdXAuIFRoZSB0YXNrIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nCisgKgl0aGUgbWVzc2FnZSBtIGJhY2sgdG8gdGhlIGNvbnRyb2xsZXIhIElmIHRoZSBtZXNzYWdlIHJlYWNoZXMgdXMgYWZ0ZXIKKyAqCXRoZSB0aW1lb3V0IGNsZWFuIHVwIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCAoaW5jbHVkaW5nIGFsbG9jYXRlZAorICoJRE1BIGJ1ZmZlcikuCisgKgorICoJUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIG1lc3NhZ2UgbSBzaG91bGQgbm90IGJlIGdpdmVuIGJhY2sgdG8gdGhlCisgKglJMk8gY29udHJvbGxlciwgb3IgPjAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGdpdmVuIGJhY2sKKyAqCWFmdGVyd29yZHMuIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBJbiB0aGlzIGNhc2UgdGhlCisgKgltZXNzYWdlIG11c3QgYWxzbyBiZSBnaXZlbiBiYWNrIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50IGkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQkJICAgICAgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZykKK3sKKwlzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdCwgKnRtcDsKKwlzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOworCWludCByYyA9IDE7CisJdTMyIGNvbnRleHQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbG9jayk7CisKKwljb250ZXh0ID0gcmVhZGwoJm1zZy0+dS5zLnRjbnR4dCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGkyb19leGVjX3dhaXRfbGlzdCB0byBzZWUgaWYgdGhlIGdpdmVuCisJICogbWVzc2FnZSBpcyBzdGlsbCBvdXRzdGFuZGluZy4gSWYgbm90LCBpdCBtZWFucyB0aGF0IHRoZSBJT1AgdG9vaworCSAqIGxvbmdlciB0byByZXNwb25kIHRvIHRoZSBtZXNzYWdlIHRoYW4gd2UgaGFkIGFsbG93ZWQgYW5kIHRpbWVyIGhhcworCSAqIGFscmVhZHkgZXhwaXJlZC4gTm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IHRoYXQgZXhjZXB0IGxvZyBpdCBmb3IKKwkgKiBkZWJ1ZyBwdXJwb3NlcywgaW5jcmVhc2UgdGltZW91dCwgYW5kIHJlY29tcGlsZS4KKwkgKi8KKwlzcGluX2xvY2soJmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0LCB0bXAsICZpMm9fZXhlY193YWl0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHdhaXQtPnRjbnR4dCA9PSBjb250ZXh0KSB7CisJCQlsaXN0X2RlbCgmd2FpdC0+bGlzdCk7CisKKwkJCXdhaXQtPm0gPSBtOworCQkJd2FpdC0+bXNnID0gbXNnOworCQkJd2FpdC0+Y29tcGxldGUgPSAxOworCisJCQliYXJyaWVyKCk7CisKKwkJCWlmICh3YWl0LT53cSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSh3YWl0LT53cSk7CisJCQkJcmMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkJCQlkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJCQkJcHJfZGVidWcoIiVzOiB0aW1lZG91dCByZXBseSByZWNlaXZlZCFcbiIsCisJCQkJCSBjLT5uYW1lKTsKKwkJCQlpMm9fZG1hX2ZyZWUoZGV2LCAmd2FpdC0+ZG1hKTsKKwkJCQlpMm9fZXhlY193YWl0X2ZyZWUod2FpdCk7CisJCQkJcmMgPSAtMTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJmxvY2spOworCisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmbG9jayk7CisKKwlwcl9kZWJ1ZygiJXM6IEJvZ3VzIHJlcGx5IGluIFBPU1QgV0FJVCAodHItY29udGV4dDogJTA4eCkhXG4iLCBjLT5uYW1lLAorCQkgY29udGV4dCk7CisKKwlyZXR1cm4gLTE7Cit9OworCisvKioKKyAqCWkyb19leGVjX3Byb2JlIC0gQ2FsbGVkIGlmIGEgbmV3IEkyTyBkZXZpY2UgKGV4ZWN1dGl2ZSBjbGFzcykgYXBwZWFycworICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgcHJvYmVkCisgKgorICoJUmVnaXN0ZXJzIGV2ZW50IG5vdGlmaWNhdGlvbiBmb3IgZXZlcnkgZXZlbnQgZnJvbSBFeGVjdXRpdmUgZGV2aWNlLiBUaGUKKyAqCXJldHVybiBpcyBhbHdheXMgMCwgYmVjYXVzZSB3ZSB3YW50IGFsbCBkZXZpY2VzIG9mIGNsYXNzIEV4ZWN1dGl2ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpMm9fZXhlY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisKKwlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19leGVjX2RyaXZlciwgMCwgMHhmZmZmZmZmZik7CisKKwlpMm9fZGV2LT5pb3AtPmV4ZWMgPSBpMm9fZGV2OworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19leGVjX3JlbW92ZSAtIENhbGxlZCBvbiBJMk8gZGV2aWNlIHJlbW92YWwKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggd2FzIHJlbW92ZWQKKyAqCisgKglVbnJlZ2lzdGVycyBldmVudCBub3RpZmljYXRpb24gZnJvbSBFeGVjdXRpdmUgSTJPIGRldmljZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpMm9fZXhlY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWkyb19ldmVudF9yZWdpc3Rlcih0b19pMm9fZGV2aWNlKGRldiksICZpMm9fZXhlY19kcml2ZXIsIDAsIDApOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19leGVjX2xjdF9tb2RpZmllZCAtIENhbGxlZCBvbiBMQ1QgTk9USUZZIHJlcGx5CisgKglAYzogSTJPIGNvbnRyb2xsZXIgb24gd2hpY2ggdGhlIExDVCBoYXMgbW9kaWZpZWQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYXN5bmNocm9udXMgTENUIE5PVElGWSByZXBsaWVzLiBJdCBwYXJzZXMgdGhlCisgKgluZXcgTENUIGFuZCBpZiB0aGUgYnVmZmVyIGZvciB0aGUgTENUIHdhcyB0byBzbWFsbCBzZW5kcyBhIExDVCBOT1RJRlkKKyAqCWFnYWluLgorICovCitzdGF0aWMgdm9pZCBpMm9fZXhlY19sY3RfbW9kaWZpZWQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWlmIChpMm9fZGV2aWNlX3BhcnNlX2xjdChjKSA9PSAtRUFHQUlOKQorCQlpMm9fZXhlY19sY3Rfbm90aWZ5KGMsIDApOworfTsKKworLyoqCisgKglpMm9fZXhlY19yZXBseSAtICBJMk8gRXhlY3V0aXZlIHJlcGx5IGhhbmRsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSByZXBseSBjb21lcworICoJQG06IG1lc3NhZ2UgaWQKKyAqCUBtc2c6IHBvaW50ZXIgdG8gdGhlIEkyTyByZXBseSBtZXNzYWdlCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuIElmIGEgUE9TVCBXQUlUCisgKglyZXBseSB3YXMgcmVjZWl2ZWQsIHBhc3MgaXQgdG8gdGhlIGNvbXBsZXRlIGZ1bmN0aW9uLiBJZiBhIExDVCBOT1RJRlkKKyAqCXJlcGx5IHdhcyByZWNlaXZlZCwgYSBuZXcgZXZlbnQgaXMgY3JlYXRlZCB0byBoYW5kbGUgdGhlIHVwZGF0ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIHJlcGx5IHNob3VsZCBub3QgYmUgZmx1c2hlZCBvciA+IDAKKyAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgYmUgZmx1c2hlZC4gUmV0dXJucyBuZWdhdGl2ZSBlcnJvcgorICoJY29kZSBvbiBmYWlsdXJlIGFuZCBpZiB0aGUgcmVwbHkgc2hvdWxkIGJlIGZsdXNoZWQuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2V4ZWNfcmVwbHkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKKwkJCSAgc3RydWN0IGkyb19tZXNzYWdlICptc2cpCit7CisJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzBdKSAmIE1TR19GQUlMKSB7CS8vIEZhaWwgYml0IGlzIHNldAorCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqcG1zZzsJLyogcHJlc2VydmVkIG1lc3NhZ2UgKi8KKwkJdTMyIHBtOworCisJCXBtID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzNdKTsKKworCQlwbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIHBtKTsKKworCQlpMm9fcmVwb3J0X3N0YXR1cyhLRVJOX0lORk8sICJpMm9fY29yZSIsIG1zZyk7CisKKwkJLyogUmVsZWFzZSB0aGUgcHJlc2VydmVkIG1zZyBieSByZXN1Ym1pdHRpbmcgaXQgYXMgYSBOT1AgKi8KKwkJaTJvX21zZ19ub3AoYywgcG0pOworCisJCS8qIElmIHJlcGx5IHRvIGkyb19wb3N0X3dhaXQgZmFpbGVkLCByZXR1cm4gY2F1c2VzIGEgdGltZW91dCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5zLnRjbnR4dCkgJiAweDgwMDAwMDAwKQorCQlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUoYywgbSwgbXNnKTsKKworCWlmICgobGUzMl90b19jcHUobXNnLT51LmhlYWRbMV0pID4+IDI0KSA9PSBJMk9fQ01EX0xDVF9OT1RJRlkpIHsKKwkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOworCisJCXByX2RlYnVnKCIlczogTENUIG5vdGlmeSByZWNlaXZlZFxuIiwgYy0+bmFtZSk7CisKKwkJd29yayA9IGttYWxsb2Moc2l6ZW9mKCp3b3JrKSwgR0ZQX0FUT01JQyk7CisJCWlmICghd29yaykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCUlOSVRfV09SSyh3b3JrLCAodm9pZCAoKikodm9pZCAqKSlpMm9fZXhlY19sY3RfbW9kaWZpZWQsIGMpOworCQlxdWV1ZV93b3JrKGkyb19leGVjX2RyaXZlci5ldmVudF9xdWV1ZSwgd29yayk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogSWYgdGhpcyBoYXBwZW5zLCB3ZSB3YW50IHRvIGR1bXAgdGhlIG1lc3NhZ2UgdG8gdGhlIHN5c2xvZyBzbworCSAqIGl0IGNhbiBiZSBzZW50IGJhY2sgdG8gdGhlIGNhcmQgbWFudWZhY3R1cmVyIGJ5IHRoZSBlbmQgdXNlcgorCSAqIHRvIGFpZCBpbiBkZWJ1Z2dpbmcuCisJICoKKwkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5zb2xpY2l0ZWQgbWVzc2FnZSByZXBseSBzZW50IHRvIGNvcmUhIgorCSAgICAgICAiTWVzc2FnZSBkdW1wZWQgdG8gc3lzbG9nXG4iLCBjLT5uYW1lKTsKKwlpMm9fZHVtcF9tZXNzYWdlKG1zZyk7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoqCisgKglpMm9fZXhlY19ldmVudCAtIEV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uCisgKglAZXZ0OiBFdmVudCB3aGljaCBvY2N1cnMKKyAqCisgKglIYW5kbGVzIGV2ZW50cyBzZW5kIGJ5IHRoZSBFeGVjdXRpdmUgZGV2aWNlLiBBdCB0aGUgbW9tZW50IGRvZXMgbm90IGRvCisgKglhbnl0aGluZyB1c2VmdWwuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19leGVjX2V2ZW50KHN0cnVjdCBpMm9fZXZlbnQgKmV2dCkKK3sKKwlvc21faW5mbygiRXZlbnQgcmVjZWl2ZWQgZnJvbSBkZXZpY2U6ICVkXG4iLAorCQkgZXZ0LT5pMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCWtmcmVlKGV2dCk7Cit9OworCisvKioKKyAqCWkyb19leGVjX2xjdF9nZXQgLSBHZXQgdGhlIElPUCdzIExvZ2ljYWwgQ29uZmlndXJhdGlvbiBUYWJsZQorICoJQGM6IEkyTyBjb250cm9sbGVyIGZyb20gd2hpY2ggdGhlIExDVCBzaG91bGQgYmUgZmV0Y2hlZAorICoKKyAqCVNlbmQgYSBMQ1QgTk9USUZZIHJlcXVlc3QgdG8gdGhlIGNvbnRyb2xsZXIsIGFuZCB3YWl0CisgKglJMk9fVElNRU9VVF9MQ1RfR0VUIHNlY29uZHMgdW50aWwgYXJyaXZhbCBvZiByZXNwb25zZS4gSWYgdGhlIExDVCBpcworICoJdG8gbGFyZ2UsIHJldHJ5IGl0LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19leGVjX2xjdF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaW50IGkgPSAwOworCWludCByYyA9IC1FQUdBSU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IEkyT19MQ1RfR0VUX1RSSUVTOyBpKyspIHsKKwkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQl3cml0ZWwoRUlHSFRfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNiwgJm1zZy0+dS5oZWFkWzBdKTsKKwkJd3JpdGVsKEkyT19DTURfTENUX05PVElGWSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJm1zZy0+Ym9keVswXSk7CisJCXdyaXRlbCgweDAwMDAwMDAwLCAmbXNnLT5ib2R5WzFdKTsKKwkJd3JpdGVsKDB4ZDAwMDAwMDAgfCBjLT5kbGN0LmxlbiwgJm1zZy0+Ym9keVsyXSk7CisJCXdyaXRlbChjLT5kbGN0LnBoeXMsICZtc2ctPmJvZHlbM10pOworCisJCXJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgSTJPX1RJTUVPVVRfTENUX0dFVCk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQlyYyA9IGkyb19kZXZpY2VfcGFyc2VfbGN0KGMpOworCQlpZiAocmMgIT0gLUVBR0FJTikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKglpMm9fZXhlY19sY3Rfbm90aWZ5IC0gU2VuZCBhIGFzeW5jaHJvbnVzIExDVCBOT1RJRlkgcmVxdWVzdAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBzZW5kCisgKglAY2hhbmdlX2luZDogY2hhbmdlIGluZGljYXRvcgorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBMQ1QgTk9USUZZIHJlcXVlc3QgdG8gdGhlIEkyTyBjb250cm9sbGVyIHdpdGgKKyAqCXRoZSBjaGFuZ2UgaW5kaWNhdG9yIGNoYW5nZV9pbmQuIElmIHRoZSBjaGFuZ2VfaW5kID09IDAgdGhlIGNvbnRyb2xsZXIKKyAqCXJlcGxpZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlcXVlc3QuIElmIGNoYW5nZV9pbmQgPiAwIHRoZSByZXBseSBpcworICoJc2VuZCBhZnRlciBjaGFuZ2UgaW5kaWNhdG9yIG9mIHRoZSBMQ1QgaXMgPiBjaGFuZ2VfaW5kLgorICovCitzdGF0aWMgaW50IGkyb19leGVjX2xjdF9ub3RpZnkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgY2hhbmdlX2luZCkKK3sKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJZGV2ID0gJmMtPnBkZXYtPmRldjsKKworCWlmIChpMm9fZG1hX3JlYWxsb2MoZGV2LCAmYy0+ZGxjdCwgc2ItPmV4cGVjdGVkX2xjdF9zaXplLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChFSUdIVF9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF82LCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0xDVF9OT1RJRlkgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fZXhlY19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CisJd3JpdGVsKDAsICZtc2ctPnUucy50Y250eHQpOwkvKiBGSVhNRSAqLworCXdyaXRlbCgweGZmZmZmZmZmLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoY2hhbmdlX2luZCwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKDB4ZDAwMDAwMDAgfCBjLT5kbGN0LmxlbiwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKGMtPmRsY3QucGh5cywgJm1zZy0+Ym9keVszXSk7CisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlyZXR1cm4gMDsKK307CisKKy8qIEV4ZWMgT1NNIGRyaXZlciBzdHJ1Y3QgKi8KK3N0cnVjdCBpMm9fZHJpdmVyIGkyb19leGVjX2RyaXZlciA9IHsKKwkubmFtZSA9IE9TTV9OQU1FLAorCS5yZXBseSA9IGkyb19leGVjX3JlcGx5LAorCS5ldmVudCA9IGkyb19leGVjX2V2ZW50LAorCS5jbGFzc2VzID0gaTJvX2V4ZWNfY2xhc3NfaWQsCisJLmRyaXZlciA9IHsKKwkJICAgLnByb2JlID0gaTJvX2V4ZWNfcHJvYmUsCisJCSAgIC5yZW1vdmUgPSBpMm9fZXhlY19yZW1vdmUsCisJCSAgIH0sCit9OworCisvKioKKyAqCWkyb19leGVjX2luaXQgLSBSZWdpc3RlcnMgdGhlIEV4ZWMgT1NNCisgKgorICoJUmVnaXN0ZXJzIHRoZSBFeGVjIE9TTSBpbiB0aGUgSTJPIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGkyb19leGVjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2V4ZWNfZHJpdmVyKTsKK307CisKKy8qKgorICoJaTJvX2V4ZWNfZXhpdCAtIFJlbW92ZXMgdGhlIEV4ZWMgT1NNCisgKgorICoJVW5yZWdpc3RlcnMgdGhlIEV4ZWMgT1NNIGZyb20gdGhlIEkyTyBjb3JlLgorICovCit2b2lkIF9fZXhpdCBpMm9fZXhlY19leGl0KHZvaWQpCit7CisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fZXhlY19kcml2ZXIpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0pOworRVhQT1JUX1NZTUJPTChpMm9fZXhlY19sY3RfZ2V0KTsK