ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyaWFkbmUuYyBiL2RyaXZlcnMvbmV0L2FyaWFkbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU5M2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCkBAIC0wLDAgKzEsODc4IEBACisvKgorICogIEFtaWdhIExpbnV4L202OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKKyAqCisgKiAgqSBDb3B5cmlnaHQgMTk5NS0yMDAzIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiAoZ2VlcnRAbGludXgtbTY4ay5vcmcpCisgKgkJCSAgICAgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKQorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCisgKgkJCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKKyAqCQkJQWR2YW5jZWQgTWljcm8gRGV2aWNlcworICoJCQlQdWJsaWNhdGlvbiAjMTY5MDcsIFJldi4gQiwgQW1lbmRtZW50LzAsIE1heSAxOTk0CisgKgorICoJTUM2ODIzMDoJUGFyYWxsZWwgSW50ZXJmYWNlL1RpbWVyIChQSS9UKQorICoJCQlNb3Rvcm9sYSBTZW1pY29uZHVjdG9ycywgRGVjZW1iZXIsIDE5ODMKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgKKyAqICBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoZSBBcmlhZG5lIGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBWaWxsYWdlIFRyb25pYy4gSXQgY29udGFpbnM6CisgKgorICoJLSBhbiBBbTc5Qzk2MCBQQ25ldC1JU0EgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlciB3aXRoIGJvdGgKKyAqCSAgMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIDEwQkFTRS1UIChVVFApIGNvbm5lY3RvcnMKKyAqCisgKgktIGFuIE1DNjgyMzAgUGFyYWxsZWwgSW50ZXJmYWNlL1RpbWVyIGNvbmZpZ3VyZWQgYXMgMiBwYXJhbGxlbCBwb3J0cworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAiYXJpYWRuZS5oIgorCisKKyNpZmRlZiBBUklBRE5FX0RFQlVHCitpbnQgYXJpYWRuZV9kZWJ1ZyA9IEFSSUFETkVfREVCVUc7CisjZWxzZQoraW50IGFyaWFkbmVfZGVidWcgPSAxOworI2VuZGlmCisKKworICAgIC8qCisgICAgICoJTWFjcm9zIHRvIEZpeCBFbmRpYW5uZXNzIHByb2JsZW1zCisgICAgICovCisKKwkJCQkvKiBTd2FwIHRoZSBCeXRlcyBpbiBhIFdPUkQgKi8KKyNkZWZpbmUgc3dhcHcoeCkJKCgoeD4+OCkmMHgwMGZmKXwoKHg8PDgpJjB4ZmYwMCkpCisJCQkJLyogR2V0IHRoZSBMb3cgQllURSBpbiBhIFdPUkQgKi8KKyNkZWZpbmUgbG93Yih4KQkJKHgmMHhmZikKKwkJCQkvKiBHZXQgdGhlIFN3YXBwZWQgSGlnaCBXT1JEIGluIGEgTE9ORyAqLworI2RlZmluZSBzd2hpZ2h3KHgpCSgoKCh4KT4+OCkmMHhmZjAwKXwoKCh4KT4+MjQpJjB4MDBmZikpCisJCQkJLyogR2V0IHRoZSBTd2FwcGVkIExvdyBXT1JEIGluIGEgTE9ORyAqLworI2RlZmluZSBzd2xvd3coeCkJKCgoKHgpPDw4KSYweGZmMDApfCgoKHgpPj44KSYweDAwZmYpKQorCisKKyAgICAvKgorICAgICAqCVRyYW5zbWl0L1JlY2VpdmUgUmluZyBEZWZpbml0aW9ucworICAgICAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQk1CisjZGVmaW5lIFJYX1JJTkdfU0laRQkxNgorCisjZGVmaW5lIFBLVF9CVUZfU0laRQkxNTIwCisKKworICAgIC8qCisgICAgICoJUHJpdmF0ZSBEZXZpY2UgRGF0YQorICAgICAqLworCitzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlIHsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdHhfcmluZ1tUWF9SSU5HX1NJWkVdOworICAgIHZvbGF0aWxlIHN0cnVjdCBSRFJFICpyeF9yaW5nW1JYX1JJTkdfU0laRV07CisgICAgdm9sYXRpbGUgdV9zaG9ydCAqdHhfYnVmZltUWF9SSU5HX1NJWkVdOworICAgIHZvbGF0aWxlIHVfc2hvcnQgKnJ4X2J1ZmZbUlhfUklOR19TSVpFXTsKKyAgICBpbnQgY3VyX3R4LCBjdXJfcng7CQkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisgICAgaW50IGRpcnR5X3R4OwkJCS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgY2hhciB0eF9mdWxsOworfTsKKworCisgICAgLyoKKyAgICAgKglTdHJ1Y3R1cmUgQ3JlYXRlZCBpbiB0aGUgQXJpYWRuZSdzIFJBTSBCdWZmZXIKKyAgICAgKi8KKworc3RydWN0IGxhbmNlZGF0YSB7CisgICAgc3RydWN0IFREUkUgdHhfcmluZ1tUWF9SSU5HX1NJWkVdOworICAgIHN0cnVjdCBSRFJFIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICB1X3Nob3J0IHR4X2J1ZmZbVFhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUvc2l6ZW9mKHVfc2hvcnQpXTsKKyAgICB1X3Nob3J0IHJ4X2J1ZmZbUlhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUvc2l6ZW9mKHVfc2hvcnQpXTsKK307CisKK3N0YXRpYyBpbnQgYXJpYWRuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJpYWRuZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFyaWFkbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJpYWRuZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpbnQgYXJpYWRuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWZkZWYgSEFWRV9NVUxUSUNBU1QKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIG1lbWNweXcodm9sYXRpbGUgdV9zaG9ydCAqZGVzdCwgdV9zaG9ydCAqc3JjLCBpbnQgbGVuKQoreworICAgIHdoaWxlIChsZW4gPj0gMikgeworCSooZGVzdCsrKSA9ICooc3JjKyspOworCWxlbiAtPSAyOworICAgIH0KKyAgICBpZiAobGVuID09IDEpCisJKmRlc3QgPSAoKih1X2NoYXIgKilzcmMpPDw4OworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFyaWFkbmVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKKworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RldmljZV9pZCBhcmlhZG5lX3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUgfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB6b3Jyb19kcml2ZXIgYXJpYWRuZV9kcml2ZXIgPSB7CisgICAgLm5hbWUJPSAiYXJpYWRuZSIsCisgICAgLmlkX3RhYmxlCT0gYXJpYWRuZV96b3Jyb190YmwsCisgICAgLnByb2JlCT0gYXJpYWRuZV9pbml0X29uZSwKKyAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoYXJpYWRuZV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFyaWFkbmVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworICAgIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gYm9hcmQrQVJJQURORV9MQU5DRTsKKyAgICB1bnNpZ25lZCBsb25nIG1lbV9zdGFydCA9IGJvYXJkK0FSSUFETkVfUkFNOworICAgIHN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CisgICAgaW50IGVycjsKKworICAgIHIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCksICJBbTc5Qzk2MCIpOworICAgIGlmICghcjEpCisJcmV0dXJuIC1FQlVTWTsKKyAgICByMiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUsICJSQU0iKTsKKyAgICBpZiAoIXIyKSB7CisJcmVsZWFzZV9yZXNvdXJjZShyMSk7CisJcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSkpOworICAgIGlmIChkZXYgPT0gTlVMTCkgeworCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCXJlbGVhc2VfcmVzb3VyY2UocjIpOworCXJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHIxLT5uYW1lID0gZGV2LT5uYW1lOworICAgIHIyLT5uYW1lID0gZGV2LT5uYW1lOworCisgICAgZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IDB4NjA7CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IDB4MzA7CisgICAgZGV2LT5kZXZfYWRkclszXSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyPj4xNikgJiAweGZmOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+OCkgJiAweGZmOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSB6LT5yb20uZXJfU2VyaWFsTnVtYmVyICYgMHhmZjsKKyAgICBkZXYtPmJhc2VfYWRkciA9IFpUV09fVkFERFIoYmFzZV9hZGRyKTsKKyAgICBkZXYtPm1lbV9zdGFydCA9IFpUV09fVkFERFIobWVtX3N0YXJ0KTsKKyAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCtBUklBRE5FX1JBTV9TSVpFOworCisgICAgZGV2LT5vcGVuID0gJmFyaWFkbmVfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmYXJpYWRuZV9jbG9zZTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhcmlhZG5lX3N0YXJ0X3htaXQ7CisgICAgZGV2LT50eF90aW1lb3V0ID0gJmFyaWFkbmVfdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZhcmlhZG5lX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisKKyAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBpZiAoZXJyKSB7CisJcmVsZWFzZV9yZXNvdXJjZShyMSk7CisJcmVsZWFzZV9yZXNvdXJjZShyMik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgICB6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFyaWFkbmUgYXQgMHglMDhseCwgRXRoZXJuZXQgQWRkcmVzcyAiCisJICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsIGJvYXJkLAorCSAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFyaWFkbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IGluOworICAgIHVfbG9uZyB2ZXJzaW9uOworICAgIGludCBpOworCisgICAgLyogUmVzZXQgdGhlIExBTkNFICovCisgICAgaW4gPSBsYW5jZS0+UmVzZXQ7CisKKyAgICAvKiBTdG9wIHRoZSBMQU5DRSAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IFNUT1A7CisKKyAgICAvKiBDaGVjayB0aGUgTEFOQ0UgdmVyc2lvbiAqLworICAgIGxhbmNlLT5SQVAgPSBDU1I4ODsJCS8qIENoaXAgSUQgKi8KKyAgICB2ZXJzaW9uID0gc3dhcHcobGFuY2UtPlJEUCk7CisgICAgbGFuY2UtPlJBUCA9IENTUjg5OwkJLyogQ2hpcCBJRCAqLworICAgIHZlcnNpb24gfD0gc3dhcHcobGFuY2UtPlJEUCk8PDE2OworICAgIGlmICgodmVyc2lvbiAmIDB4MDAwMDBmZmYpICE9IDB4MDAwMDAwMDMpIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX29wZW46IENvdWxkbid0IGZpbmQgQU1EIEV0aGVybmV0IENoaXBcbiIpOworCXJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoKHZlcnNpb24gJiAweDBmZmZmMDAwKSAhPSAweDAwMDAzMDAwKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9vcGVuOiBDb3VsZG4ndCBmaW5kIEFtNzlDOTYwIChXcm9uZyBwYXJ0ICIKKwkgICAgICAgIm51bWJlciA9ICVsZClcbiIsICh2ZXJzaW9uICYgMHgwZmZmZjAwMCk+PjEyKTsKKwlyZXR1cm4gLUVBR0FJTjsKKyAgICB9CisjaWYgMAorICAgIHByaW50ayhLRVJOX0RFQlVHICJhcmlhZG5lX29wZW46IEFtNzlDOTYwIChQQ25ldC1JU0EpIFJldmlzaW9uICVsZFxuIiwKKwkgICAodmVyc2lvbiAmIDB4ZjAwMDAwMDApPj4yOCk7CisjZW5kaWYKKworICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7CisKKyAgICAvKiBNaXNjZWxsYW5lb3VzIFN0dWZmICovCisgICAgbGFuY2UtPlJBUCA9IENTUjM7CQkvKiBJbnRlcnJ1cHQgTWFza3MgYW5kIERlZmVycmFsIENvbnRyb2wgKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworICAgIGxhbmNlLT5SQVAgPSBDU1I0OwkJLyogVGVzdCBhbmQgRmVhdHVyZXMgQ29udHJvbCAqLworICAgIGxhbmNlLT5SRFAgPSBEUE9MTHxBUEFEX1hNVHxNRkNPTXxSQ1ZDQ09NfFRYU1RSVE18SkFCTTsKKworICAgIC8qIFNldCB0aGUgTXVsdGljYXN0IFRhYmxlICovCisgICAgbGFuY2UtPlJBUCA9IENTUjg7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlsxNTowXSAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisgICAgbGFuY2UtPlJBUCA9IENTUjk7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlszMToxNl0gKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworICAgIGxhbmNlLT5SQVAgPSBDU1IxMDsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzQ3OjMyXSAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisgICAgbGFuY2UtPlJBUCA9IENTUjExOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNjM6NDhdICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKworICAgIC8qIFNldCB0aGUgRXRoZXJuZXQgSGFyZHdhcmUgQWRkcmVzcyAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IxMjsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbMTU6MF0gKi8KKyAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzBdOworICAgIGxhbmNlLT5SQVAgPSBDU1IxMzsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbMzE6MTZdICovCisgICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVsxXTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTQ7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzQ3OjMyXSAqLworICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMl07CisKKyAgICAvKiBTZXQgdGhlIEluaXQgQmxvY2sgTW9kZSAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworCisgICAgLyogU2V0IHRoZSBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmcgUG9pbnRlciAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IzMDsJCS8qIEJhc2UgQWRkcmVzcyBvZiBUcmFuc21pdCBSaW5nICovCisgICAgbGFuY2UtPlJEUCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9yaW5nKSk7CisgICAgbGFuY2UtPlJBUCA9IENTUjMxOwkJLyogQmFzZSBBZGRyZXNzIG9mIHRyYW5zbWl0IFJpbmcgKi8KKyAgICBsYW5jZS0+UkRQID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9yaW5nKSk7CisKKyAgICAvKiBTZXQgdGhlIFJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIFBvaW50ZXIgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMjQ7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCisgICAgbGFuY2UtPlJEUCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9yaW5nKSk7CisgICAgbGFuY2UtPlJBUCA9IENTUjI1OwkJLyogQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLworICAgIGxhbmNlLT5SRFAgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X3JpbmcpKTsKKworICAgIC8qIFNldCB0aGUgTnVtYmVyIG9mIFJYIGFuZCBUWCBSaW5nIEVudHJpZXMgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSNzY7CQkvKiBSZWNlaXZlIFJpbmcgTGVuZ3RoICovCisgICAgbGFuY2UtPlJEUCA9IHN3YXB3KCgodV9zaG9ydCktUlhfUklOR19TSVpFKSk7CisgICAgbGFuY2UtPlJBUCA9IENTUjc4OwkJLyogVHJhbnNtaXQgUmluZyBMZW5ndGggKi8KKyAgICBsYW5jZS0+UkRQID0gc3dhcHcoKCh1X3Nob3J0KS1UWF9SSU5HX1NJWkUpKTsKKworICAgIC8qIEVuYWJsZSBNZWRpYSBJbnRlcmZhY2UgUG9ydCBBdXRvIFNlbGVjdCAoMTBCQVNFLTIvMTBCQVNFLVQpICovCisgICAgbGFuY2UtPlJBUCA9IElTQUNTUjI7CS8qIE1pc2NlbGxhbmVvdXMgQ29uZmlndXJhdGlvbiAqLworICAgIGxhbmNlLT5JRFAgPSBBU0VMOworCisgICAgLyogTEVEIENvbnRyb2wgKi8KKyAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNTsJLyogTEVEMSBTdGF0dXMgKi8KKyAgICBsYW5jZS0+SURQID0gUFNFfFhNVEU7CisgICAgbGFuY2UtPlJBUCA9IElTQUNTUjY7CS8qIExFRDIgU3RhdHVzICovCisgICAgbGFuY2UtPklEUCA9IFBTRXxDT0xFOworICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I3OwkvKiBMRUQzIFN0YXR1cyAqLworICAgIGxhbmNlLT5JRFAgPSBQU0V8UkNWRTsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhcmlhZG5lX2ludGVycnVwdCwgU0FfU0hJUlEsCisgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2KTsKKyAgICBpZiAoaSkgcmV0dXJuIGk7CisKKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhcmlhZG5lX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZWRhdGEgKmxhbmNlZGF0YSA9IChzdHJ1Y3QgbGFuY2VkYXRhICopZGV2LT5tZW1fc3RhcnQ7CisgICAgaW50IGk7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICBwcml2LT50eF9mdWxsID0gMDsKKyAgICBwcml2LT5jdXJfcnggPSBwcml2LT5jdXJfdHggPSAwOworICAgIHByaXYtPmRpcnR5X3R4ID0gMDsKKworICAgIC8qIFNldCB1cCBUWCBSaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJdm9sYXRpbGUgc3RydWN0IFREUkUgKnQgPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOworCXQtPlRNRDAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfYnVmZltpXSkpOworCXQtPlRNRDEgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X2J1ZmZbaV0pKSB8CisJCSAgVEZfU1RQIHwgVEZfRU5QOworCXQtPlRNRDIgPSBzd2FwdygodV9zaG9ydCktUEtUX0JVRl9TSVpFKTsKKwl0LT5UTUQzID0gMDsKKwlwcml2LT50eF9yaW5nW2ldID0gJmxhbmNlZGF0YS0+dHhfcmluZ1tpXTsKKwlwcml2LT50eF9idWZmW2ldID0gbGFuY2VkYXRhLT50eF9idWZmW2ldOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiVFggRW50cnkgJTJkIGF0ICVwLCBCdWYgYXQgJXBcbiIsIGksCisJICAgICAgICZsYW5jZWRhdGEtPnR4X3JpbmdbaV0sIGxhbmNlZGF0YS0+dHhfYnVmZltpXSk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgUlggUmluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCXZvbGF0aWxlIHN0cnVjdCBSRFJFICpyID0gJmxhbmNlZGF0YS0+cnhfcmluZ1tpXTsKKwlyLT5STUQwID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X2J1ZmZbaV0pKTsKKwlyLT5STUQxID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9idWZmW2ldKSkgfAorCQkgIFJGX09XTjsKKwlyLT5STUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7CisJci0+Uk1EMyA9IDB4MDAwMDsKKwlwcml2LT5yeF9yaW5nW2ldID0gJmxhbmNlZGF0YS0+cnhfcmluZ1tpXTsKKwlwcml2LT5yeF9idWZmW2ldID0gbGFuY2VkYXRhLT5yeF9idWZmW2ldOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiUlggRW50cnkgJTJkIGF0ICVwLCBCdWYgYXQgJXBcbiIsIGksCisJICAgICAgICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV0sIGxhbmNlZGF0YS0+cnhfYnVmZltpXSk7CisjZW5kaWYKKyAgICB9Cit9CisKKworc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgbGFuY2UtPlJBUCA9IENTUjExMjsJLyogTWlzc2VkIEZyYW1lIENvdW50ICovCisgICAgcHJpdi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IHN3YXB3KGxhbmNlLT5SRFApOworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisKKyAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDEpIHsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVsdSBwYWNrZXRzIG1pc3NlZFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBwcml2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKKyAgICB9CisKKyAgICAvKiBXZSBzdG9wIHRoZSBMQU5DRSBoZXJlIC0tIGl0IG9jY2FzaW9uYWxseSBwb2xscyBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCisgICAgbGFuY2UtPlJEUCA9IFNUT1A7CisKKyAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYXJpYWRuZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gU1RPUDsKKyAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOworICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlQ7CisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OworICAgIGludCBjc3IwLCBib2d1c2NudDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX2ludGVycnVwdCgpOiBpcnEgZm9yIHVua25vd24gZGV2aWNlLlxuIik7CisJcmV0dXJuIElSUV9OT05FOworICAgIH0KKworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCisgICAgaWYgKCEobGFuY2UtPlJEUCAmIElOVFIpKQkJLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgYmVlbiAqLworCXJldHVybiBJUlFfTk9ORTsJCS8qIGdlbmVyYXRlZCBieSB0aGUgYm9hcmQuICovCisKKyAgICBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGJvZ3VzY250ID0gMTA7CisgICAgd2hpbGUgKChjc3IwID0gbGFuY2UtPlJEUCkgJiAoRVJSfFJJTlR8VElOVCkgJiYgLS1ib2d1c2NudCA+PSAwKSB7CisJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJbGFuY2UtPlJEUCA9IGNzcjAgJiB+KElORUF8VERNRHxTVE9QfFNUUlR8SU5JVCk7CisKKyNpZiAwCisJaWYgKGFyaWFkbmVfZGVidWcgPiA1KSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0ICBjc3IwPSUjMi4yeCBuZXcgY3NyPSUjMi4yeC4iLAorCQkgICBkZXYtPm5hbWUsIGNzcjAsIGxhbmNlLT5SRFApOworCSAgICBwcmludGsoIlsiKTsKKwkgICAgaWYgKGNzcjAgJiBJTlRSKQorCQlwcmludGsoIiBJTlRSIik7CisJICAgIGlmIChjc3IwICYgSU5FQSkKKwkJcHJpbnRrKCIgSU5FQSIpOworCSAgICBpZiAoY3NyMCAmIFJYT04pCisJCXByaW50aygiIFJYT04iKTsKKwkgICAgaWYgKGNzcjAgJiBUWE9OKQorCQlwcmludGsoIiBUWE9OIik7CisJICAgIGlmIChjc3IwICYgVERNRCkKKwkJcHJpbnRrKCIgVERNRCIpOworCSAgICBpZiAoY3NyMCAmIFNUT1ApCisJCXByaW50aygiIFNUT1AiKTsKKwkgICAgaWYgKGNzcjAgJiBTVFJUKQorCQlwcmludGsoIiBTVFJUIik7CisJICAgIGlmIChjc3IwICYgSU5JVCkKKwkJcHJpbnRrKCIgSU5JVCIpOworCSAgICBpZiAoY3NyMCAmIEVSUikKKwkJcHJpbnRrKCIgRVJSIik7CisJICAgIGlmIChjc3IwICYgQkFCTCkKKwkJcHJpbnRrKCIgQkFCTCIpOworCSAgICBpZiAoY3NyMCAmIENFUlIpCisJCXByaW50aygiIENFUlIiKTsKKwkgICAgaWYgKGNzcjAgJiBNSVNTKQorCQlwcmludGsoIiBNSVNTIik7CisJICAgIGlmIChjc3IwICYgTUVSUikKKwkJcHJpbnRrKCIgTUVSUiIpOworCSAgICBpZiAoY3NyMCAmIFJJTlQpCisJCXByaW50aygiIFJJTlQiKTsKKwkgICAgaWYgKGNzcjAgJiBUSU5UKQorCQlwcmludGsoIiBUSU5UIik7CisJICAgIGlmIChjc3IwICYgSURPTikKKwkJcHJpbnRrKCIgSURPTiIpOworCSAgICBwcmludGsoIiBdXG4iKTsKKwl9CisjZW5kaWYKKworCWlmIChjc3IwICYgUklOVCkgewkvKiBSeCBpbnRlcnJ1cHQgKi8KKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIGFyaWFkbmVfcngoZGV2KTsKKwl9CisKKwlpZiAoY3NyMCAmIFRJTlQpIHsJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkgICAgaW50IGRpcnR5X3R4ID0gcHJpdi0+ZGlydHlfdHg7CisKKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIHdoaWxlIChkaXJ0eV90eCA8IHByaXYtPmN1cl90eCkgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHN0YXR1cyA9IGxvd2IocHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEpOworCisJCWlmIChzdGF0dXMgJiBURl9PV04pCisJCSAgICBicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCXByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxICY9IDB4ZmYwMDsKKworCQlpZiAoc3RhdHVzICYgVEZfRVJSKSB7CisJCSAgICAvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJICAgIGludCBlcnJfc3RhdHVzID0gcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDM7CisJCSAgICBwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfUlRSWSkKKwkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX0xDQVIpCisJCQlwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9MQ09MKQorCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9VRkxPKSB7CisJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkvKiBSZW1vdmUgdGhpcyB2ZXJib3NpdHkgbGF0ZXIhICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBGSUZPIGVycm9yISBTdGF0dXMgJTQuNHguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgY3NyMCk7CisJCQkvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworCQkJbGFuY2UtPlJEUCA9IFNUUlQ7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBpZiAoc3RhdHVzICYgKFRGX01PUkV8VEZfT05FKSkKKwkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJICAgIHByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQlkaXJ0eV90eCsrOworCSAgICB9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCSAgICBpZiAocHJpdi0+Y3VyX3R4IC0gZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCAiCisJCSAgICAgICAiZnVsbD0lZC5cbiIsIGRpcnR5X3R4LCBwcml2LT5jdXJfdHgsIHByaXYtPnR4X2Z1bGwpOworCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJICAgIH0KKyNlbmRpZgorCisJICAgIGlmIChwcml2LT50eF9mdWxsICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQlkaXJ0eV90eCA+IHByaXYtPmN1cl90eCAtIFRYX1JJTkdfU0laRSArIDIpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwuICovCisJCXByaXYtPnR4X2Z1bGwgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJICAgIH0KKworCSAgICBwcml2LT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCX0KKworCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KKwlpZiAoY3NyMCAmIEJBQkwpIHsKKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIHByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwkvKiBUeCBiYWJibGUuICovCisJfQorCWlmIChjc3IwICYgTUlTUykgeworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCX0KKwlpZiAoY3NyMCAmIE1FUlIpIHsKKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICIKKwkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBjc3IwKTsKKwkgICAgLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkgICAgbGFuY2UtPlJEUCA9IFNUUlQ7CisJfQorICAgIH0KKworICAgIC8qIENsZWFyIGFueSBvdGhlciBpbnRlcnJ1cHQsIGFuZCBzZXQgaW50ZXJydXB0IGVuYWJsZS4gKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBJTkVBfEJBQkx8Q0VSUnxNSVNTfE1FUlJ8SURPTjsKKworI2lmIDAKKyAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgY3NyJWQ9JSM0LjR4LlxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBsYW5jZS0+UkFQLCBsYW5jZS0+UkRQKTsKKyNlbmRpZgorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyB2b2lkIGFyaWFkbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKworICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU0LjR4LCByZXNldHRpbmcuXG4iLAorCSAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7CisgICAgYXJpYWRuZV9yZXNldChkZXYpOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgZW50cnk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgbGVuID0gc2tiLT5sZW47CisKKyNpZiAwCisgICAgaWYgKGFyaWFkbmVfZGVidWcgPiAzKSB7CisJbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogYXJpYWRuZV9zdGFydF94bWl0KCkgY2FsbGVkLCBjc3IwICU0LjR4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKKwlsYW5jZS0+UkRQID0gMHgwMDAwOworICAgIH0KKyNlbmRpZgorCisgICAgLyogRklYTUU6IGlzIHRoZSA3OUM5NjAgbmV3IGVub3VnaCB0byBkbyBpdHMgb3duIHBhZGRpbmcgcmlnaHQgPyAqLworICAgIGlmIChza2ItPmxlbiA8IEVUSF9aTEVOKQorICAgIHsKKyAgICAJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworICAgIAlpZiAoc2tiID09IE5VTEwpCisgICAgCSAgICByZXR1cm4gMDsKKyAgICAJbGVuID0gRVRIX1pMRU47CisgICAgfQorCisgICAgLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKworI2lmIDAKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiVFggcGt0IHR5cGUgMHglMDR4IGZyb20gIiwgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSk7CisgICAgeworCWludCBpOworCXVfY2hhciAqcHRyID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOworICAgIH0KKyAgICBwcmludGsoIiB0byAiKTsKKyAgICB7CisJaW50IGk7CisJdV9jaGFyICpwdHIgPSAodV9jaGFyICopc2tiLT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CisgICAgfQorICAgIHByaW50aygiIGRhdGEgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4pOworI2VuZGlmCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKyAgICBlbnRyeSA9IHByaXYtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworICAgIC8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBiYXNlIGFkZHJlc3Mgd2l0aAorCQl0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLworCisgICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDIgPSBzd2FwdygodV9zaG9ydCktc2tiLT5sZW4pOworICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzID0gMHgwMDAwOworICAgIG1lbWNweXcocHJpdi0+dHhfYnVmZltlbnRyeV0sICh1X3Nob3J0ICopc2tiLT5kYXRhLCBsZW4pOworCisjaWYgMAorICAgIHsKKwlpbnQgaSwgbGVuOworCisJbGVuID0gc2tiLT5sZW4gPiA2NCA/IDY0IDogc2tiLT5sZW47CisJbGVuID4+PSAxOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkgeworCSAgICBpbnQgajsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwNHg6IiwgaSk7CisJICAgIGZvciAoaiA9IDA7IChqIDwgOCkgJiYgKChpK2opIDwgbGVuKTsgaisrKSB7CisJCWlmICghKGogJiAxKSkKKwkJICAgIHByaW50aygiICIpOworCQlwcmludGsoIiUwNHgiLCBwcml2LT50eF9idWZmW2VudHJ5XVtpK2pdKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEgPSAocHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEmMHhmZjAwKXxURl9PV058VEZfU1RQfFRGX0VOUDsKKworICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAgIHByaXYtPmN1cl90eCsrOworICAgIGlmICgocHJpdi0+Y3VyX3R4ID49IFRYX1JJTkdfU0laRSkgJiYgKHByaXYtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkpIHsKKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiKioqIFN1YnRyYWN0aW5nIFRYX1JJTkdfU0laRSBmcm9tIGN1cl90eCAoJWQpIGFuZCAiCisJICAgICAgICJkaXJ0eV90eCAoJWQpXG4iLCBwcml2LT5jdXJfdHgsIHByaXYtPmRpcnR5X3R4KTsKKyNlbmRpZgorCisJcHJpdi0+Y3VyX3R4IC09IFRYX1JJTkdfU0laRTsKKwlwcml2LT5kaXJ0eV90eCAtPSBUWF9SSU5HX1NJWkU7CisgICAgfQorCisgICAgLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IElORUF8VERNRDsKKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisgICAgaWYgKGxvd2IocHJpdi0+dHhfcmluZ1soZW50cnkrMSkgJSBUWF9SSU5HX1NJWkVdLT5UTUQxKSAhPSAwKSB7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXByaXYtPnR4X2Z1bGwgPSAxOworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgZW50cnkgPSBwcml2LT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisgICAgaW50IGk7CisKKyAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworICAgIHdoaWxlICghKGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpICYgUkZfT1dOKSkgeworCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKTsKKworCWlmIChzdGF0dXMgIT0gKFJGX1NUUHxSRl9FTlApKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkgICAgLyogVGhlcmUgaXMgYSB0cmlja3kgZXJyb3Igbm90ZWQgYnkgSm9obiBNdXJwaHksCisJCTxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCBmdWxsLXNpemVkCisJCWJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KKwkJYnVmZmVycywgd2l0aCBvbmx5IHRoZSBsYXN0IGNvcnJlY3RseSBub3RpbmcgdGhlIGVycm9yLiAqLworCSAgICBpZiAoc3RhdHVzICYgUkZfRU5QKQorCQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LiovCisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgUkZfRlJBTSkKKwkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBSRl9PRkxPKQorCQlwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgUkZfQ1JDKQorCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBSRl9CVUZGKQorCQlwcml2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCSAgICBwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSAmPSAweGZmMDB8UkZfU1RQfFJGX0VOUDsKKwl9IGVsc2UgeworCSAgICAvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0zLiAqLworCSAgICBzaG9ydCBwa3RfbGVuID0gc3dhcHcocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDMpOworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkgICAgaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCSAgICBpZiAobG93Yihwcml2LT5yeF9yaW5nWyhlbnRyeStpKSAlIFJYX1JJTkdfU0laRV0tPlJNRDEpICYgUkZfT1dOKQorCQkJYnJlYWs7CisKKwkJaWYgKGkgPiBSWF9SSU5HX1NJWkUtMikgeworCQkgICAgcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOworCQkgICAgcHJpdi0+Y3VyX3J4Kys7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKworCisJICAgIHNrYi0+ZGV2ID0gZGV2OworCSAgICBza2JfcmVzZXJ2ZShza2IsMik7CQkvKiAxNiBieXRlIGFsaWduICovCisJICAgIHNrYl9wdXQoc2tiLHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KKwkgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsIChjaGFyICopcHJpdi0+cnhfYnVmZltlbnRyeV0sIHBrdF9sZW4sMCk7CisJICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisjaWYgMAorCSAgICBwcmludGsoS0VSTl9ERUJVRyAiUlggcGt0IHR5cGUgMHglMDR4IGZyb20gIiwKKwkJICAgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSk7CisJICAgIHsKKwkJaW50IGk7CisJCXVfY2hhciAqcHRyID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CisJICAgIH0KKwkgICAgcHJpbnRrKCIgdG8gIik7CisJICAgIHsKKwkJaW50IGk7CisJCXVfY2hhciAqcHRyID0gKHVfY2hhciAqKXNrYi0+ZGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CisJICAgIH0KKwkgICAgcHJpbnRrKCIgZGF0YSAweCUwOHggbGVuICVkXG4iLCAoaW50KXNrYi0+ZGF0YSwgKGludClza2ItPmxlbik7CisjZW5kaWYKKworCSAgICBuZXRpZl9yeChza2IpOworCSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSAgICBwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJICAgIHByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJfQorCisJcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOworCWVudHJ5ID0gKCsrcHJpdi0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKyAgICB9CisKKyAgICBwcml2LT5jdXJfcnggPSBwcml2LT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisKKyAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhhdCBhdCBsZWFzdCB0d28gcmluZyBlbnRyaWVzIGFyZSBmcmVlLgkgSWYgbm90LAorICAgICAgIHdlIHNob3VsZCBmcmVlIG9uZSBhbmQgbWFyayBzdGF0cy0+cnhfZHJvcHBlZCsrLiAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmlhZG5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKyAgICBzaG9ydCBzYXZlZF9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgc2F2ZWRfYWRkciA9IGxhbmNlLT5SQVA7CisgICAgbGFuY2UtPlJBUCA9IENTUjExMjsJCS8qIE1pc3NlZCBGcmFtZSBDb3VudCAqLworICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKKyAgICBsYW5jZS0+UkFQID0gc2F2ZWRfYWRkcjsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICAgbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwlyZXR1cm47CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAvKiBXZSB0YWtlIHRoZSBzaW1wbGUgd2F5IG91dCBhbmQgYWx3YXlzIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBTVE9QOwkJCS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLiAqLworICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJLyogTG9nIGFueSBuZXQgdGFwcy4gKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwlsYW5jZS0+UkFQID0gQ1NSMTU7CQkvKiBNb2RlIFJlZ2lzdGVyICovCisJbGFuY2UtPlJEUCA9IFBST007CQkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworICAgIH0gZWxzZSB7CisJc2hvcnQgbXVsdGljYXN0X3RhYmxlWzRdOworCWludCBudW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OworCWludCBpOworCS8qIFdlIGRvbid0IHVzZSB0aGUgbXVsdGljYXN0IHRhYmxlLCBidXQgcmVseSBvbiB1cHBlci1sYXllciBmaWx0ZXJpbmcuICovCisJbWVtc2V0KG11bHRpY2FzdF90YWJsZSwgKG51bV9hZGRycyA9PSAwKSA/IDAgOiAtMSwKKwkgICAgICAgc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkgICAgbGFuY2UtPlJBUCA9IENTUjgrKGk8PDgpOwkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyICovCisJICAgIGxhbmNlLT5SRFAgPSBzd2FwdyhtdWx0aWNhc3RfdGFibGVbaV0pOworCX0KKwlsYW5jZS0+UkFQID0gQ1NSMTU7CQkvKiBNb2RlIFJlZ2lzdGVyICovCisJbGFuY2UtPlJEUCA9IDB4MDAwMDsJCS8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICB9CisKKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gSU5FQXxTVFJUfElET047CS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiAqLworCisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhcmlhZG5lX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gem9ycm9fZ2V0X2RydmRhdGEoeik7CisKKyAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCkpOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+bWVtX3N0YXJ0KSwgQVJJQURORV9SQU1fU0laRSk7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXJpYWRuZV9pbml0X21vZHVsZSh2b2lkKQoreworICAgIHJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmYXJpYWRuZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJpYWRuZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIHpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZhcmlhZG5lX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFyaWFkbmVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXJpYWRuZV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsK